KubeBlocksでMySQLを導入!Kubernetes上でのDB構築を体験

Japanese title slide: KubeBlocksでMySQLを導入! Kubernetes上でのDB構築を体験

はじめに

こちらの記事で実際に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
      

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

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。
エンジニア募集中!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です