メインコンテンツへスキップ
  1. Blogs/

MySQL InnoDB Cluster3 -helmで利用できるoption-

·1613 文字·
Blog Kubernetes Mysql
hiroki
著者
hiroki
クラウドを作るお仕事をしてます。
目次
mysql-innodb-cluster - 関連記事
3: << この記事 >>

はじめに
#

今回は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を変更できることが記載されています。

alt text
Figure by MySQL公式doc

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 }}
公式のtemplateには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

これは公式のtemplateに組み込まれているので、templateの変更は不要です。 https://github.com/mysql/mysql-operator/blob/trunk/helm/mysql-innodbcluster/templates/deployment_cluster.yaml#L91C1-L97C15

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機能について今後記載するかもです。

mysql-innodb-cluster - 関連記事
3: << この記事 >>

Related

MySQL InnoDB Cluster2 -MySQL Router-
·3143 文字
Blog Kubernetes Mysql
MySQL InnoDB Cluster1 -k8sにdeploy-
·3736 文字
Blog Kubernetes Mysql
ElasticSearchを使ったlog収集3 -vSphere integration-
·2159 文字
Blog VMware VSphere ElasticSearch