IT/Container&k8s

[k8s] Operator & MySQL Operator

Hayley Shim 2023. 10. 29. 00:25

안녕하세요. 최근 Database Operator In Kubernetes study(=DOIK)를 진행하며 해당 내용을 보다 깊이 이해하고 공유하기 위해 작성한 글입니다.

Prerequisites

  • k8s에 대한 지식 : 초급-중급자 분들은 인프런 김태민님의 ‘대세는 쿠버네티스’ 강의를 통해 개념 이해 및 실습을 해볼 수 있고 좀 더 deep dive하게 살펴보기 위해서는 k8s 공식 홈페이지를 추천합니다.
  • 새로운 지식에 대한 호기심과 열정 : k8s의 주요 리소스 외에도 다양한 component, operator 들로 구성된 k8s 생태계를 익히려면 끊임없는 호기심과 지치지않는 열정은 default option입니다. 다같이 즐겁게 화이팅!!!

Operator란?

  • k8s 공식 문서에 따르면 쿠버네티스 확장(Extending Kubernetes)은 쿠버네티스 클러스터를 사용자가 정의하는 방식으로 크게 flags, local configuration files, API resources 변경만 포함하는 구성과 추가 프로그램이나 서비스 실행과 관련된 extensions으로 나눌 수 있습니다. 그 중 extensions은 쿠버네티스를 확장하고 쿠버네티스와 통합되는 소프트웨어 컴포넌트를 말합니다.
  • 이때 사용자 정의 리소스(CRD : Custom Resource Definition) API와 커스텀 컨트롤 루프(Custom Controller Loop)의 조합을 오퍼레이터 패턴이라고 합니다. 오퍼레이터 패턴은 특정 애플리케이션, 일반적으로 스테이트풀(stateful) 애플리케이션을 관리하는 데 사용됩니다.

Kuberentes의 동작 흐름[참고}

Operator의 동작 흐름[참고]

위 그림을 통해 사용자 정의 리소스(CRD : Custom Resource Definition) API와 커스텀 컨트롤 루프(Custom Controller Loop)의 조합이 무엇을 의미하는지 알 수 있습니다.

쿠버네티스의 오퍼레이터 패턴 개념을 통해 쿠버네티스 코드 자체를 수정하지 않고도 컨트롤러를 하나 이상의 사용자 정의 리소스(custom resource)에 연결하여 클러스터의 동작을 확장할 수 있습니다. 오퍼레이터 사용자 정의 리소스의 컨트롤러 역할을 하는 쿠버네티스 API의 클라이언트입니다.

MySQL Operator for Kubernetes 란?

최근 MySQL 개발팀은 MySQL 8.0.29 릴리스와 함께 새로운 Kubernetes용 MySQL Operator가 GA(General Availability) 되었음을 발표했습니다.

Kubernetes용 MySQL Operator는 Kubernetes 클러스터 내에서 MySQL InnoDB 클러스터 설정을 관리하기 위한 Operator입니다. 업그레이드 및 백업 자동화를 포함하는 설정 및 유지 관리를 통해 전체 수명 주기를 관리합니다.

Kubernetes용 MySQL Operator[참고]

MySQL InnoDB 클러스터는 MySQL을 위한 완전한 고가용성 솔루션을 제공합니다. MySQL Shell 에 포함된 AdminAPI를 사용 하면 InnoDB 클러스터로 작동하도록 최소 3개의 MySQL 서버 인스턴스 그룹을 쉽게 구성하고 관리할 수 있습니다. MySQL 라우터 는 배포한 클러스터에 따라 자동으로 구성되어 클라이언트 애플리케이션을 서버 인스턴스에 투명하게 연결할 수 있습니다. 서버 인스턴스에 예기치 않은 장애가 발생하면 클러스터가 자동으로 재구성됩니다.

InnoDB Cluster 개요[참고]

MySQL Operator for Kubernetes 설치

MySQL Operator 설치방법으로 Helm Chart를 이용한 방법을 설명합니다. 홈페이지에 Manifest Files을 이용한 방법도 나와있으니 참고해보세요.

$> helm repo add mysql-operator https://mysql.github.io/mysql-operator/
$> helm repo update
$> helm install my-mysql-operator mysql-operator/mysql-operator \
   --namespace mysql-operator --create-namespace

마찬가지로 Innodb Cluster 도 helm Chart를 이용하여 설치합니다.

$> helm install mycluster mysql-operator/mysql-innodbcluster --set credentials.root.password='sakila' --set tls.useSelfSigned=true --namespace mysql-cluster --create-namespace

MySQL Operator가 제대로 배포되었는지 확인합니다.

$> kubectl get deployment mysql-operator -n mysql-operator

mysql-operator 확인

현재 MySQL InnoDB Cluster 정보를 확인합니다.

$> kubectl get innodbclusters -n mysql-cluster

MySQL Router 설정

MySQL Router 접속을 위한 서비스 정보를 확인합니다.

#mariadb-client 설치
$> apt install mariadb-client -y#접속 주소 변수 지정
$> MYSQLIP=$(kubectl get svc -n mysql-cluster mycluster -o jsonpath={.spec.clusterIP})#마스터노드 자체에서 MySQL 라우터 접속
$> mysql -h $MYSQLIP -uroot -psakila -e "SELECT @@hostname;SELECT @@max_connections;"$> kubectl get svc -n mysql-cluster mycluster

