MySQL Operator는 쿠버네티스 클러스터에서 작동하는 MySQL 운영 시스템입니다. MySQL-InnoDB 클러스터와 작동하며 자동으로 Master-Slave 관계를 구축해주며 Router을 이용한 로드밸런싱 이외에도 다양한 기능을 지원합니다.

Source: MySQL Operator for Kubernetes Manual
참고 : [Kubernetes] MySQL Operator (링크)
Link : ArtifactHUB
오퍼레이터 자체는 특별한 설정 없이 배포한다. 참고로 기본 네임스페이스에는 배포되지 않는다.
helm으로 설치할 수 도 있으나 필자의 환경에서는 설치가 되지 않아 kubectl을 이용해 직접 설정을 적용했다.
# Copyright (c) 2020, 2022, Oracle and/or its affiliates.
#
# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/
#
# This sample creates a simple InnoDB Cluster. It's similar to sample-cluster.yaml
# but also defines storage requirements for a PersistentVolumeClaim (PVC) set
# as the data directory for MySQL Servers.
# Additional options, like selecting a storage class, can be added.
#
apiVersion: mysql.oracle.com/v2
kind: InnoDBCluster
metadata:
name: idc-with-custom-config
spec:
secretName: mypwds
instances: 3
router:
instances: 1
tlsUseSelfSigned: true
datadirVolumeClaimTemplate:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 300Gi
mypwds라는 시크릿을 이용해 PVC를 볼륨으로 사용하는 데이터베이스 설치 예제이다. s3에서 데이터를 가져올 수도, 백업 환경을 설정할 수도 있고 기존의 pvc 볼륨을 마운트하여 설정하는 것도 가능하다.
설치에는 대략 5~10분정도 소요되고, mysql-router Pod가 실행되면 설치가 거의 완료된 것이다. 이후에는 내부에서 6446(R/W), 6447(R/O) 포트를 통해 라우터로 접근이 가능하다.
이후 추가적인 설정이 필요한 경우 메뉴얼의 커스텀 리소스나 헬름차트의 values를 확인해보면 원하는 옵션을 넣을 수 있다.
외부에서 MySQL 클러스터에 접근하기 위해서는 쿠버네티스 클러스터에 6446 포트로 접근할 수 있어야 한다. 일시적으로 접근하기 위해서는 포트포워딩을 해도 되지만 지속적으로 외부에서 사용하기 위해서 포트를 개방하기로 했다.
NodePort를 이용해 개방할 수도 있지만 이미 로드밸런서를 사용중이기 때문에 로드밸런서를 통해 Ingress로 접속 할 수 있도록 한다. 다만 Ingress는 L7 레이어에서 통신하는데에 비해 MySQL은 L4 TCP 레이어을 사용함으로 추가적인 설정이 있어야 이용 가능하다.
Source: Medium(link)
이미 nginx-ingress-controller가 설치되어 있다면 Deployment를 수정하여 TCP-Service를 이용할 수 있도록 한다.
kubectl edit deployment ingress-nginx-controller -n ingress-nginx
--tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
--udp-services-configmap=$(POD_NAMESPACE)/udp-services #사용시에만
spec.args 에 위 플래그를 추가한다.
apiVersion: v1
kind: ConfigMap
metadata:
name: tcp-services
namespace: ingress-nginx
data:
6446: "mysql-operator/<cluster-name>:6446"
ConfigMap을 ingress-nginx와 같은 Namespace에 배포하면 자동으로 로드한다.
Source: Medium
내가 겪은 증상은 아니였으나, 디지털오션에서 설정시 프록시 프로토콜을 비활성해야 정상적으로 작동한다고 한다. Vultr에서는 기본적으로 꺼져있어 겪어보진 못했다.
설치되는 Ingress-controller에 따라 TCP-Service가 작동하지 않을 수 있다. 필자의 경우 bitnami가 관리하는 nginx-ingress-controller를 사용했는데 아무리 애플리케이션의 설정을 조정해도 TCP 데이터를 전혀 통과시킬 수 없었다. 문제는 bitnami의 차트로 ingress-nignx-controller가 집적 배포하는 헬름 차트로 변경하고 난 뒤 정상적으로 TCP 통신이 가능했다.