はじめに
こちらの記事で実際にKubernetes環境にKubeBlocksを導入し、DBaaSの基盤を構築しました。
今回は、作成したDBaaS基盤の上に実際にMySQLクラスターを構築していきます。
導入環境構成図
以下の図は、DBaaS基盤上にMySQLを導入する環境の構成図です。
前回の記事では「KubeBlocksオペレーター」を構築しました。
本記事の対象範囲は、赤丸で囲まれた「DB(MySQL)」です。
今回は例として、プライマリ-レプリカ構成のMySQLをKubeBlocksオペレーターを利用して導入します。
この構成では、データの書き込み・読み込みを行う「プライマリ」と、読み込み専用の「レプリカ」を配置します。
万が一プライマリに障害が発生したとしても、レプリカが自動的にプライマリに昇格して処理を引き継ぐフェイルオーバー機能が働き、高可用性を確保できるのが特徴です。

導入環境構成図
MySQLクラスターの構築方法
KubeBlocksを使用してMySQLクラスターを構築する手順をご紹介します。
前提条件
- KubeBlocksが構築済みであること
- KubeBlocksによってデフォルトでインストールされるMySQLアドオン(以下コマンド結果のmysql 1.0.1)が有効になっていること
- 以下のkbcliコマンドで有効化されているアドオンを確認することができます。
kbcli addon list # 出力例 NAME VERSION PROVIDER STATUS AUTO-INSTALL qdrant 1.0.1 community Disabled false rabbitmq 1.0.1 community Disabled false apecloud-mysql 1.0.1 community Enabled true etcd 1.0.1 community Enabled true kafka 1.0.1 community Enabled true mongodb 1.0.1 community Enabled true mysql 1.0.1 community Enabled true postgresql 1.0.1 community Enabled true redis 1.0.1 community Enabled true
- 以下のkbcliコマンドで有効化されているアドオンを確認することができます。
Namespeaceの作成
まずはMySQLクラスターをデプロイするNamespeaceを作成します。
kubectl create namespace demo
# 出力例
namespace/demo created
rootユーザー認証用Secretの作成
MySQLのrootユーザー用のユーザー名・パスワードを設定したSecretを作成します。
kubectl create secret generic custom-mysql-root-secret \
--from-literal=username='root' \
--from-literal=password='<任意の値>' \
-n demo
# 出力例
secret/custom-mysql-root-secret created
※MySQLクラスター作成時に本手順で作成したSecretを指定することで、rootユーザーのパスワードを任意の値で設定することができます。
Secretの指定がない場合は、KubeBlocksがrootユーザー用のパスワードを自動発行します。
MySQLクラスターの作成
KubeBlocksのカスタムリソースである「Cluster」のマニフェストを適用し、レプリカ数2のプライマリ-レプリカ構成のMySQLクラスターを作成します。
cat <<EOF | kubectl apply -f -
apiVersion: apps.kubeblocks.io/v1
kind: Cluster
metadata:
name: mysql-cluster
namespace: demo
spec:
clusterDef: mysql
topology: semisync
terminationPolicy: Delete
componentSpecs:
- name: mysql
serviceVersion: 8.0.35
disableExporter: false
replicas: 2
systemAccounts:
- name: root
secretRef:
name: custom-mysql-root-secret
namespace: demo
resources:
limits:
cpu: '0.5'
memory: 1Gi
requests:
cpu: '0.5'
memory: 1Gi
volumeClaimTemplates:
- name: data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
EOF
# 出力例
cluster.apps.kubeblocks.io/mycluster created
clusterDef: mysql- MySQLアドオンが提供するMySQLの構成テンプレートを、作成するDBクラスターのベースとして指定する設定です。
topology: semisync- MySQLクラスターをプライマリ-レプリカ構成の準同期レプリケーションモードで起動する設定です。
terminationPolicy: Delete- クラスターを削除した際、関連するデータも一緒に削除する設定です。
replicas: 2- MySQLサーバーを2台(プライマリ1台、レプリカ1台)デプロイする設定です。
systemAccounts- MySQLのrootユーザーの認証情報(ユーザー名・パスワード)に、事前に作成したSecretを割り当てる設定です。
volumeClaimTemplates- DBのデータを保存するためのPVの設定です。
MySQLクラスターの作成確認
MySQLクラスター作成コマンド実行後、以下のコマンドでクラスター・Podのステータスを確認します。ステータスがRunningになっていれば正常に動作しています。
kubectl get cluster mycluster -n demo
# 出力例
NAME CLUSTER-DEFINITION TERMINATION-POLICY STATUS AGE
mycluster mysql Delete Running 7m30s
kubectl get pod -n demo
# 出力例
NAME READY STATUS RESTARTS AGE
mycluster-mysql-0 4/4 Running 0 8m
mycluster-mysql-1 4/4 Running 0 8m
動作確認
接続テスト
MySQLクラスターへの接続テストを行います。
まず、作成したMySQLクラスターのエンドポイント(Service名)を確認します。
kubectl get svc -n demo
# 出力例
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
mycluster-mysql ClusterIP 10.43.32.224 <none> 3306/TCP 8m
kubectl runコマンドでMySQLクライアント用のPodを作成し、コンテナ内でシェルを起動します。
kubectl run mysql-client -n demo --rm -i --tty --image=mysql:8.0 --restart=Never -- sh
# 出力例
If you don't see a command prompt, try pressing enter.
sh-5.1#
mysqlコマンドを使用し、確認したMySQLクラスターのエンドポイントを指定してログインします。パスワードを求められたら設定したパスワードを入力します。
sh-5.1# mysql -h mysql-cluster-mysql.demo.svc.cluster.local -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 246
Server version: 8.0.35 MySQL Community Server - GPL
Copyright (c) 2000, 2026, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
mysql>という出力が表示されればMySQLクラスターに接続できています。
フェイルオーバーテスト
MySQLクラスターのフェイルオーバー機能を実際にテストしてみます。
まず起動したMySQLのPodのうち、どれが「プライマリ」で、どれが「レプリカ」なのかを確認します。
kbcli cluster describe mycluster -n demo | grep -E "ROLE|primary|secondary"
# 出力例
COMPONENT SERVICE-VERSION INSTANCE ROLE STATUS AZ NODE CREATED-TIME
mysql 8.0.35 mycluster-mysql-0 primary Running us-east-1a ip-10-1-0-23/10.1.0.23 Jun 25,2026 08:00 UTC+0000
mysql 8.0.35 mycluster-mysql-1 secondary Running us-east-1a ip-10-1-0-24/10.1.0.24 Jun 25,2026 08:01 UTC+0000
各PodのROLEの値を確認すると、mycluster-mysql-0がprimary、mycluster-mysql-1がsecondaryとなっています。
これは、mycluster-mysql-0が「プライマリ」、mycluster-mysql-1が「レプリカ」として構成されていることを表しています。
次にプライマリのPodを削除することで、プライマリに擬似的な障害を発生させます。
kubectl delete pod mycluster-mysql-0
# 出力例
pod "mycluster-mysql-0" deleted
プライマリのPodを削除後、レプリカのPodが自動的にプライマリに昇格していることを確認します。
kbcli cluster describe mysql-cluster -n demo | grep -E "ROLE|primary|secondary"
# 出力例
COMPONENT SERVICE-VERSION INSTANCE ROLE STATUS AZ NODE CREATED-TIME
mysql 8.0.35 mycluster-mysql-0 secondary Running us-east-1a ip-10-1-0-23/10.1.0.23 Jun 25,2026 08:06 UTC+0000
mysql 8.0.35 mycluster-mysql-1 primary Running us-east-1a ip-10-1-0-24/10.1.0.24 Jun 25,2026 08:01 UTC+0000
先ほどレプリカであったmycluster-mysql-1が、プライマリに昇格していることがわかります。
これでMySQLクラスターの構築と動作確認は完了になります。
おわりに
今回は前回構築したKubeBlocksを使用し、実際にMySQLクラスターの構築から接続テスト・フェイルオーバのテストを行うまでの流れをご紹介しました。
KubeBlocksを活用すれば、シンプルなマニフェストを1つ適用するだけで、容易に冗長化されたMySQLクラスターを構築できることを体感できたのではないでしょうか。
KubeBlocksの大きな特徴は、様々なデータベースを同じ操作感で統一して管理できる点にあります。
そこで次回は、MySQLとはまた異なる特性を持つNoSQLのインメモリデータベースであるRedisの構築についてご紹介します。
参考文献
https://kubeblocks.io/docs/release-1_0_1/kubeblocks-for-mysql/02-quickstart
https://kubeblocks.io/docs/release-1_0_1/kubeblocks-for-mysql/06-custom-secret/01-custom-secret

