fbpx

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の日本語サポートサービスを提供することになりました。製品に関する質問や価格、ライセンス体系などにつきましてはこちらからお問い合わせください。

Author

Chef・Docker・Mirantis製品などの技術要素に加えて、会議の進め方・文章の書き方などの業務改善にも取り組んでいます。「Chef活用ガイド」共著のほか、Debian Official Developerもやっています。

Daisuke Higuchiの記事一覧

新規CTA