MySQL 서버(파드) 접속을 위한 서비스 정보를 확인합니다.

  • headless 서비스 : 쿠버네티스 서비스 생성 시 .spec.clusterIP 필드 값을 None으로 설정하면 클러스터 IP가 없는 서비스를 만들 수 있습니다. 이런 서비스를 ‘헤드리스 서비스(Headless Service)’라고 합니다.
$> kubectl get svc -n mysql-cluster mycluster-instances
$> kubectl get pod -n mysql-cluster -l app.kubernetes.io/component=database -owide

MySQL Shell 연결

특정 Pod를 troubleshooting해야하는 경우 MySQL InnoDB 클러스터를 관리하기 위해 MySQL Shell로 새 컨테이너를 생성합니다.

$> kubectl run --rm -it myshell --image=mysql/mysql-operator -- mysqlsh root@mycluster --sql
If you don't see a command prompt, try pressing enter.
******MySQL mycluster SQL>

MySQL Shell 인터페이스 내에서 InnoDB 클러스터에 연결합니다.

MySQL JS>  \connect root@myclusterCreating a session to 'root@mycluster'
Please provide the password for 'root@mycluster': ******MySQL mycluster JS>

Scale Test

MySQL 서버 파드(인스턴스)와 라우터 파드를 증가하거나 감소시켜보겠습니다.

  • MySQL 서버 파드(인스턴스) 추가
# 현재 MySQL InnoDB Cluster 정보 확인 : 서버파드(인스턴스)는 3대, 라우터파드(인스턴스)는 1대 
$> kubectl get innodbclusters -n mysql-cluster# MySQL 서버 파드(인스턴스) 2대 추가 : 기본값(serverInstances: 3, routerInstances: 1)
$> helm upgrade mycluster mysql-operator/mysql-innodbcluster --reuse-values --set serverInstances=5 --namespace mysql-cluster# 확인 
$> kubectl get innodbclusters -n mysql-cluster 
$> kubectl get pod -n mysql-cluster -l app.kubernetes.io/component=database
  • MySQL 서버 파드(인스턴스) 감소
# MySQL 서버 파드(인스턴스) 1대 삭제 : 스테이트풀셋이므로 마지막에 생성된 서버 파드(인스턴스)가 삭제됨 
$> helm upgrade mycluster mysql-operator/mysql-innodbcluster --reuse-values --set serverInstances=4 --namespace mysql-cluster# MySQL 라우터 파드 3대로 증가  
$> helm upgrade mycluster mysql-operator/mysql-innodbcluster --reuse-values --set routerInstances=3 --namespace mysql-cluster# MySQL 라우터 파드 1대로 축소 
$> helm upgrade mycluster mysql-operator/mysql-innodbcluster --reuse-values --set routerInstances=1 --namespace mysql-cluster
# 확인
$> kubectl get innodbclusters -n mysql-cluster 
$> kubectl get pod -n mysql-cluster -l app.kubernetes.io/component=router

MySQL Backup

MySQL backup 설정 정보를 확인하고 백업을 진행해보겠습니다.

MySQL InnoDB Cluster 에 backup 설정을 추가합니다.

 
# backup 관련 설정 정보 확인 : 5분 마다 백업 실행(스케줄)
$> kubectl describe innodbcluster -n mysql-cluster | grep Spec: -A12
# 백업 작업 정보 확인 : 최소 5분 이후에 결과 확인
$> kubectl get mysqlbackup -n mysql-cluster
# 백업 작업 정보 확인 
$> kubectl get mysqlbackup -n mysql-cluster# 크론잡 cronjobs 확인 : backup 설정 시 자동으로 크론잡 설정됨 
$> kubectl get cronjobs -n mysql-cluster# 잡 확인 : 실제로 수행 기록 확인 
$> kubectl get jobs -n mysql-cluster# 백업으로 사용되는 PVC 확인 : 백업 수행 전까지는 Pending 상태였다가 한번이라도 실행 시 Bound 로 변경됨 
$> kubectl get pvc -n mysql-cluster backup-pvc# 백업으로 사용되는 PVC 가 실제 저장되는 노드 확인 
$> kubectl describe pvc -n mysql-cluster backup-pvc | grep selected-node

Summary

쿠버네티스의 오퍼레이터 개념을 알아보고 마스터 노드에 직접 MySQL 오퍼레이터를 설치해보며 간단한 backup, Scale 테스트를 진행해봤습니다. 이번 스터디를 통해 쿠버네티스 환경에 데이터베이스 파드를 배포해보며 어떻게 MySQL 오퍼레이터가 동작하는지 전체 흐름을 이해할 수 있었습니다.

데이터베이스를 쿠버네티스 파드로 운영하기 위해서는 비휘발성, 고정 IP 주소, DB 접근 통제, Affinity 등 고려할 사항이 많지만 이 글이 쿠버네티스 환경 내 데이터베이스 오퍼레이터 이해에 도움이 되길 바랍니다. 끝으로 스터디 진행해주신 Cloudnet팀 감사합니다:)

 

 

 

blog migration project

written in 2022.6.6

https://medium.com/techblog-hayleyshim/k8s-db-%EC%98%A4%ED%8D%BC%EB%A0%88%EC%9D%B4%ED%84%B0-mysql-%EC%98%A4%ED%8D%BC%EB%A0%88%EC%9D%B4%ED%84%B0-a949f91e8df9