fbpx

k0sでKube-Routerの代わりにCalicoやWeave Netを使ってみよう #k0s #mirantis #kubernetes #k8s #calico #weavenet

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

k0sとは、軽量かつ使いやすい、100%オープンソースのKubernetesディストリビューションです。主な特徴としては、

  • フル機能のKubernetesを構築するために必要なすべてを単一バイナリに同梱
  • k0s特有の改変を加えていない、CNCF認定の純正なKubernetesをデプロイ
  • 最低必要リソース1vCPU・1GBメモリ・2GBストレージのシングルノードから、HA構成の大規模クラスタまでサポート
  • Konnectivityをデフォルトで有効化

などが挙げられます。より詳しい情報は公式ドキュメントをご覧ください。

本稿ではこのk0sを使ってKubernetesをインストールしてみるのですが、この際にネットワークプラグインをデフォルトのKube-Routerではなく、CalicoWeave Netを使うようにしてみます。

なお、デフォルトのKube-Routerでインストールする例は以前のブログ「k0sでKubernetesをVirtualbox/Vagrantにインストールしてみよう」をご覧ください。

前提条件

ホストマシンにVagrantとVirtualboxがインストール済みであるとします。IPアドレスは必要に応じて適宜読み替えてください。

Vagrantfile

Vagrantfileで3台のゲストを起動します。IPアドレスやメモリは必要に応じて変更してください。

  • master : 192.168.123.101 : Kubernetesマスターノード
  • node01 : 192.168.123.201 : Kubernetesワーカーノード1
  • node02 : 192.168.123.202 : Kubernetesワーカーノード2
