🚢

TiDBの実行環境をmicrok8sで構築してみた

2024/02/24に公開

最近自宅にKubernetes環境を構築しました

https://twitter.com/k_miura_io/status/1756176262434017396

僕はDockerは慣れ親しんでたのでKubernetesも余裕で構築できるだろうと高をくくっておりましたが、本格的に構築しようとするとプラグインやらIPアドレスの設定、そしてKubernetes特有の用語などなどにぶつかり訳が分からなくなり、断念w。

代わりにそのような面倒事を抽象化されたmicrok8sを使った構成にシフトチェンジしたところ、コマンド一つで必要なプラグインをカスタマイズできてkubernetesを使えるようになった気分になりましたw。

で、このmicrok8sのクラスタ上でせっかくならなにか動かしたいと思ったときにふとTiDBの存在を思い出しました

https://twitter.com/k_miura_io/status/1756649108771864836

以前Serverless daysに参加した時に初めて知ったのですが、クラウドネイティブを意識したMySQL互換のNewSQLのDBです。

MySQL互換を謳ってますが、MySQLのソースを使わずGo言語でフルスクラッチで作られたシステムをAWSのEKSでデプロイしてCloud版を提供しているんです。

そして、このTiDBはCommunity Editionと言われるApache 2.0ライセンスのOSSが公開されており、プライベートクラウドやオンプレでも使うことも可能です。

というわけで、前置きが長くなりましたが今回はこのTiDBのCommunity Editionを使ってmicrok8s上にTiDBの実行環境を構築してみたいと思います。

動作環境

  • microk8s:v1.28.7
  • Ubuntu Server 22.04

環境構築

必要なプラグインの有効化

TiDBの要件を確認すると、その一つにTiDB Operatorの要件を満たす必要があります。TiDB OperatorはKubernetes上でTiDBクラスタを管理するためのツールです。

https://docs.pingcap.com/tidb-in-kubernetes/dev/deploy-on-general-kubernetes#prerequisites

さらにTiDB Operatorの要件を確認すると、DNSとストレージクラスが必要となります。

https://docs.pingcap.com/tidb-in-kubernetes/dev/deploy-tidb-operator#prerequisites

というわけで事前準備として以下のコマンドで追加のプラグインを有効にします。

microk8s enable dns
microk8s enable storage

TiDB Operatorの構築

まずはTiDB Operatorを構築します。

TiDB OperatorはCRD(Custom Resource Definition)を使ってTiDBクラスタを管理するためのリソースを提供します。

そこで以下のコマンドでCRDを追加します。

microk8s kubectl create -f https://raw.githubusercontent.com/pingcap/tidb-operator/master/manifests/crd.yaml

追加後、以下のコマンドでCRDが追加されたことを確認します。

microk8s kubectl get crd

以下のようにCRDが追加されていれば成功です。

backups.pingcap.com                                   2024-02-24T10:19:05Z
backupschedules.pingcap.com                           2024-02-24T10:19:05Z
dmclusters.pingcap.com                                2024-02-24T10:19:05Z
restores.pingcap.com                                  2024-02-24T10:19:06Z
tidbclusterautoscalers.pingcap.com                    2024-02-24T10:19:06Z
tidbclusters.pingcap.com                              2024-02-24T10:20:26Z
tidbdashboards.pingcap.com                            2024-02-24T10:20:27Z
tidbinitializers.pingcap.com                          2024-02-24T10:20:27Z

続いてTiDB Operatorをインストールします。

TiDB OperatorのインストールにはHelmを使います。Helmのバージョンは3以上が必要ですが、microk8sではデフォルトですでにセットアップされているのでそのまま使えます。

以下のコマンドでHelmのリポジトリを追加します。

microk8s helm repo add pingcap https://charts.pingcap.org/

追加後、以下のコマンドでリポジトリが追加されたことを確認します。2023年2月時点では、v1.5.2が最新のバージョンですが、必要なイメージが揃ってないため、v1.5.1を使います。

microk8s helm search repo pingcap --version=v1.5.1

以下の一覧が表示されば必要なイメージが揃っています。

