2023. 11. 26. 01:50ㆍDOIK@CloudNet
- cloudnet에서 주관하는 쿠버네티스 데이터베이스 오퍼레이터 스터디 2기 내용입니다
- 목적: 다양한 db 오퍼레이터 실습으로 eks 환경에서 db 배포 및 운영을 위한 다양한 db 오퍼레이터 실습
이번주에는 Kubernates 환경에서 Kafka를 배포하고 관련 내용을 조금 정리해 보았다.
0. Stackable이란?
- 오픈소스에서 다양한 데이터베이스 관련 애플리케이션을 한번에 사용할 수 있게 해주는 오퍼레이터. 지금까지 다룬 kafka-strimzi, Postgresql-CloudNativePG 등은 각 애플리케이션에만 특화된 오퍼레이터였으나 실무에서는 연결-연결-연결 해서 사용하는 경우가 많으니까 매우 유용할 것 같았다.
1. 실습
1-0. 실습 환경 배포
- 지금까지는 스터디 초기에 알려주신 원클릭 배포 파일을 사용해서 실습환경을 준비했으나 이번에는 실습환경에 약간의 변동사항이 있었다. 링크
- OS: Amazon Linux 2 -> Ubuntu 22.04 (stackable이 Amazon Linux에서는 설정이 어렵다고 하심)
- worker node: 인스턴스 타입 t2.medium -> c5.2xlarge
- batcat 툴 설치 추가: 기존 텍스트에디터로 사용하던 cat의 최신버전
1-1. stackable 배포 준비
# 배포 전 실습 환경 정보 확인
kubectl get node --label-columns=node.kubernates.io/instance-type
# 각 node IP를 변수로 저장해서 사용하기 쉽게 함
N1=$(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2a -o jsonpath={.items[0].status.addresses[0].address})
N2=$(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2b -o jsonpath={.items[0].status.addresses[0].address})
N3=$(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2c -o jsonpath={.items[0].status.addresses[0].address})
echo "export N1=$N1" >> /etc/profile
echo "export N2=$N2" >> /etc/profile
echo "export N3=$N3" >> /etc/profile
echo $N1, $N2, $N3
# eksctl host에서 노드에 접속 가능하게 룰 설정
NGSGID=$(aws ec2 describe-security-groups --filters Name=group-name,Values='*ng1*' --query "SecurityGroups[*].[GroupId]" --output text)
aws ec2 authorize-security-group-ingress --group-id $NGSGID --protocol '-1' --cidr 192.168.1.100/32
eks v.1.26.10으로 배포가 잘 되었음을 확인할 수 있다.
각 node에 private IP를 assign하고 파드에 접속 가능하도록 룰을 추가해 준다.
# loadbalancer 설치
helm repo add eks https://aws.github.io/eks-charts
helm install aws-load-balancer-controller eks/aws-load-balancer-controller -n kube-system --set clusterName=$CLUSTER_NAME \
--set serviceAccount.create=false --set serviceAccount.name=aws-load-balancer-controller
loadbalancer를 설치하기 위해 helm repo에서 eks chart를 가져오고, 현재 사용하고 있는 클러스터에서 새 serviceAccount를 생성하는 대신 현재 serviceAccount를 aws-load-balancer-controller로 이름을 바꿔서 설치한다.
# ebs gp3 storage class 생성 : 파일시스템 xfs
kubectl patch sc gp2 -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'
kubectl apply -f https://raw.githubusercontent.com/gasida/DOIK/main/1/gp3-sc-xfs.yaml
# efs storage class
cat <<EOT > efs-sc.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: efs-sc
provisioner: efs.csi.aws.com
parameters:
provisioningMode: efs-ap
fileSystemId: $EFS_ID
directoryPerms: "700"
EOT
kubectl apply -f efs-sc.yaml
데이터를 넣을 ebs gp3 스토리지 클래스와 efs 스토리지 클래스를 생성한다.
# 워커노드의 '#-nodegroup-ng1-remoteAccess' 보안 그룹에 자신의 집 공인IP 접속 허용 추가
NGSGID=$(aws ec2 describe-security-groups --filters Name=group-name,Values='*ng1*' --query "SecurityGroups[*].[GroupId]" --output text)
aws ec2 authorize-security-group-ingress --group-id $NGSGID --protocol '-1' --cidr $(curl -s ipinfo.io/ip)/32
eksctl host에서 접속을 허용한 것과 마찬가지로 stackable endpoint에 집 pc에서 접속이 가능하도록 보안그룹에 현재 ssh로 접속한 ip를 추가해준다.
1-2. stackable 배포
# stackablectl download
curl -L -o stackablectl https://github.com/stackabletech/stackable-cockpit/releases/download/stackablectl-1.0.0-rc3/stackablectl-x86_64-unknown-linux-gnu
#allow execution of stackablectl
chmod +x stackablectl
mv stackablectl /usr/local/bin
stackablectl -h
stackablectl -V
# 자동완성 추가
wget https://raw.githubusercontent.com/stackabletech/stackable-cockpit/main/extra/completions/stackablectl.bash
mv stackablectl.bash /etc/bash_completion.d/
stackable ver 1.0.0이 잘 배포되었음을 확인할 수 있다. chmod -x는 ~~에게 실행권한을 준다는 뜻.
# 제공 오퍼레이터
stackablectl operator list
# 제공 스택
stackablectl stack list
# 제공 데모 : Stackable release 설치 > 스택 구성 > 데이터 구성
stackablectl demo list
위와 같이 다양한 버전과 종류의 오퍼레이터, 스택, 그리고 데모를 제공한다. 우리는 trino-taxi-data를 이용해서 데모를 해 보려 한다. 아래와 같은 구조로 구성되어 있다.
각각에 대한 짧은 설명을 덧붙이면
- MinIO: S3 스토리지를 사용하는 object store로 데이터를 저장하는데 사용.
- Hive metastore: apache Hive와 관련된 메타데이터(여기서는 Trino)를 저장하는 데 사용.
- Trino: 이번에 사용할 sql query engine으로 분산처리를 지원함.
- Superset: 데이터 검색 및 시각화 플랫폼으로, Trino로 처리한 쿼리 결과로 대시보드를 구성함.
- Open Policy Agent(OPA): 스택 내 접속 권한 설정 총괄
# trino-taxi-data 설명
stackablectl demo describe trino-taxi-data
# 다운로드 받기(8분 소요!)
stackablectl demo install trino-taxi-data
1-3. trino-taxi-data 데모
trino-taxi-data에 대한 간단한 설명이다.
install을 하면 ~~not ready 가 계속 나오는데 그러다 성공하니까 너무 걱정하지 말자.
그리고 설정
kubectl get-all -n default
kubectl get deploy,sts,pod
kubectl get job
kubectl get job load-ny-taxi-data -o yaml | kubectl neat | cat -l yaml
kubectl get job create-ny-taxi-data-table-in-trino -o yaml | kubectl neat | cat -l yaml
kubectl get job setup-superset -o yaml | kubectl neat | cat -l yaml
kubectl get job superset -o yaml | kubectl neat | cat -l yaml
kubectl get sc,pvc,pv
kubectl get pv |grep gp3
kubectl get sc secrets.stackable.tech -o yaml | kubectl neat | cat -l yaml
kubectl df-pv
kubectl get svc,ep,endpointslices
kubectl get cm,secret
kubectl get cm minio -o yaml | kubectl neat | cat -l yaml
kubectl describe cm minio
kubectl get cm hive-metastore-default -o yaml | kubectl neat | cat -l yaml
kubectl get cm hive -o yaml | kubectl neat | cat -l yaml
kubectl get cm postgresql-hive-extended-configuration -o yaml | kubectl neat | cat -l yaml
kubectl get cm trino-coordinator-default -o yaml | kubectl neat | cat -l yaml
kubectl get cm trino-coordinator-default-catalog -o yaml | kubectl neat | cat -l yaml
kubectl get cm trino-worker-default -o yaml | kubectl neat | cat -l yaml
kubectl get cm trino-worker-default-catalog -o yaml | kubectl neat | cat -l yaml
kubectl get cm create-ny-taxi-data-table-in-trino-script -o yaml | kubectl neat | cat -l yaml
kubectl get cm superset-node-default -o yaml | kubectl neat | cat -l yaml
kubectl get cm superset-init-db -o yaml | kubectl neat | cat -l yaml
kubectl get cm setup-superset-script -o yaml | kubectl neat | cat -l yaml
kubectl get secret minio -o yaml | kubectl neat | cat -l yaml
kubectl get secret minio-s3-credentials -o yaml | kubectl neat | cat -l yaml
kubectl get secret postgresql-hive -o yaml | kubectl neat | cat -l yaml
kubectl get secret postgresql-superset -o yaml | kubectl neat | cat -l yaml
kubectl get secret trino-users -o yaml | kubectl neat | cat -l yaml
kubectl get secret trino-internal-secret -o yaml | kubectl neat | cat -l yaml
kubectl get secret superset-credentials -o yaml | kubectl neat | cat -l yaml
kubectl get secret superset-mapbox-api-key -o yaml | kubectl neat | cat -l yaml
kubectl get crd | grep stackable
kubectl explain trinoclusters
kubectl describe trinoclusters.trino.stackable.tech
kubectl get hivecluster,opacluster,s3connection
kubectl get supersetcluster,supersetdb
kubectl get trinocluster,trinocatalog
kubectl get hivecluster -o yaml | kubectl neat | cat -l yaml
kubectl get s3connection -o yaml | kubectl neat | cat -l yaml
kubectl get supersetcluster -o yaml | kubectl neat | cat -l yaml
kubectl get supersetdb -o yaml | kubectl neat | cat -l yaml
kubectl get trinocluster -o yaml | kubectl neat | cat -l yaml
kubectl get trinocatalog -o yaml | kubectl neat | cat -l yaml
- 그리고 서비스에 접속하기 위해 stackable에 설치된 product의 endpoint를 확인한다.
stackablectl stacklet list
여기서 list된 endpoint로 접속하면 trino, minIO 등에 접속할 수 있다.
superset에서 쿼리 실행 -> trino에서 분산 처리 하는 구조로 실행된다.
감사합니다!
6주간 알찬 내용으로 DB 오퍼레이터에 대한 내용을 정말 압축적으로 잘 전달해주신 cloudnet 팀과 가시다님께 감사드립니다. 그리고 스터디 안내를 보고 머뭇거리던 저에게 적극 권유해주고 매주 격려와 용기를 주신 과장님 감사합니다.
스터디는 끝났지만 도전과제는 짬짬이 이어가보려 합니다
'DOIK@CloudNet' 카테고리의 다른 글
[DOIK2] 쿠버네티스 오퍼레이터 @Kafka (0) | 2023.11.19 |
---|---|
[DOIK2] 쿠버네티스 오퍼레이터 @MongoDB (1) | 2023.11.12 |
[DOIK2] 쿠버네티스 오퍼레이터 @PostgreSQL (0) | 2023.11.05 |
[DOIK2] 쿠버네티스 오퍼레이터 @MySQL (1) | 2023.10.29 |
[DOIK2] 쿠버네티스 배포 및 기초 지식 (0) | 2023.10.22 |