CL LAB

HOME > CL LAB > k0sでkineを使ってKubernetesのデータストアをMySQLにしてみよう #k0s #mirantis #kubernetes #k8s #kine

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    <none>   3m21s   v1.22.2+k0s
worker2   Ready    <none>   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<br />
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以外に PostgreSQLDqliteSQLiteをサポートしています(本稿執筆時点: https://github.com/k3s-io/kine)
Kineを利用することで、KubernetesのデータストアをマネージドSQLにするなどの構成が考えられます。k0sを使えばKineも簡単に利用できるので、このような構成に興味のある方の参考となれば幸いです。

CL LAB Mail Magazine

CL LABの情報を逃さずチェックしよう!

メールアドレスを登録すると記事が投稿されるとメールで通知します。

メールアドレス: 登録

※登録後メールに記載しているリンクをクリックして認証してください。

Related post

Neo4j[ホワイトペーパー]CCPA