pingcap/br-federation   v1.5.1          v1.5.1          br-federation Helm chart for Kubernetes
pingcap/tidb-backup     v1.5.1                          DEPRECATED(refer new instructions at https://do...
pingcap/tidb-cluster    v1.5.1                          DEPRECATED(refer new instructions at https://do...
pingcap/tidb-drainer    v1.5.1                          A Helm chart for TiDB Binlog drainer.
pingcap/tidb-lightning  v1.5.1                          A Helm chart for TiDB Lightning
pingcap/tidb-operator   v1.5.1          v1.5.1          tidb-operator Helm chart for Kubernetes
pingcap/tikv-importer   v1.5.1                          A Helm chart for TiKV Importer

続いてTiDB Operator用のネームスペースを作成します。

microk8s kubectl create namespace tidb-admin

TiDB Operatorをインストールします

microk8s helm install --namespace tidb-admin tidb-operator pingcap/tidb-operator --version v1.5.1

以下のコマンドでpodのステータスを確認します。

microk8s kubectl get pods --namespace tidb-admin -l app.kubernetes.io/instance=tidb-operator

以下のように、2つのpodがRunningになっていればインストールは完了です。

NAME                                      READY   STATUS    RESTARTS        AGE
tidb-controller-manager-86bb89ddd-4pmxr   1/1     Running   0               7m10s
tidb-scheduler-68587b84f5-bd2zb           2/2     Running   0               7m10s

TiDBクラスタの構築

続いてTiDBクラスタを構築します。

以下のコマンドでネームスペースを作成します。

microk8s kubectl create namespace tidb-cluster

クラスタは以下のコマンドで構築します。

microk8s kubectl -n tidb-cluster apply -f https://raw.githubusercontent.com/pingcap/tidb-operator/master/examples/basic/tidb-cluster.yaml

モニタリング環境の構築

最後にダッシュボードをはじめとしたモニタリング環境を構築します。

以下のコマンドでダッシュボードの依存関係をインストールします。

microk8s kubectl -n tidb-cluster apply -f https://raw.githubusercontent.com/pingcap/tidb-operator/master/examples/basic/tidb-dashboard.yaml

続けてモニタリングサービスもインストールします。

microk8s kubectl -n tidb-cluster apply -f https://raw.githubusercontent.com/pingcap/tidb-operator/master/examples/basic/tidb-monitor.yaml

以下のコマンドでpodのステータスを確認します。クラスタの構築には時間がかかるため、watchコマンドを使って完了を待ちます。

watch microk8s kubectl get po -n tidb-cluster

以下の通り、全てのpodがRunningになっていれば完了です。

NAME                              READY   STATUS    RESTARTS   AGE
basic-discovery-f86fd89cf-qnpll   1/1     Running   0          4m46s
basic-pd-0                        1/1     Running   0          4m46s
basic-tidb-dashboard-0            1/1     Running   0          4m31s
basic-monitor-0                   4/4     Running   0          4m14s
basic-tikv-0                      1/1     Running   0          4m6s
basic-tidb-0                      2/2     Running   0          96s

動作確認

MySQLクライアントからの接続

それでは実際に動作確認を行います。まずはMySQLクライアントからTiDBに接続します。

そのために以下のコマンドでバックグラウンドでポートフォワーディングを行います。

microk8s kubectl port-forward -n tidb-cluster svc/basic-tidb 14000:4000 > pf14000.out &

続いてMySQLクライアントを使って接続します。

MySQLクライアントは以下のコマンドでインストールできます。

sudo apt install mysql-client

インストール後、以下のコマンドで接続します。

mysql --comments -h 127.0.0.1 -P 14000 -u root

エラーなく、mysqlのプロンプトが表示されれば接続成功です。

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 527
Server version: 5.7.25-TiDB-v7.1.1 TiDB Server (Apache License 2.0) Community Edition, MySQL 5.7 compatible

Copyright (c) 2000, 2024, 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>

試しに何かテーブルを作成します。

以下のSQLでサンプルのテーブルを作成します。

mysql> use test;
mysql > CREATE TABLE `user` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `name` varchar(254) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ;

作成後、以下のSQLでデータを挿入します。

mysql> INSERT INTO user (name) VALUES ('John');

以下のSQLでデータが挿入されたことを確認します。

mysql> SELECT * FROM user;
+----+------+
| id | name |
+----+------+
|  1 | John |
+----+------+
1 row in set (0.00 sec)

これでDBとして機能できていることが確認できました。

ダッシュボードの接続

続けてダッシュボードに接続します。

以下のコマンドでバックグラウンドでポートフォワーディングを行います。

microk8s kubectl port-forward --address 0.0.0.0 -n tidb-cluster svc/basic-tidb-dashboard-exposed 12333:12333 > pf12333.out &

設定したらブラウザで 【サーバーのポート】:12333にアクセスします。

以下のようなダッシュボードのログイン画面が表示されるので、パスワードは空欄のままサインインします。

サインイン後、以下のようなダッシュボードが表示されれば成功です。

まとめ

今回はmicrok8s上にTiDBの実行環境を構築してみました。

TiDBはKubernetes環境で手軽に動かすことができますが、microk8s向けの手順は特になかったので、手順をまとめてみました。

結論としては、microk8sで追加のアドオンさえ有効にしておけば特に詰まることなく構築できると思います。

Discussion