[DOIK2] 쿠버네티스 오퍼레이터 @stackable

2023. 11. 26. 01:50DOIK@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 팀과 가시다님께 감사드립니다. 그리고 스터디 안내를 보고 머뭇거리던 저에게 적극 권유해주고 매주 격려와 용기를 주신 과장님 감사합니다.

 

스터디는 끝났지만 도전과제는 짬짬이 이어가보려 합니다