Kubernetes MySQL-Operator 설치하기

kocean·2024년 5월 27일

Overview

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

Source: MySQL Operator for Kubernetes Manual

참고 : [Kubernetes] MySQL Operator (링크)


Installation

MySQL Operator

Link : ArtifactHUB

오퍼레이터 자체는 특별한 설정 없이 배포한다. 참고로 기본 네임스페이스에는 배포되지 않는다.

MySQL InnoDB Cluster

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를 확인해보면 원하는 옵션을 넣을 수 있다.

Expose

외부에서 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

Bugs

내가 겪은 증상은 아니였으나, 디지털오션에서 설정시 프록시 프로토콜을 비활성해야 정상적으로 작동한다고 한다. Vultr에서는 기본적으로 꺼져있어 겪어보진 못했다.

설치되는 Ingress-controller에 따라 TCP-Service가 작동하지 않을 수 있다. 필자의 경우 bitnami가 관리하는 nginx-ingress-controller를 사용했는데 아무리 애플리케이션의 설정을 조정해도 TCP 데이터를 전혀 통과시킬 수 없었다. 문제는 bitnami의 차트로 ingress-nignx-controller가 집적 배포하는 헬름 차트로 변경하고 난 뒤 정상적으로 TCP 통신이 가능했다.

profile
MODE PUSH MODE PUSH

0개의 댓글