k0sでkineを使ってKubernetesのデータストアをMySQLにしてみよう #k0s #mirantis #kubernetes #k8s #kine
この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。
k0sとは、軽量かつ使いやすい、100%オープンソースのKubernetesディストリビューションです。主な特徴としては、
- フル機能のKubernetesを構築するために必要なすべてを単一バイナリに同梱
- k0s特有の改変を加えていない、CNCF認定の純正なKubernetesをデプロイ
- 最低必要リソース1vCPU・1GBメモリ・2GBストレージのシングルノードから、HA構成の大規模クラスタまでサポート
- Konnectivityをデフォルトで有効化
などが挙げられます。より詳しい情報は公式ドキュメントをご覧ください。
本稿ではこのk0sを使ってKubernetesをインストールしてみるのですが、この際にデータストアをデフォルトのetcdではなく、Kineという仕組みを使ってMySQLを使うようにしてみます。
なお、デフォルトのetcdでインストールする例は以前のブログ「k0sでKubernetesをVirtualbox/Vagrantにインストールしてみよう」をご覧ください。
前提条件
ホストマシンにVagrantとVirtualboxがインストール済みであるとします。IPアドレスは必要に応じて適宜読み替えてください。
Vagrantfile
Vagrantfileで4台のゲストを起動します。IPアドレスやメモリは必要に応じて変更してください。
- master : 192.168.123.100 : Kubernetesマスターノード
- mysql : 192.168.123.101 : MySQLサーバ
- worker1 : 192.168.123.201 : Kubernetesワーカーノード1
- worker2 : 192.168.123.202 : Kubernetesワーカーノード2
nodes = { 'master' => '192.168.123.100', 'mysql' => '192.168.123.101', 'worker1' => '192.168.123.201', 'worker2' => '192.168.123.202', } Vagrant.configure("2") do |config| config.vm.box = "ubuntu/bionic64" config.vm.box_check_update = false nodes.each do |node_name, ipaddr| config.vm.define node_name do |cf| cf.vm.hostname = node_name cf.vm.network "private_network", ip: ipaddr cf.vm.provider "virtualbox" do |vb| vb.memory = 4096 end end end end
MySQLサーバの準備
mysqlゲストにて、DockerとDocker Composeを使ってMySQLサーバを起動します。まず、次の手順に従いDockerとDocker Composeをインストールします。
次の docker-compose.yml でMySQLサーバを起動します。
version: '3.1' services: db: image: mysql:5.7 container_name: mysql restart: always environment: MYSQL_ROOT_PASSWORD: Passw0rd! volumes: - ./mysql:/var/lib/mysql ports: - 3306:3306
$ docker-compose up -d
k0sのインストールとコントロールプレーンの起動
masterゲストにて、 https://github.com/k0sproject/k0s/releases から執筆時の最新バージョンである v1.22.2+k0s.1 をダウンロードします。
$ curl -sSLf https://github.com/k0sproject/k0s/releases/download/v1.22.2%2Bk0s.1/k0s-v1.22.2+k0s.1-amd64 > k0s $ sudo mv k0s /usr/local/bin/k0s $ sudo chmod +x /usr/local/bin/k0s $ k0s version v1.22.2+k0s.1
デフォルトでのインストール設定を default-config オプションで出力し、IPアドレスを変更し、データストアをkineを使うように設定します。
$ k0s default-config > k0s.yaml.orig $ cp -a k0s.yaml.orig k0s.yaml $ vi k0s.yaml
差分は次の通りになります。
$ diff -u k0s.yaml.orig k0s.yaml --- k0s.yaml.orig 2021-10-15 02:25:20.366522881 +0000 +++ k0s.yaml 2021-10-15 02:27:25.542522881 +0000 @@ -4,16 +4,15 @@ name: k0s spec: api: - address: 10.0.2.15 + address: 192.168.123.100 port: 6443 k0sApiPort: 9443 sans: - - 10.0.2.15 - 192.168.123.100 storage: - type: etcd - etcd: - peerAddress: 10.0.2.15 + type: kine + kine: + dataSource: mysql://root:Passw0rd!@tcp(192.168.123.101)/kine network: podCIDR: 10.244.0.0/16 serviceCIDR: 10.96.0.0/12
spec.storage.type を etcd から kine に変更し、spec.storage.kine.dataSource にMySQLサーバへの接続情報を記載します。先の docker-compose.yaml で設定した MYSQL_ROOT_PASSWORD のパスワードと、mysqlノードのIPアドレスを指定します。
ではk0sの初期設定と起動を行いましょう。
$ sudo mkdir /etc/k0s $ sudo mv k0s.yaml /etc/k0s/ $ sudo k0s install controller -c /etc/k0s/k0s.yaml INFO[2021-10-15 02:32:34] creating user: etcd INFO[2021-10-15 02:32:34] creating user: kube-apiserver INFO[2021-10-15 02:32:34] creating user: konnectivity-server INFO[2021-10-15 02:32:34] creating user: kube-scheduler INFO[2021-10-15 02:32:34] Installing k0s service $ sudo k0s start
起動の確認を行います。
$ sudo k0s status Version: v1.22.2+k0s.1 Process ID: 14407 Role: controller Workloads: false $ ps axf (省略) 14407 ? Ssl 0:10 /usr/local/bin/k0s controller --config=/etc/k0s/k0s.y 14439 ? Sl 0:03 _ /var/lib/k0s/bin/kine --endpoint=mysql://root:Pas 14449 ? Sl 0:16 _ /var/lib/k0s/bin/kube-apiserver --enable-bootstra 14469 ? Sl 0:00 _ /var/lib/k0s/bin/konnectivity-server --agent-serv 14475 ? Sl 0:01 _ /var/lib/k0s/bin/kube-scheduler --leader-elect=tr 14483 ? Sl 0:04 _ /var/lib/k0s/bin/kube-controller-manager --bind-a 14491 ? Sl 0:00 _ /usr/local/bin/k0s api --config=/etc/k0s/k0s.yaml $ ps auxwwwf | grep '[ e]tcd' kube-ap+ 14449 9.8 7.2 1119104 291284 ? Sl 02:34 2:36 _ /var/lib/k0s/bin/kube-apiserver (中略) --etcd-servers=unix:///run/k0s/kine/kine.sock:2379
etcd の代わりに kine が起動しており、kube-apiserver は接続先の etcd として kine を指定していることに注目しましょう。
mysqlクライアントを使って、MySQLサーバの状態を確認してみます。
$ mysql -uroot -pPassw0rd! -h 192.168.123.101 --silent mysql: [Warning] Using a password on the command line interface can be insecure. mysql> show databases; Database information_schema kine mysql performance_schema sys mysql> use kine; mysql> show tables; Tables_in_kine kine mysql> show table status from kine\G *************************** 1. row *************************** Name: kine Engine: InnoDB Version: 10 Row_format: Dynamic Rows: 403 Avg_row_length: 3943 Data_length: 1589248 Max_data_length: 0 Index_length: 229376 Data_free: 4194304 Auto_increment: 451 Create_time: 2021-10-15 02:35:00 Update_time: 2021-10-15 02:39:40 Check_time: NULL Collation: latin1_swedish_ci Checksum: NULL Create_options: Comment:
kine のデータベースとテーブルが作成され、その中にデータがあることがわかります。
k0sでワーカーノードを追加
では、ワークロードをスケジューリングするためのワーカーノードを追加しましょう。
まず、masterゲストで参加トークンを払い出してもらいます。なお、この参加トークンはbase64エンコーディング+gzipされたkubeconfigファイルです。
$ sudo k0s token create --role=worker -c /etc/k0s/k0s.yaml > join-token $ base64 -d join-token | zcat | head apiVersion: v1 clusters: - cluster: server: https://192.168.123.100:6443 certificate-authority-data: LS0tLS1C(省略)
worker1ゲストでもmasterゲスト同様、k0sバイナリをダウンロードして実行可能にしておきます。
$ curl -sSLf https://github.com/k0sproject/k0s/releases/download/v1.22.2%2Bk0s.1/k0s-v1.22.2+k0s.1-amd64 > k0s $ sudo mv k0s /usr/local/bin/k0s $ sudo chmod +x /usr/local/bin/k0s $ k0s version v1.22.2+k0s.1
参加トークンをmasterゲストからworker1ゲストにコピーし、インストールと起動を行います。プライマリネットワークインターフェイスの問題があるため、 --node-ip オプションでworker1ゲストのIPアドレスを指定するようにします。
$ sudo mkdir /etc/k0s $ sudo mv join-token /etc/k0s/ $ sudo k0s install worker --token-file /etc/k0s/join-token --kubelet-extra-args '--node-ip=192.168.123.201' INFO[2021-10-15 02:45:21] Installing k0s service $ sudo k0s start
起動の確認を行います。
$ sudo k0s status Version: v1.22.2+k0s.1 Process ID: 2634 Role: worker Workloads: true $ ps axf (省略) 2634 ? Ssl 0:02 /usr/local/bin/k0s worker --kubelet-extra-args=--node 2658 ? Sl 0:04 _ /var/lib/k0s/bin/containerd --root=/var/lib/k0s/c 2676 ? Sl 0:00 _ /var/lib/k0s/bin/kubelet --container-runtime-endp 2836 ? Sl 0:00 /var/lib/k0s/bin/containerd-shim-runc-v2 -namespace k 2885 ? Ss 0:00 _ /pause 2850 ? Sl 0:00 /var/lib/k0s/bin/containerd-shim-runc-v2 -namespace k 2907 ? Ss 0:00 _ /pause
worker2ゲストでも同様に、クラスタへ参加させます。この際、 --node-ip= オプションを忘れずにworker2のIPアドレスに変更しましょう。
masterゲストにて、2つのワーカーノードの参加を確認します。
$ sudo cp /var/lib/k0s/pki/admin.conf kubeconfig.cfg $ sudo chown $USER kubeconfig.cfg $ export KUBECONFIG=~/kubeconfig.cfg $ k0s kubectl get nodes NAME STATUS ROLES AGE VERSION worker1 Ready 3m21s v1.22.2+k0s worker2 Ready 52s v1.22.2+k0s
これでクラスタが完成しました。
動作テスト
デモアプリケーションとしてお馴染みの Sock Shop をデプロイします。
$ k0s kubectl create -f https://raw.githubusercontent.com/microservices-demo/microservices-demo/master/deploy/kubernetes/complete-demo.yaml $ k0s kubectl -n sock-shop get pods NAME READY STATUS RESTARTS AGE orders-7664c64d75-cdxp7 1/1 Running 0 6m4s queue-master-5f6d6d4796-zqm2g 1/1 Running 0 6m3s carts-db-6c6c68b747-9vmhk 1/1 Running 0 6m5s shipping-7f7999ffb7-qc8mq 1/1 Running 0 6m2s session-db-7cf97f8d4f-g97pw 1/1 Running 0 6m3s carts-b4d4ffb5c-qz7rq 1/1 Running 0 6m5s user-db-6df7444fc-c4v2r 1/1 Running 0 6m2s catalogue-db-96f6f6b4c-fszzw 1/1 Running 0 6m4s orders-db-659949975f-kbnpn 1/1 Running 0 6m4s front-end-5c89db9f57-bk7jl 1/1 Running 0 6m4s rabbitmq-5bcbb547d7-jblh6 2/2 Running 0 6m3s catalogue-759cc6b86-8grct 1/1 Running 0 6m5s payment-7bcdbf45c9-5jjzh 1/1 Running 0 6m3s user-68df64db9c-dhvg7 1/1 Running 0 6m2s
ブラウザで http://192.168.123.201:30001 あるいは http://192.168.123.202:30001 にアクセスし、Sock ShopのUIが表示されれば正常に動作しています。
まとめ
本稿では、k0sに内蔵されているKineを利用して、データストアをMySQLとしたKubernetesをインストールし、デモアプリケーションをデプロイしてみました。
Rancher Labsによると数千万のKubernetesオブジェクトはetcdで管理できないため、従来のRDBMSを使用できるようにKineを開発したとのことです。Kineは本稿で試したMySQL以外に PostgreSQL・Dqlite・SQLiteをサポートしています(本稿執筆時点: https://github.com/k3s-io/kine)
Kineを利用することで、KubernetesのデータストアをマネージドSQLにするなどの構成が考えられます。k0sを使えばKineも簡単に利用できるので、このような構成に興味のある方の参考となれば幸いです。