kindでクラスタが起動しない原因を調べる
kind create cluster
コマンドでKubernetesクラスタが起動しない場合、以下のようなメッセージが表示されます。
✗ Starting control-plane 🕹️ ERROR: failed to create cluster: failed to init node with kubeadm: command "docker exec --privileged kind-control-plane kubeadm init --ignore-preflight-errors=all --config=/kind/kubeadm.conf --skip-token-print --v=6" failed with error: exit status 1
クラスタが起動しない原因を調査するには以下の方法があります。
- kindコマンドのログレベルを上げる
- kindノードコンテナの内部に入って、Control Planeのログを調査する
kindコマンドのログ
kindコマンドに -v
オプションを渡すと詳細なログが表示されるようになります。例えば -v10
を渡すと以下のようなログが表示されます。
Creating cluster "kubelogin-acceptance-test" ... DEBUG: docker/images.go:70] Pulling image: kindest/node:v1.17.0@sha256:9512edae126da271b66b990b6fff768fbb7cd786c7d39e86bdf55906352fdf62 ... ✓ Ensuring node image (kindest/node:v1.17.0) 🖼 ✓ Preparing nodes 📦 DEBUG: config/config.go:90] Using kubeadm config: apiVersion: kubeadm.k8s.io/v1beta2 clusterName: kind controlPlaneEndpoint: 172.17.0.3:6443 controllerManager: extraArgs: enable-hostpath-provisioner: "true" kind: ClusterConfiguration kubernetesVersion: v1.17.0 (以下略)
kindコマンドのログからは、kubeadmに渡す設定ファイルの内容、Control Planeで使うイメージ、Control Planeの各設定ファイルのパスなどが分かります。kindコンテナの内部に入って調査する時の材料になります。
kindノードコンテナの内部にあるログ
kindではノードコンテナの内部でKubernetesクラスタが動いています。ノードコンテナのIDや名前は以下のようにdocker psコマンドで確認できます。
% docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 38ea3c1f766a kindest/node:v1.17.0 "/usr/local/bin/entr…" About a minute ago Up About a minute 127.0.0.1:32768->6443/tcp kind-control-plane
kindノードコンテナの内部ではsystemdが動いています。systemdのログは以下のようにdocker logsコマンドで確認できます。
% docker logs kind-control-plane INFO: ensuring we can execute /bin/mount even with userns-remap INFO: remounting /sys read-only (中略) Welcome to Ubuntu 19.10! [ OK ] Started Dispatch Password …ts to Console Directory Watch. [ OK ] Listening on Journal Socket. Mounting FUSE Control File System... Starting Remount Root and Kernel File Systems... (以下は抜粋) Starting containerd container runtime... [ OK ] Started kubelet: The Kubernetes Node Agent. [ OK ] Started containerd container runtime.
このように、ノードコンテナの起動時にsystemdがcontainerdやkubeletを実行して、Control Planeの各コンポーネントが実行される流れになっています。
各コンポーネントのログを確認するには、以下のようにノードコンテナの内部に入る必要があります。
% docker exec -it kind-control-plane /bin/bash
kindノードコンテナの内部では以下のプロセスが動いています。
- apiserver(コンテナとして動作)
- kube-controller-manager(コンテナとして動作)
- kube-scheduler(コンテナとして動作)
- etcd(コンテナとして動作)
- kubelet(プロセスとして動作)
これらが立ち上がると以下のコンテナも動き始めます。
- kube-proxy
- coredns
- kindnet
- local-path-provisioner
各コンテナのマニフェストは /etc/kubernetes/manifests/
にあります。
# ls -la /etc/kubernetes/manifests/ total 24 drwxr-xr-x 1 root root 4096 Jan 24 11:53 . drwxr-xr-x 1 root root 4096 Jan 24 11:53 .. -rw------- 1 root root 1805 Jan 24 11:53 etcd.yaml -rw------- 1 root root 3204 Jan 24 11:53 kube-apiserver.yaml -rw------- 1 root root 3090 Jan 24 11:53 kube-controller-manager.yaml -rw------- 1 root root 1120 Jan 24 11:53 kube-scheduler.yaml
また、各コンテナのログは /var/log/containers/
にあります。
# ls -la /var/log/containers/ total 28 drwxr-xr-x 2 root root 4096 Jan 24 12:45 . drwxr-xr-x 4 root root 4096 Jan 24 11:53 .. lrwxrwxrwx 1 root root 114 Jan 24 11:53 etcd-... lrwxrwxrwx 1 root root 136 Jan 24 12:45 kube-apiserver-... lrwxrwxrwx 1 root root 152 Jan 24 11:53 kube-controller-manager-... lrwxrwxrwx 1 root root 134 Jan 24 11:53 kube-scheduler-...
kubeletのログはどこに出力されるか分かりませんでした。詳しい人教えてください。 kubeletのログは下記のコマンドで確認できます。
# journalctl -u kubelet Jan 27 01:25:58 kubelogin-acceptance-test-control-plane systemd[1]: Started kubelet: The Kubernetes Node Agent. (以下略)
これらの設定ファイルやログを参照すると、クラスタが起動しない原因が分かると思います。例えば、apiserverの引数が間違っている場合はapiserverコンテナに以下のログが出ます。
# cat /var/log/containers/kube-apiserver-... 2020-01-24T11:56:18.6797274Z stderr F I0124 11:56:18.679446 1 server.go:596] external host was not specified, using 172.17.0.3 2020-01-24T11:56:18.6807181Z stderr F I0124 11:56:18.680394 1 server.go:150] Version: v1.17.0 2020-01-24T11:56:18.9807349Z stderr F Error: invalid authentication config: 'oidc-issuer-url' ("http://localhost") has invalid scheme ("http"), require 'https' 2020-01-24T11:56:18.9827157Z stderr F Usage: 2020-01-24T11:56:18.9827978Z stderr F kube-apiserver [flags] 2020-01-24T11:56:18.9828244Z stderr F 2020-01-24T11:56:18.9828494Z stderr F Generic flags: 2020-01-24T11:56:18.9828729Z stderr F (以下略)
kindにはログを一括エクスポートする機能があります。詳しくは https://kind.sigs.k8s.io/docs/user/quick-start/#exporting-cluster-logs を参照してください。
See Also
- kindの内部構造は https://kind.sigs.k8s.io/docs/design/initial/ が参考になります。
- kubeadmの動作は https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/ が参考になります。