Docker Desktop for Windows にて Kubernetes を有効化出来ないとき

 

Docker Desktop から Kubernetes を起動しようとすると、ぐるぐるが終わらずにスタック状態となる場合があります。

PowerShell上から

Get-Content C:\Users\foo\appdata\local\Docker\log.txt -wait -tail 0

でログを観察してみると、

[12:48:25.326][GoBackendProcess ][Info ] external: POST /events 200 \”Go-http-client/1.1\” \”\
[12:48:26.340][ApiProxy ][Info ] cannot list nodes: Get https://kubernetes.docker.internal:6443/api/v1/nodes: x509: certificate signed by unknown authority

のような感じで延々繰り返していることがわかります。

cannot list nodes: Get https://kubernetes.docker.internal:6443/api/v1/nodes: EOF

の場合もあります。

これを解決してみます。

手順

  1. Docker Desktop for Windows をアンインストール

  2. C:\Users\foo\.kube を削除

  3. Hyper-Vを無効化(OS再起動が要求されるので再起動します)

  4. C:\Windows\System32\drivers\etc\hosts に kubernetes.docker.internal を追加
    127.0.0.1       kubernetes.docker.internal
  5. 管理者権限コマンドプロンプトにて
    netsh int ipv4 add excludedportrange protocol=tcp startport=6443 numberofports=1
    を行い、6443/tcpを予約

  6. Hyper-Vを有効化(OS再起動が要求されるので再起動します)

  7. 管理者権限コマンドプロンプトにて
    netsh int ipv4 show excludedportrange protocol=tcp
    を行い、6443/tcpが除外予約されていることを確認

  8. Docker Desktop for Windows をインストール

  9. Docker Desktop for Windows を起動し、必要な設定を行う
    ※この時点ではまだ Kubernetes を有効化しません

  10. Proxy配下でない時は15.に

  11. Proxy配下の時は、GUI上にてProxy/noProxyとDNSを設定


  12. Docker Desktop for Windows を一旦終了

  13. Proxy配下の時は、C:\Users\foo\.docker\config.json にProxy/noProxyを設定
    config.jsonの例
    {
      "auths":
      {
        "https://index.docker.io/v1/":{}
      },
      "credsStore":"desktop",
      "proxies":
      {
        "default":
        {
          "httpProxy":"http://yourid%40yourdomain:yourpass@proxy-ip:proxy-port",
          "httpsProxy":"http://yourid%40yourdomain:yourpass@proxy-ip:proxy-port",
          "noProxy":"127.0.0.1,localhost,*.internal,*.local,your-docker-subnet/24"
        }
      },
      "stackOrchestrator":"swarm"
    }
  14. Docker Desktop for Windows を起動

  15. ログの監視を開始
    Get-Content C:\Users\foo\appdata\local\Docker\log.txt -wait -tail 0
  16. Kubernetes を有効化


  17. https://kubernetes.docker.internal:6443/api/v1/nodes:… が出続けますが、しばらくすると消えます
    [10:12:29.091][GoBackendProcess  ][Info   ] adding tcp forward from 127.0.0.1:6443 to 127.0.0.1:6443
    [10:12:29.098][LinuxWSL2Engine   ][Info   ] time="2020-07-31T01:12:29Z" level=info msg="adding tcp forward from 127.0.0.1:6443 to 127.0.0.1:6443"
    [10:12:29.098][GoBackendProcess  ][Info   ] external: POST /forwards/expose/port 200 \"Go-http-client/1.1\" \"\
    [10:12:29.099][ApiProxy          ][Info   ] waiting for kube-system pods
    [10:12:29.100][GoBackendProcess  ][Info   ] external: POST /events 200 \"Go-http-client/1.1\" \"\
    [10:12:29.100][ApiProxy          ][Info   ] waiting for node to be ready
    [10:12:29.100][GoBackendProcess  ][Info   ] external: POST /events 200 \"Go-http-client/1.1\" \"\
    [10:12:30.129][ApiProxy          ][Info   ] cannot list nodes: Get https://kubernetes.docker.internal:6443/api/v1/nodes: EOF
    :
    :
    [10:13:56.923][ApiProxy          ][Info   ] Cluster is ready
    :
    :
    [10:13:56.924][GoBackendProcess  ][Info   ] external: POST /events 200 \"Go-http-client/1.1\" \"\
    [10:13:56.924][ApiProxy          ][Info   ] waiting for system pods
    [10:13:56.924][GoBackendProcess  ][Info   ] external: POST /events 200 \"Go-http-client/1.1\" \"\
    [10:13:59.945][ApiProxy          ][Info   ] 0/3 system pods running, found labels  but still waiting for labels k8s-app=kube-dns, component=kube-controller-manager, component=kube-apiserver...
    :
    :
    [10:14:56.953][GoBackendProcess  ][Info   ] external: POST /events 200 \"Go-http-client/1.1\" \"\
    [10:14:57.956][ApiProxy          ][Info   ] 3/3 system pods running
    [10:14:57.957][GoBackendProcess  ][Info   ] external: POST /events 200 \"Go-http-client/1.1\" \"\
    [10:14:57.976][ApiProxy          ][Info   ] installing compose-on-kubernetes and storage-provisioner
    :
    :
    [10:15:00.870][GoBackendProcess  ][Info   ] external: POST /events 200 \"Go-http-client/1.1\" \"\
    [10:15:00.871][ApiProxy          ][Info   ] 0/2 system pods running, found labels  but still waiting for labels component=storage-provisioner, component=vpnkit-controller...
    :
    :
    [10:15:12.064][GoBackendProcess  ][Info   ] internal: GET /forwards/list 200 \"Go-http-client/1.1\" \"\
    [10:15:12.880][ApiProxy          ][Info   ] 2/2 system pods running
    [10:15:12.888][GoBackendProcess  ][Info   ] external: POST /events 200 \"Go-http-client/1.1\" \"\
    :
    :
    [10:15:23.985][ApiProxy          ][Info   ] kubernetes is up and running
  18. GUI上の表示が Kubernetes running となったら、動作確認
    C:\>kubectl get nodes
    NAME             STATUS   ROLES    AGE   VERSION
    docker-desktop   Ready    master   86m   v1.16.6-beta.0

  19. \(^o^)/

以上です。