k0sでEC2マスターとVirtualboxワーカーのKubernetesクラスタを作成してみよう #k0s #kubernetes #ec2 #virtualbox #iot
この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。
k0sとは、軽量かつ使いやすい、100%オープンソースのKubernetesディストリビューションです。主な特徴としては、
- フル機能のKubernetesを構築するために必要なすべてを単一バイナリに同梱
- k0s特有の改変を加えていない、CNCF認定の純正なKubernetesをデプロイ
- 最低必要リソース1vCPU・1GBメモリ・2GBストレージのシングルノードから、HA構成の大規模クラスタまでサポート
- Konnectivityをデフォルトで有効化
などが挙げられます。より詳しい情報は公式ドキュメントをご覧ください。
本稿ではこのk0sを使って、AWS EC2にマスターを1台、ローカルPCのVirtualboxにワーカーを3台作成してKubernetesクラスタを構築してみます。
前提条件
AWSにて次の設定でEC2インスタンス(以降「master」と呼称)を作成しておきます。
- AMI: Ubuntu 18.04 LTS (HVM), SSD Volume Type (x86)
- インスタンスタイプ: t3.small (2vCPU・2GBメモリの最低推奨リソース)
- セキュリティグループで 22/tcp (SSH用) と 6443/tcp (kube-apiserver用) を許可
これで作成したmasterのグローバルIPアドレスは 52.38.249.94、プライベートIPアドレスは 172.31.8.136 であるとします。
ローカルPCにVagrantとVirtualboxがインストール済みであり、プライベートIPアドレスは 192.168.24.201 であるとします。グローバルIPアドレスは XXX.YYY.ZZZ.254 とします。
これらのIPアドレスは適宜読み替えてください。
右図のように、パブリッククラウドにあるマスターで、ローカルPCにあるワーカーを管理しようという形になります。これはk0sがデフォルトで有効化しているKonnectivityという機能によって実現されています。
Vagrantfile
先に述べた通り、Vagrantfileで3台のゲスト(以降「node0X」と呼称)を起動します。IPアドレスやメモリは必要に応じて変更してください。
- node01 : 192.168.123.201
- node02 : 192.168.123.202
- node03 : 192.168.123.203
Vagrant.configure("2") do |config| config.vm.box = "ubuntu/bionic64" config.vm.box_check_update = false ( 1..3 ).each do |i| config.vm.define "node0#{i}" do |cf| cf.vm.hostname = "node0#{i}" cf.vm.network "private_network", ip: "192.168.123.20#{i}" cf.vm.provider "virtualbox" do |vb| vb.memory = 4096 end end end end
k0sのインストールとコントロールプレーンの起動
masterにて、https://github.com/k0sproject/k0s/releases から執筆時の最新バージョンである v1.21.3+k0s.0 をダウンロードします。
master$ curl -sSLf https://github.com/k0sproject/k0s/releases/download/v1.21.3%2Bk0s.0/k0s-v1.21.3+k0s.0-amd64 > k0s master$ sudo mv k0s /usr/local/bin/k0s master$ sudo chmod +x /usr/local/bin/k0s master$ k0s version v1.21.3+k0s.0
デフォルトのインストール設定を k0s.yaml ファイルとして出力し、spec.api.externalAddressキーとspec.api.sansキーにmasterのグローバルIPアドレスである 52.38.249.94 を追加します。
master$ k0s default-config > k0s.yaml master$ cp k0s.yaml k0s.yaml.orig master$ vi k0s.yaml master$ diff -u k0s.yaml.orig k0s.yaml --- k0s.yaml.orig 2021-08-17 03:16:32.102876955 +0000 +++ k0s.yaml 2021-08-17 03:18:00.956487688 +0000 @@ -5,10 +5,12 @@ spec: api: address: 172.31.8.136 + externalAddress: 52.38.249.94 port: 6443 k0sApiPort: 9443 sans: - 172.31.8.136 + - 52.38.249.94 storage: type: etcd etcd:
この k0s.yaml ファイルはホームディレクトリではなく /etc ディレクトリなどに移動しておきます。
master$ sudo mkdir /etc/k0s master$ sudo mv k0s.yaml /etc/k0s/
コントロールプレーンのインストール・起動を行いましょう。k0sはsystemdで管理されているのでsystemctlコマンドで操作します。
master$ sudo k0s install controller -c /etc/k0s/k0s.yaml INFO[2021-08-17 03:19:28] creating user: etcd INFO[2021-08-17 03:19:28] creating user: kube-apiserver INFO[2021-08-17 03:19:28] creating user: konnectivity-server INFO[2021-08-17 03:19:28] creating user: kube-scheduler INFO[2021-08-17 03:19:28] Installing k0s service master$ sudo systemctl enable k0scontroller master$ sudo systemctl start k0scontroller
psコマンドでプロセスを見てみましょう。/var/lib/k0s以下にあるコントロールプレーンの各コンポーネントがプロセスとして起動していることがわかります。
master$ ps axf (省略) 2139 ? Ssl 0:07 /usr/local/bin/k0s controller --config=/etc/k0s/k0s.y 2168 ? Sl 0:02 _ /var/lib/k0s/bin/etcd --client-cert-auth=true --a 2179 ? Sl 0:09 _ /var/lib/k0s/bin/kube-apiserver --proxy-client-ke 2192 ? Sl 0:00 _ /var/lib/k0s/bin/kube-scheduler --leader-elect=tr 2198 ? Sl 0:02 _ /var/lib/k0s/bin/kube-controller-manager --enable 2206 ? Sl 0:00 _ /usr/local/bin/k0s api --config=/etc/k0s/k0s.yaml 2224 ? Sl 0:00 _ /var/lib/k0s/bin/konnectivity-server --agent-port
コントロールプレーンにアクセスするための設定ファイルを取得・利用し、クラスタの状態を見てみます。k0sにはkubectlも含まれているので用意する必要はありません。別途kubectlをインストールして利用することも可能です。
master$ sudo cp /var/lib/k0s/pki/admin.conf kubeconfig.cfg master$ sudo chown $USER kubeconfig.cfg master$ export KUBECONFIG=~/kubeconfig.cfg master$ k0s kubectl get nodes No resources found
コントロールプレーンを起動したにも関わらず「ノードが見つからない」という結果となりましたが、k0sでは正常な動作です。デフォルトではコントロールプレーンを起動しているマシンはワークロードを起動できるノードではないからです。
k0sでワーカーノードを追加
では、ワークロードをスケジューリングするためのワーカーノードを追加しましょう。masterと同様、node01〜node03にk0sバイナリを https://github.com/k0sproject/k0s/releases からダウンロード・インストールしておきます。
ワーカーノードを追加するには、まずコントロールプレーンから参加トークンを払い出してもらう必要があります。これはmasterで実行します。変更した設定ファイルを忘れず指定しましょう。
master$ sudo k0s token create --role=worker -c /etc/k0s/k0s.yaml > join-token
参加トークンをbase64デコード+gunzipして内容を見てみます。接続先サーバがmasterのグローバルIPアドレスである 52.38.249.94 となっているはずです。
master$ base64 -d join-token | zcat apiVersion: v1 clusters: - cluster: server: https://52.38.249.94:6443 certificate-authority-data: LS0tLS1C (省略)
払い出された参加トークンのファイルをnode01〜node03にコピーし、ホームディレクトリではなく /etc ディレクトリなどに移動しておきます。
node01$ sudo mkdir /etc/k0s node01$ sudo mv join-token /etc/k0s/
では、ノードコンポーネントのインストールと起動を行いましょう。VirtualboxにVagrantとKubeadmでインストールする場合と同じくプライマリネットワークインターフェイスの問題があるため、 --node-ip オプションでnode0XのIPアドレスを指定するようにします。
node01$ sudo k0s install worker --token-file /etc/k0s/join-token --kubelet-extra-args "--node-ip=192.168.123.201" INFO[2021-08-17 03:27:27] Installing k0s service node01$ sudo systemctl enable k0sworker node01$ sudo systemctl start k0sworker
psコマンドでプロセスを見てみましょう。/var/lib/k0s以下にあるノードコンポーネントがプロセスとして起動していることがわかります。
node01$ ps axf (省略) 2465 ? Ssl 0:05 /usr/local/bin/k0s worker --kubelet-extra-args=--node 2489 ? Sl 0:37 _ /var/lib/k0s/bin/containerd --root=/var/lib/k0s/c 2575 ? Sl 0:10 _ /var/lib/k0s/bin/kubelet --cert-dir=/var/lib/k0s/ 2743 ? Sl 0:00 /var/lib/k0s/bin/containerd-shim-runc-v2 -namespace k 2789 ? Ss 0:00 _ /pause 2880 ? Ssl 0:00 _ /usr/local/bin/kube-proxy --config=/var/lib/kube- 2751 ? Sl 0:00 /var/lib/k0s/bin/containerd-shim-runc-v2 -namespace k 2806 ? Ss 0:00 _ /pause 3226 ? Ssl 0:00 _ /usr/local/bin/kube-router --run-router=true --ru 3483 ? Sl 0:00 /var/lib/k0s/bin/containerd-shim-runc-v2 -namespace k 3514 ? Ss 0:00 _ /pause 3661 ? Ssl 0:00 _ /proxy-agent --logtostderr=true --ca-cert=/var/ru 3537 ? Sl 0:00 /var/lib/k0s/bin/containerd-shim-runc-v2 -namespace k 3586 ? Ss 0:00 _ /pause 3743 ? Ssl 0:04 _ /metrics-server --cert-dir=/tmp --secure-port=444 3568 ? Sl 0:00 /var/lib/k0s/bin/containerd-shim-runc-v2 -namespace k 3607 ? Ss 0:00 _ /pause 3858 ? Ssl 0:00 _ /coredns -conf /etc/coredns/Corefile
masterでノード一覧を見てみると、このようにnode01がワーカーとして追加されていることがわかります。
master$ k0s kubectl get nodes NAME STATUS ROLES AGE VERSION node01 Ready <none> 3m58s v1.21.3+k0s
先に述べた通り、k0sがデフォルトで有効化しているKonnectivityという機能によって、パブリッククラウドにあるマスターで、ローカルPCにあるワーカーを管理できています。
残りのnode02とnode03もクラスタに参加させましょう。その際、 "--node-ip=192.168.123.20X" オプションをそれぞれのIPアドレスに変更することをお忘れなく。3台のワーカーノードが正しく参加できれば、次のようになるはずです。
master$ k0s kubectl get nodes NAME STATUS ROLES AGE VERSION node01 Ready <none> 8m56s v1.21.3+k0s node02 Ready <none> 3m30s v1.21.3+k0s node03 Ready <none> 2m2s v1.21.3+k0s
kubeadmではCalicoなどのCNIプラグインを別途インストールする必要がありましたが、k0sではデフォルトでKube-routerを設定しているため、各ノードに分散したPod間通信をすぐに行うことができます。
動作テスト
デモアプリケーションとしてSock Shopをデプロイします。
master$ k0s kubectl create -f https://raw.githubusercontent.com/microservices-demo/microservices-demo/master/deploy/kubernetes/complete-demo.yaml
しばらく待ち、次を実行してSTATUSがすべてRunningになっていたら成功です。
master$ k0s kubectl -n sock-shop get pods NAME READY STATUS RESTARTS AGE carts-b4d4ffb5c-wh2gb 1/1 Running 0 8m36s carts-db-6c6c68b747-pxck9 1/1 Running 0 8m36s catalogue-759cc6b86-nmqz6 1/1 Running 0 8m36s catalogue-db-96f6f6b4c-spddb 1/1 Running 0 8m36s front-end-5c89db9f57-5x8pq 1/1 Running 0 8m36s orders-7664c64d75-w2jjd 1/1 Running 0 8m36s orders-db-659949975f-xfsb8 1/1 Running 0 8m36s payment-7bcdbf45c9-xc685 1/1 Running 0 8m36s queue-master-5f6d6d4796-jrsbf 1/1 Running 0 8m36s rabbitmq-5bcbb547d7-l8cgj 2/2 Running 0 8m36s session-db-7cf97f8d4f-z9wlx 1/1 Running 0 8m36s shipping-7f7999ffb7-dvb26 1/1 Running 0 8m35s user-68df64db9c-2r24s 1/1 Running 0 8m35s user-db-6df7444fc-jtqjl 1/1 Running 0 8m35s
ローカルPCのブラウザで http://192.168.123.201:30001 あるいは http://192.168.123.202:30001 または http://192.168.123.203:30001 にアクセスし、Sock ShopのUIが表示されれば正常に動作しています。
まとめ
本稿では、k0sを使ってパブリッククラウドのマスターとローカルPCのVirtualboxゲストという構成でKubernetesクラスタを構築してみました。k0sの軽量かつデフォルトで有効なKonnectivityの機能により、パブリッククラウドにマスターを置き、IoT機器をワーカーとするKubernetesクラスタを構築するといったことも容易だと考えられます。本ブログでは引き続きk0sのさまざまな情報を発信していく予定です。
またこの度、クリエーションライン株式会社ではミランティス・ジャパン社と協力してk0sの日本語サポートサービスを提供することになりました。製品に関する質問や価格、ライセンス体系などにつきましてはこちらからお問い合わせください。