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)
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すれば良かった。

  1. 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"""`
    *****
    
  2. kubeletの再起動

    Restart-Service kubelet
    
  3. 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コンテナを気軽に立ち上げて遊ぶことができるようになった。

さてなにをしようか…。