はじめに #
今回はHelmを使ってMySQL InnoDB Clusterをカスタマイズする方法を紹介します。
1.公式のHelm Chart #
MySQL InnoDB Clusterで設定できるパラメーターは、公式docに載っています。従ってここで変更すべきパラメーターをcheckしてHelmに反映していくという流れになります。
しかし公式のHelm Chartのvalues.yaml
では全てのパラメーターの変更に対応していないので、Helm Chartをcloneしてtemplate自体を自分でカスタマイズしていく必要があります。
2. RouterのSerivceを変更 #
目的
過去に紹介したように、MySQL Routerに接続するServiceは、ClusterIP
のみで、外部から接続できなかったり、
$ kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 222d
service/mycluster ClusterIP 10.104.161.97 <none> 3306/TCP,33060/TCP,6446/TCP,6448/TCP,6447/TCP,6449/TCP,6450/TCP,8443/TCP 5m59s
service/mycluster-instances ClusterIP None <none> 3306/TCP,33060/TCP,33061/TCP
defaultの:3306
はMySQL Routerの:6446
(mysql-rw)に転送されるので、RW Splitが使えなかったりとちょっと不便な点がありました。
$ kubectl describe service mysql-cluster
IP: 10.96.237.122
IPs: 10.96.237.122
Port: mysql 3306/TCP
TargetPort: 6446/TCP
NodePort: mysql 31117/TCP
Endpoints: 192.168.2.52:6446
Port: mysqlx 33060/TCP
TargetPort: 6448/TCP
NodePort: mysqlx 31811/TCP
Endpoints: 192.168.2.52:6448
# 省略
パラメーターの確認
変更すべきパラメーターをcheckしていくと、InnoDBCluster.spec.service.defaultPort
では:3306
の転送先を、InnoDBCluster.spec.service.type
ではServiceのTypeを変更できることが記載されています。
templateの変更
従ってtemplateのkindがInnoDBCluster
に、spec.service.defaultPort
と、spec.service.Type
を追加して、values.yaml
から変更できるようにしておきます。
templates/deployment_cluster.yaml
# https://gitlab.com/18la008c/atom/-/blob/main/helm/charts/mysql-innodbcluster/templates/deployment_cluster.yaml?ref_type=heads#L31
apiVersion: mysql.oracle.com/v2
kind: InnoDBCluster
metadata:
name: {{ $cluster_name }}
namespace: {{ .Release.Namespace }}
spec:
### 追加
service:
defaultPort: {{ .Values.service.defaultPort | default "mysql-rw" }} # ex.) "mysql-rw-split"
type: {{ .Values.service.type }} # ex.) "LoadBalancer"
###
instances: {{ required "serverInstances is required" .Values.serverInstances }}
tlsUseSelfSigned: {{ $use_self_signed }}
InnoDBCluster.spec.service
は記載がないので、自分でtemplateをcloneして追加します。。。
values.yaml
service:
type: LoadBalancer
defaultPort: mysql-rw-split
結果
ちゃんとLoadBalancerかつ、3306:6450(rw-split)
になってdeployすることができました。
$ kubectl describe service mysql-cluster -n dev
Name: mysql-cluster
Namespace: dev
Labels: app.kubernetes.io/managed-by=Helm
mysql.oracle.com/cluster=mysql-cluster
tier=mysql
Annotations: metallb.universe.tf/ip-allocated-from-pool: default
metallb.universe.tf/loadBalancerIPs: 192.168.1.220
Selector: component=mysqlrouter,mysql.oracle.com/cluster=mysql-cluster,tier=mysql
Type: LoadBalancer
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.102.49.89
IPs: 10.102.49.89
LoadBalancer Ingress: 192.168.1.220
Port: mysql 3306/TCP
TargetPort: 6450/TCP
### 省略 ###
今回は特殊例なので紹介しませんでしたが、上記ではspec.service.annotations
にLoadBalancerにつけるIPを固定化する設定も追加しています。metallb.universe.tf/loadBalancerIPs: 192.168.1.220
https://metallb.universe.tf/usage/
service:
{{- with .Values.service.annotations }}
annotations: {{ toYaml . | nindent 6 }}
{{- end }}
type: {{ .Values.service.type }}
defaultPort: {{ .Values.service.defaultPort }}
3. my.cnf
の設定を追加
#
InnoDBではmy.cnf
の設定変更もサポートされています。公式doc
Helmのvalues.yaml
に以下のようにmy.confの内容を書き込んでdeployすることで、内容が反映されます。
serverConfig:
mycnf: |
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
mysql> SHOW VARIABLES LIKE 'character_set_server';
+----------------------+---------+
| Variable_name | Value |
+----------------------+---------+
| character_set_server | utf8mb4 |
+----------------------+---------+
1 row in set (0.00 sec)
client
のoptionは使用できません。
MySQLのDockerのような気持ちで、以下のように記載するとmysqlsh: unknown option --default-character-set
のエラーでクラッシュします。
serverConfig:
mycnf: |
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
# NG
[client]
default-character-set=utf8mb4
おわりに #
今回はMySQL InnoDB Clusterでカスタマイズできるパラメーターについて紹介しましたが、これらの変更もHelmによってyamlに宣言的に記載し、MySQL operatorが自動で設定を反映してくれるのでCI/CDフレンドリーかつ簡単にできて驚きでした。
一旦このシリーズは終わりにしますが、InnoDBのbackup,restore機能について今後記載するかもです。