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ではなく、CalicoとWeave 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クラスタを構築できますので、是非おためしください。