nodes = {
'master' => '192.168.123.101',
'node01' => '192.168.123.201',
'node02' => '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

k0sのインストールとコントロールプレーンの起動: Calico編

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アドレスを変更し、ネットワークプラグインにCalicoを使うように設定します。

$ 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-25 06:19:14.292920391 +0000
+++ k0s.yaml 2021-10-25 06:24:38.659022388 +0000
@@ -4,26 +4,22 @@
name: k0s
spec:
api:
- address: 10.0.2.15
+ address: 192.168.123.101
port: 6443
k0sApiPort: 9443
sans:
- - 10.0.2.15
- 192.168.123.101
storage:
type: etcd
etcd:
- peerAddress: 10.0.2.15
+ peerAddress: 192.168.123.101
network:
podCIDR: 10.244.0.0/16
serviceCIDR: 10.96.0.0/12
- provider: kuberouter
- calico: null
- kuberouter:
- mtu: 0
- peerRouterIPs: ""
- peerRouterASNs: ""
- autoMTU: true
+ provider: calico
+ calico:
+ ipAutodetectionMethod: cidr=192.168.123.0/24
+ kuberouter: null
kubeProxy:
disabled: false
mode: iptables

spec.apiとspec.storageの変更は以前のブログ「k0sでKubernetesをVirtualbox/Vagrantにインストールしてみよう」と同様です。spec.providerはcalicoに変更し、spec.network.kuberouterはすべて削除しnullとします。そしてVirtualboxの「10.0.2.15」を掴んでしまわないように、spec.network.calico.ipAutodetecionMethodでcidr=192.168.123.0/24を指定します。詳細はCalicoの公式ドキュメント「IP autodetection methods」を参照してください。

ではk0sの初期設定と起動を行いましょう。

$ sudo mkdir /etc/k0s
$ sudo mv k0s.yaml /etc/k0s/
$ sudo k0s install controller -c /etc/k0s/k0s.yaml
$ sudo k0s start

起動の確認を行います。

$ sudo k0s status
Version: v1.22.2+k0s.1
Process ID: 14407
Role: controller
Workloads: false

k0sでワーカーノードを追加: Calico編

では、ワークロードをスケジューリングするためのワーカーノードを追加しましょう。

まず、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.101:6443
certificate-authority-data: LS0tLS1C(省略)

node01ゲストでも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ゲストからnode01ゲストにコピーし、インストールと起動を行います。プライマリネットワークインターフェイスの問題があるため、 --node-ip オプションでnode01ゲストの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'
$ sudo k0s start

起動の確認を行います。

$ sudo k0s status
Version: v1.22.2+k0s.1
Process ID: 2634
Role: worker
Workloads: true

node02ゲストでも同様に、クラスタへ参加させます。この際、 --node-ip= オプションを忘れずにnode02の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
node01 Ready 20m v1.22.2+k0s
node02 Ready 20m v1.22.2+k0s

Calicoの公式ドキュメント「Install calicoctl」を参考にmasterゲストにてcalicoctlをインストールします。この際、k0s v1.22.2+k0s.1でインストールされるCalicoのバージョン3.18.1に合わせます。

$ curl -o calicoctl -O -L "https://github.com/projectcalico/calicoctl/releases/download/v3.18.1/calicoctl"
$ chmod +x calicoctl
$ sudo mv calicoctl /usr/local/bin

calicoctlを実行し、ネットワークの状態を確認します。

$ calicoctl get ippool
NAME CIDR SELECTOR
default-ipv4-ippool 10.244.0.0/16 all()
$ calicoctl get nodes -o wide
NAME ASN IPV4 IPV6
node01 (64512) 192.168.123.201/24
node02 (64512) 192.168.123.202/24

これでクラスタが完成しました。

動作テスト: Calico編

デモアプリケーションとしてお馴染みの Sock Shop をデプロイします。

$ k0s kubectl create -f https://raw.githubusercontent.com/microservices-demo/microservices-demo/master/deploy/kubernetes/complete-demo.yaml
$ k0s kubectl get pod -n sock-shop
NAME READY STATUS RESTARTS AGE
carts-b4d4ffb5c-fv9hx 1/1 Running 0 9m22s
carts-db-6c6c68b747-shj4b 1/1 Running 0 9m22s
catalogue-759cc6b86-z7dt7 1/1 Running 0 9m22s
catalogue-db-96f6f6b4c-gmsk6 1/1 Running 0 9m21s
front-end-5c89db9f57-4x4pn 1/1 Running 0 9m21s
orders-7664c64d75-6z68r 1/1 Running 0 9m21s
orders-db-659949975f-p8s4x 1/1 Running 0 9m21s
payment-7bcdbf45c9-wtw8z 1/1 Running 0 9m21s
queue-master-5f6d6d4796-vg9hq 1/1 Running 0 9m21s
rabbitmq-5bcbb547d7-mxvv4 2/2 Running 0 9m21s
session-db-7cf97f8d4f-d7rgk 1/1 Running 0 9m20s
shipping-7f7999ffb7-4r2h9 1/1 Running 0 9m20s
user-68df64db9c-r88p5 1/1 Running 0 9m20s
user-db-6df7444fc-sq26h 1/1 Running 0 9m20s

ブラウザで http://192.168.123.201:30001 あるいは http://192.168.123.202:30001 にアクセスし、Sock ShopのUIが表示されれば正常に動作しています。

k0sのインストールとコントロールプレーンの起動: Weave Net編

改めてVMを用意し、master/node01/node02ゲストにてk0sをインストールしておきます。

デフォルトでのインストール設定を default-config オプションで出力し、IPアドレスを変更し、ネットワークプラグインをインストールしないよう設定します。

$ 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-25 08:02:58.422869999 +0000
+++ k0s.yaml 2021-10-25 08:03:40.683989995 +0000
@@ -4,26 +4,21 @@
name: k0s
spec:
api:
- address: 10.0.2.15
+ address: 192.168.123.101
port: 6443
k0sApiPort: 9443
sans:
- - 10.0.2.15
- 192.168.123.101
storage:
type: etcd
etcd:
- peerAddress: 10.0.2.15
+ peerAddress: 192.168.123.101
network:
podCIDR: 10.244.0.0/16
serviceCIDR: 10.96.0.0/12
- provider: kuberouter
+ provider: custom
calico: null
- kuberouter:
- mtu: 0
- peerRouterIPs: ""
- peerRouterASNs: ""
- autoMTU: true
+ kuberouter: null
kubeProxy:
disabled: false
mode: iptables

spec.apiとspec.storageの変更は以前のブログ「k0sでKubernetesをVirtualbox/Vagrantにインストールしてみよう」と同様です。spec.providerはcustomに変更し、spec.network.kuberouterはすべて削除しnullとします。これにより、デフォルトのKube-Routerも代替のCalicoも、k0sによってインストールされません。

ではk0sの初期設定と起動を行いましょう。

$ sudo mkdir /etc/k0s
$ sudo mv k0s.yaml /etc/k0s/
$ sudo k0s install controller -c /etc/k0s/k0s.yaml
$ sudo k0s start

起動の確認を行います。

$ sudo k0s status
Version: v1.22.2+k0s.1
Process ID: 14407
Role: controller
Workloads: false

では、Weave Netのインストールを行います。

k0s公式ドキュメントのCustom CNI configurationに説明がある通り、k0sにはManifest Deployerという機能が備わっており、特定のディレクトリを定期的に監視し、配置されたKubernetesマニフェスト(YAMLファイル)を自動的にデプロイしたり、マニフェストが削除されればリソースも自動的に削除するようになっています。Weave Netのインストールにはこれを利用します。

Manifest Deployerが利用する特定のディレクトリとは /var/lib/k0s/manifests ディレクトリです。この下にサブディレクトリとして /var/lib/k0s/manifests/weavenet を作成し、Weave Netのインストールマニフェストを配置します。

$ sudo mkdir /var/lib/k0s/manifests/weavenet
$ curl -sSLf "https://cloud.weave.works/k8s/net?k8s-version=$(k0s kubectl version | base64 | tr -d '\n')" > weavenet.yaml
$ sudo mv weavenet.yaml /var/lib/k0s/manifests/weavenet

少し待つとWeave NetのDaemonSetが起動するはずですが…何も起きません。k0scontrollerサービスのログを確認してみます。

Oct 25 08:22:34 master k0s[2703]: time="2021-10-25 08:22:34" level=warning msg="stack apply failed" bundle=weavenet component=applier error="unknown api error: name is required"
Oct 25 08:22:34 master k0s[2703]: time="2021-10-25 08:22:34" level=warning msg="failed to apply manifests: unknown api error: name is required" component=applier-weavenet

Manifest DeployerがWeave Netインストールマニフェストを読み込んではいるようですが、エラーになっているようです。Weave Netインストールマニフェストを見てみると次のようになっています。

apiVersion: v1
kind: List
items:
- apiVersion: v1
kind: ServiceAccount
metadata:
name: weave-net
annotations:
cloud.weave.works/launcher-info: |-
{

この「kind: List」形式にはmetadata.nameがないからのようです。さらにManifest DeployerのNoteを見ると「Explicitly define the namespace in the manifests (訳:マニフェストには明示的にnamespaceを定義する)」とあります。そのため仮の名前とnamespaceを与えてみます。

apiVersion: v1
kind: List
metadata:
name: weave-net
namespace: weave-net
items:
- apiVersion: v1
kind: ServiceAccount
metadata:
name: weave-net

しかしk0scontrollerのログを見ると次のようなエラーになってしまいました。

Oct 26 01:05:20 master k0s[2606]: time="2021-10-26 01:05:20" level=warning msg="stack apply failed" bundle=weavenet component=applier error="cannot create resource weavenet: the server could not find the requested resource"
Oct 26 01:05:20 master k0s[2606]: time="2021-10-26 01:05:20" level=warning msg="stack apply failed" bundle=weavenet component=applier error="cannot create resource weavenet: the server could not find the requested resource"
Oct 26 01:05:20 master k0s[2606]: time="2021-10-26 01:05:20" level=warning msg="stack apply failed" bundle=weavenet component=applier error="cannot create resource weavenet: the server could not find the requested resource"
Oct 26 01:05:20 master k0s[2606]: time="2021-10-26 01:05:20" level=warning msg="stack apply failed" bundle=weavenet component=applier error="cannot create resource weavenet: the server could not find the requested resource"
Oct 26 01:05:20 master k0s[2606]: time="2021-10-26 01:05:20" level=warning msg="stack apply failed" bundle=weavenet component=applier error="cannot create resource weavenet: the server could not find the requested resource"

ここでは取り上げませんが、Weave Netインストールマニフェストを「kind: List」形式ではなく、「---」区切りのYAMLブロック形式にしたところ正常に読み込まれるようになりました。Manifest Deployerのバグか仕様かわからなかったので、バグレポートを送っています(Manifest Deployer does not accept kind: List style manifest)。続報をお待ちください。

さて、Manifest Deployerを使わず、Weave Net公式ドキュメント「Integrating Kubernetes via the Addon」の通りに kubectl apply を使うことでもWeave Netはインストールできます。この際、kubectl ではなく k0s kubectl を使うことをお忘れなく。2か所あります。

$ k0s kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(k0s kubectl version | base64 | tr -d '\n')"
serviceaccount/weave-net created
clusterrole.rbac.authorization.k8s.io/weave-net created
clusterrolebinding.rbac.authorization.k8s.io/weave-net created
role.rbac.authorization.k8s.io/weave-net created
rolebinding.rbac.authorization.k8s.io/weave-net created
daemonset.apps/weave-net created

これでWeave Netがインストールできました。

k0sでワーカーノードを追加: WeaveNet編

では、ワークロードをスケジューリングするためのワーカーノードを追加しましょう。Calicoの場合と同様なので、masterゲストでの参加トークンの払い出しと、node01/node02ゲストでのクラスタ参加手順は省略します。

$ 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
node01 Ready 20m v1.22.2+k0s
node02 Ready 20m v1.22.2+k0s

node01/node02はReadyとなったのですが、何か様子が変です。

$ k0s kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-5ccbdcc4c4-9txs9 0/1 ContainerCreating 0 28m
kube-system coredns-5ccbdcc4c4-lmpnv 0/1 ContainerCreating 0 22m
kube-system konnectivity-agent-66hxj 0/1 ContainerCreating 0 9m3s
kube-system konnectivity-agent-v878z 0/1 ContainerCreating 0 9m4s
kube-system kube-proxy-6mqgd 1/1 Running 0 22m
kube-system kube-proxy-grvbr 1/1 Running 0 22m
kube-system metrics-server-6bd95db5f4-kbcpz 0/1 ContainerCreating 0 28m
kube-system weave-net-t8xqj 2/2 Running 1 (9m11s ago) 9m37s
kube-system weave-net-x8z67 2/2 Running 1 (9m9s ago) 9m37s

いつまで経ってもcoredns、konnectivity-agent、metrics-server PodがRunningになりません。Eventを見てみると、

Warning FailedCreatePodSandBox 4m14s (x17 over 7m48s) kubelet (combined from similar events): Failed to create pod sandbox: rpc error: code = Unknown desc = failed to setup network for sandbox "710f088ae6e9de5c4021fcda9efe2f8659f74fe33f2b35f78f3998f888d59e7a": failed to find plugin "loopback" in path [/opt/cni/bin]

何かファイルが足りないようです。k0sの公式ドキュメント「Configuration Options」を見ると、spec.network.providerの項目に「Be aware that it is your responsibility to configure all of the CNI-related setups, including the CNI provider itself and all necessary host levels setups (for example, CNI binaries). (訳: CNIプロバイダ自体とすべてのホストレベルのセットアップ(例:CNIバイナリ)を含む、CNI関連のすべてのセットアップを構成するのは、ユーザの責任であることに注意してください)」とあります。つまり、Kube-RouterやCalicoを利用する場合と異なり、ワーカーノードに作業が必要ということです。

ここではloopback CNIプラグインが見つからないというエラーが出いることからhttps://github.com/containernetworking/pluginsのインストールが必要であることがわかります。なおプラグインのバージョンはhttps://github.com/k0sproject/cni-node/blob/v0.1.0/Dockerfileからv0.9.1とわかります。

node01とnode02にてCNIプラグインをインストールしましょう。まず /opt/cni/bin ディレクトリを確認してみます。

$ ls -l /opt/cni/bin/
total 11172
lrwxrwxrwx 1 root root 18 Oct 25 08:30 weave-ipam -> weave-plugin-2.8.1
lrwxrwxrwx 1 root root 18 Oct 25 08:30 weave-net -> weave-plugin-2.8.1
-rwxr-xr-x 1 root root 11437320 Oct 25 08:30 weave-plugin-2.8.1

Weave Net関連のものか入っていません。ここに必要なファイルをダウンロード・インストールします。

$ wget https://github.com/containernetworking/plugins/releases/download/v0.9.1/cni-plugins-linux-amd64-v0.9.1.tgz
$ sudo tar xf cni-plugins-linux-amd64-v0.9.1.tgz -C /opt/cni/bin
$ ls -l /opt/cni/bin/
total 83448
-rwxr-xr-x 1 root root 4151672 Feb 5 2021 bandwidth
-rwxr-xr-x 1 root root 4536104 Feb 5 2021 bridge
-rwxr-xr-x 1 root root 10270090 Feb 5 2021 dhcp
-rwxr-xr-x 1 root root 4767801 Feb 5 2021 firewall
-rwxr-xr-x 1 root root 3357992 Feb 5 2021 flannel
-rwxr-xr-x 1 root root 4144106 Feb 5 2021 host-device
-rwxr-xr-x 1 root root 3565330 Feb 5 2021 host-local
-rwxr-xr-x 1 root root 4288339 Feb 5 2021 ipvlan
-rwxr-xr-x 1 root root 3530531 Feb 5 2021 loopback
-rwxr-xr-x 1 root root 4367216 Feb 5 2021 macvlan
-rwxr-xr-x 1 root root 3966455 Feb 5 2021 portmap
-rwxr-xr-x 1 root root 4467317 Feb 5 2021 ptp
-rwxr-xr-x 1 root root 3701138 Feb 5 2021 sbr
-rwxr-xr-x 1 root root 3153330 Feb 5 2021 static
-rwxr-xr-x 1 root root 3668289 Feb 5 2021 tuning
-rwxr-xr-x 1 root root 4287972 Feb 5 2021 vlan
-rwxr-xr-x 1 root root 3759977 Feb 5 2021 vrf
lrwxrwxrwx 1 root root 18 Oct 25 08:30 weave-ipam -> weave-plugin-2.8.1
lrwxrwxrwx 1 root root 18 Oct 25 08:30 weave-net -> weave-plugin-2.8.1
-rwxr-xr-x 1 root root 11437320 Oct 25 08:30 weave-plugin-2.8.1

少し待ってみると、先ほどは起動していなかったcoredns、konnectivity-agent、metrics-server PodがRunningになりました。

$ k0s kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-5ccbdcc4c4-9txs9 1/1 Running 0 39m
kube-system coredns-5ccbdcc4c4-lmpnv 1/1 Running 0 32m
kube-system konnectivity-agent-66hxj 1/1 Running 0 19m
kube-system konnectivity-agent-v878z 1/1 Running 0 19m
kube-system kube-proxy-6mqgd 1/1 Running 0 33m
kube-system kube-proxy-grvbr 1/1 Running 0 32m
kube-system metrics-server-6bd95db5f4-kbcpz 0/1 Running 0 39m
kube-system weave-net-t8xqj 2/2 Running 1 (19m ago) 20m
kube-system weave-net-x8z67 2/2 Running 1 (19m ago) 20m

動作テスト: Weave Net編

デモアプリケーションとしてお馴染みの Sock Shop をデプロイします。

$ k0s kubectl create -f https://raw.githubusercontent.com/microservices-demo/microservices-demo/master/deploy/kubernetes/complete-demo.yaml
$ k0s kubectl get pod -n sock-shop
NAME READY STATUS RESTARTS AGE
carts-b4d4ffb5c-s4l92 1/1 Running 0 6m47s
carts-db-6c6c68b747-b9xbp 1/1 Running 0 6m47s
catalogue-759cc6b86-gs4kd 1/1 Running 0 6m47s
catalogue-db-96f6f6b4c-mnhzl 1/1 Running 0 6m47s
front-end-5c89db9f57-79mvj 1/1 Running 0 6m47s
orders-7664c64d75-plbdk 1/1 Running 0 6m47s
orders-db-659949975f-8gzsr 1/1 Running 0 6m47s
payment-7bcdbf45c9-kcxbq 1/1 Running 0 6m46s
queue-master-5f6d6d4796-8dj6s 1/1 Running 0 6m46s
rabbitmq-5bcbb547d7-vwxxq 2/2 Running 0 6m46s
session-db-7cf97f8d4f-hr2mh 1/1 Running 0 6m46s
shipping-7f7999ffb7-dr5kq 1/1 Running 0 6m46s
user-68df64db9c-446wm 1/1 Running 0 6m46s
user-db-6df7444fc-dfjsn 1/1 Running 0 6m46s

ブラウザで http://192.168.123.201:30001 あるいは http://192.168.123.202:30001 にアクセスし、Sock ShopのUIが表示されれば正常に動作しています。

まとめ

本稿では、k0sに内蔵されているネットワークプラグインであるCalicoを利用する方法と、k0sに内蔵されていないWeave Netを利用する場合につまづいた点とその解決方法について見てみました。
k0sではKube-RouterとCalicoが設定で簡単に利用が可能となるほか、Weave Netに関してもk0s特有の事情はあるものの、一旦インストールしてしまえばまったく問題なく利用可能です。
手軽にKubernetesクラスタを構築できますので、是非おためしください。

Author

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

Daisuke Higuchiの記事一覧

新規CTA