Microk8sのクラスタにWindowsのWorkerを追加する
目次
Microk8sクラスタにWindows ServerをWorker Nodeとして追加しようとしたらつまずいたので設定をメモ
概要
基本的には公式ドキュメント https://microk8s.io/docs/add-a-windows-worker-node-to-microk8s に従えば良いが、いくつか留意点があったのでメモしておく。
環境
- OS
- Linux側: Ubuntu 24.04
- ControllerはAMD64、WorkerはARM64
- Windows側: Windows Server 2022 Datacenter (ServerCore)
- Linux側: Ubuntu 24.04
NAME VERSION OS-IMAGE CONTAINER-RUNTIME
controller(amd64) v1.33.0 Ubuntu 24.04.3 LTS containerd://1.7.27
worker-win(amd64) v1.33.1 Windows Server 2022 Datacenter containerd://1.6.6
worker-lin(arm64) v1.33.4 Ubuntu 24.04.3 LTS containerd://1.7.27
難しいところ
IPv4/IPv6 Dual Stackには非対応っぽい
nodeはReadyになったが、Podを立ち上げようとするとエラーが出てContainerCreatingのまま動かなかった。
エラー内容は以下の通り:
C:\k\kubelet.err.log
E0830 19:56:52.419299 4900 log.go:32] "RunPodSandbox from runtime service failed" err="rpc error: code = Unknown desc = failed to setup network for sandbox \"5150e65f3623b55661696cebc6740766438f028099e42a190c6c5dd7d4f24367\": plugin type=\"calico\" name=\"Calico\" failed (add): failed to create the new HostComputeEndpoint: hcnCreateEndpoint failed in Win32: The provided policy configuration is invalid or missing parameters. (0x803b000d) {\"Success\":false,\"Error\":\"指定されたポリシー構成は、無効であるか、パラメーターが不足しています。 \",\"ErrorCode\":2151350285}"
日本語環境には非対応っぽい
具体的なログは取り忘れてしまったが、どこかのログにnetshか何かで日本語が文字化けし、正規表現の抽出がエラーになっているログを見つけたため、ロケールを英語に変更して再インストールした。
kubeletの証明書にIPが入らない
Containerが作成されて動くようになったが、いざテストをしてみると証明書エラーで kubectl run ができなかった。
suuei@controller:~/k8s$ microk8s kubectl run test-pod -it --image mcr.microsoft.com/windows/nanoserver:ltsc2022 --overrides '{"spec": {"nodeSelector": {"kubernetes.io/os": "windows"}}}'
If you don't see a command prompt, try pressing enter.
warning: couldn't attach to pod/test-pod, falling back to streaming logs: Internal error occurred: error sending request: Post "https://192.168.0.11:10250/attach/default/test-pod/test-pod?input=1&output=1&tty=1": tls: failed to verify certificate: x509: cannot validate certificate for 192.168.0.11 because it doesn't contain any IP SANs
Error from server: Get "https://192.168.0.11:10250/containerLogs/default/test-pod/test-pod": tls: failed to verify certificate: x509: cannot validate certificate for 192.168.0.11 because it doesn't contain any IP SANs
これは、Windowsのkubelet起動オプションに --rotate-server-certificates=true
を加えてkubeletを再起動し、Controller側でCSRをApproveすれば良かった。
-
Windowsのkubelet起動オプション変更
C:\Users\Administrator>fc C:\CalicoWindows\kubernetes\kubelet-service.ps1.bak C:\CalicoWindows\kubernetes\kubelet-service.ps1 Comparing files C:\CALICOWINDOWS\KUBERNETES\kubelet-service.ps1.bak and C:\CALICOWINDOWS\KUBERNETES\KUBELET-SERVICE.PS1 ***** C:\CALICOWINDOWS\KUBERNETES\kubelet-service.ps1.bak "--rotate-certificates=true",` "--kubeconfig=""c:\k\config"""` ***** C:\CALICOWINDOWS\KUBERNETES\KUBELET-SERVICE.PS1 "--rotate-certificates=true",` "--rotate-server-certificates=true",` "--kubeconfig=""c:\k\config"""` *****
-
kubeletの再起動
Restart-Service kubelet
-
CSRをApprove
suuei@controller:~$ microk8s kubectl get csr NAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITION csr-5jvmp 14s kubernetes.io/kubelet-serving system:node:worker-win <none> Pending csr-scsbl 8m32s kubernetes.io/kube-apiserver-client-kubelet admin <none> Approved,Issued suuei@controller:~$ microk8s kubectl certificate approve csr-5jvmp certificatesigningrequest.certificates.k8s.io/csr-5jvmp approved suuei@controller:~$ microk8s kubectl get csr NAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITION csr-5jvmp 47s kubernetes.io/kubelet-serving system:node:worker-win <none> Approved,Issued csr-scsbl 9m5s kubernetes.io/kube-apiserver-client-kubelet admin <none> Approved,Issued
おわりに
そこそこ詰まる部分もあって苦労したが、これでWindowsコンテナを気軽に立ち上げて遊ぶことができるようになった。
さてなにをしようか…。