저번 글에서는 MySQL의 HA 구성요소인 innoDB 클러스터를 정리했다. 이 클러스터를 쿠버네티스 환경에서 원하는 상태를 유지하도록 어떻게 관리 할 수 있을까? 이를 위해 쿠버네티스 환경에서 innoDB 클러스터를 관리해주는 Operator를 제공한다. 이를 MySQL Operator for Kubernetes라고 한다.
참고: 계층 구조가 헷갈릴 수 있는데, 다시 정리하면 3개 이상의 MySQL을 묶어 innoDB 클러스터로 관리하고, 이 클러스터들을 Operator가 모니터링 하면서 관리한다.
여러 개의 innoDB 클러스터를 구성하고 이를 Operator가 관리 하면서 여러 장점을 가진다.
- 설정 및 유지 관리 전반 (클러스터 롤링 업그레이드, 그룹 복제 관리 포함)
- 스케일링
- 백업
Primary Cluster의 failover가 있다면, Primary MySQL이 변경될 수 있다. 이 경우 클러스터간의 비동기 복제에도 영향을 줄 수 있는데, 이 부분을 Operator가 모니터링 하여 변경사항을 반영 해준다. Cluster의 스케일링, DB의 백업 또한 쉽게 할 수 있다.
이 글에서는 MySQL Operator for Kubernetes, innoDB Cluster 설치까지 실습해보려고 한다.
[1] K8s 환경설정
가시다님이 공개해주신 쿠버네티스 실습 환경이다. Cloud Fomation으로 구성되어 있다. 쿠버네티스 환경에서 테스트를 할 때 환경설정이 필요한데, 한땀 한땀 구성 할 필요없이 빠르게 환경설정 할 수 있어 반복적인 작업을 덜 수 있다. (최고다!)
[2] Mysql innoDB Operater 설치
Mysql innoDB Cluster와 Operater는 Helm으로 쉽게 설치 할 수 있다.
※ helm은 쿠버네티스 패키지 매니저로 소프트웨어를 쿠버네티스에 한번에 설치 할 수 있다. helm 패키지도 YAML 로 구성되어 있고 이것을 chart라고 한다.
# helm Repo 추가
helm repo add **mysql-operator** <https://mysql.github.io/mysql-operator/>
helm repo update
# mysql-operator 설치
helm install **mysql-operator** mysql-operator/mysql-operator --namespace **mysql-operator** --create-namespace --version 2.0.4
# 설치 확인
kubectl get deploy,pod -n mysql-operator
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/mysql-operator 1/1 1 1 2m24s
NAME READY STATUS RESTARTS AGE
pod/mysql-operator-659ff68ccf-8f744 1/1 Running 0 2m24s
# CRD 확인
kubectl get crd | grep -v calico
NAME CREATED AT
clusterkopfpeerings.zalando.org 2022-06-12T09:34:06Z
innodbclusters.mysql.oracle.com 2022-06-12T09:34:06Z
kopfpeerings.zalando.org 2022-06-12T09:34:06Z
mysqlbackups.mysql.oracle.com 2022-06-12T09:34:06Z
[3] Mysql innoDB Cluster 설치
# root사용자로 암호는 sakila로 설정하여 클러스터를 배포한다. 버전은 2.0.4이다.
helm install **mycluster** mysql-operator/mysql-innodbcluster --set credentials.root.password='**sakila**' --set tls.useSelfSigned=**true** --namespace **mysql-cluster** --create-namespace --version 2.0.4
# 확인
**helm get values mycluster -n mysql-cluster**
USER-SUPPLIED VALUES:
credentials:
root:
password: sakila
tls:
useSelfSigned: true
# MySQL InnoDB Cluster 구성요소를 확인한다.
kubectl get **InnoDBCluster** -n mysql-cluster
NAME STATUS ONLINE INSTANCES ROUTERS AGE
mycluster ONLINE 3 3 1 4m58s
# 터미널을 하나 더 열어서 모니터링한다. 각 요소들이 올라오는 것을 확인할 수 있다.
watch kubectl get innodbcluster,sts,pod,pvc,svc -n mysql-cluster
Every 2.0s: kubectl get innodbcluster,sts,pod,pvc,svc -n mysql-cluster k8s-m: Sun Jun 12 18:49:02 2022
NAME STATUS ONLINE INSTANCES ROUTERS AGE
innodbcluster.mysql.oracle.com/mycluster ONLINE 3 3 1 8m43s
NAME READY AGE
statefulset.apps/mycluster 3/3 8m43s
NAME READY STATUS RESTARTS AGE
pod/mycluster-0 2/2 Running 0 8m43s
pod/mycluster-1 2/2 Running 0 8m43s
pod/mycluster-2 2/2 Running 0 8m43s
pod/mycluster-router-5f9758dc8f-dsfvx 1/1 Running 0 7m26s
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/datadir-mycluster-0 Bound pvc-ca9596b3-d387-49a9-8792-bb8bf29e1b6f 2Gi RWO local-path 8m43s
persistentvolumeclaim/datadir-mycluster-1 Bound pvc-20e1777c-588b-4fb3-891f-113e1ab94caa 2Gi RWO local-path 8m43s
persistentvolumeclaim/datadir-mycluster-2 Bound pvc-eec46eeb-86c0-4b71-8376-6596faf416ca 2Gi RWO local-path 8m43s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/mycluster ClusterIP 10.200.1.174 <none> 3306/TCP,33060/TCP,6446/TCP,6448/TCP,6447/TCP,6449/TCP 8m43s
service/mycluster-instances ClusterIP None <none> 3306/TCP,33060/TCP,33061/TCP 8m43s
마치며
구성해 놓은 데이터베이스를 관리해주는 Operator 개념은 마치 나 대신 일을 해주는 것 같아서 정말 획기적인 것 같다. 선언하여 구성하고, 선언한 구성을 유지해주는 이런 기능을 Helm으로 빠르게 구성할 수 있는 것에 한번 더 놀란다. 어려웠던 개념들이 동작하는 것들을 보면서 기능들 하나하나 테스트 해보고 싶어진다. 다음 포스팅에서는 Cluster를 관리하는 Operator의 기능들을 테스트 해보겠다.
'스터디' 카테고리의 다른 글
[DOIK] Cloud Native PostgreSQL Operator (0) | 2022.06.26 |
---|---|
[DOIK] MySQL Operator for k8s - 장애상황 테스트 (0) | 2022.06.25 |
[DOIK] MySQL innoDB 클러스터 (0) | 2022.06.12 |