TiDBの実行環境をmicrok8sで構築してみた
最近自宅にKubernetes環境を構築しました
僕はDockerは慣れ親しんでたのでKubernetesも余裕で構築できるだろうと高をくくっておりましたが、本格的に構築しようとするとプラグインやらIPアドレスの設定、そしてKubernetes特有の用語などなどにぶつかり訳が分からなくなり、断念w。
代わりにそのような面倒事を抽象化されたmicrok8sを使った構成にシフトチェンジしたところ、コマンド一つで必要なプラグインをカスタマイズできてkubernetesを使えるようになった気分になりましたw。
で、このmicrok8sのクラスタ上でせっかくならなにか動かしたいと思ったときにふとTiDBの存在を思い出しました
以前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クラスタを管理するためのツールです。
さらにTiDB Operatorの要件を確認すると、DNSとストレージクラスが必要となります。
というわけで事前準備として以下のコマンドで追加のプラグインを有効にします。
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