zaki work log

作業ログやら生活ログやらなんやら

[kubernetes] kubeadmで構築した後トークン失効後にworkerノードを追加する

kubeadmでクラスタ構築するとworkerノード追加のためのコマンドが表示されて簡単にノード追加できるが、使用するtokenの期限が(デフォルトでは24時間で)切れてしまうため、同じ引数でkubeadm joinしてもこの通り、失敗する。

[zaki@k8s-worker03 ~]$ sudo kubeadm join 192.168.0.121:6443 --token 0di1qt.ju1y8vkmfhpxmytl \
    --discovery-token-ca-cert-hash sha256:73df38227ad8bd6332ae0abf6d20ccdaa1c0cf8b254e24e15f10187b1ea1acdb
W0405 09:04:09.959285    2158 join.go:346] [preflight] WARNING: JoinControlPane.controlPlane settings will be ignored when control-plane flag is not set.
[preflight] Running pre-flight checks
        [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
error execution phase preflight: couldn't validate the identity of the API Server: could not find a JWS signature in the cluster-info ConfigMap for token ID "0di1qt"
To see the stack trace of this error execute with --v=5 or higher

この場合、トークンを作り直せばOK

kubeadm token

トークンのリスト表示

期限内のトークンがあればlistサブコマンドでこの通り。
以下の出力であれば、あと17時間有効。

[zaki@k8s-master01 ~]$ kubeadm token list
TOKEN                     TTL         EXPIRES                     USAGES                   DESCRIPTION                                                EXTRA GROUPS
0di1qt.ju1y8vkmfhpxmytl   17h         2020-04-04T00:27:22+09:00   authentication,signing   The default bootstrap token generated by 'kubeadm init'.   system:bootstrappers:kubeadm:default-node-token

トークンが失効すると何も出力されなくなる。

[zaki@k8s-master01 ~]$ kubeadm token list
[zaki@k8s-master01 ~]$ 

戻り値は0なのでエラー扱いではない。

[zaki@k8s-master01 ~]$ kubeadm token list
[zaki@k8s-master01 ~]$ echo $?
0

トークンを作成

kubeadm token createトークンを新しく作成できる。
--print-join-commandも付与すれば、kubeadm joinするためのコマンドラインも表示される。

[zaki@k8s-master01 ~]$ kubeadm token create --print-join-command
W0405 10:15:01.686014  109747 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
kubeadm join 192.168.0.121:6443 --token hne2j7.8wjffv8ph2d2u10d     --discovery-token-ca-cert-hash sha256:73df38227ad8bd6332ae0abf6d20ccdaa1c0cf8b254e24e15f10187b1ea1acdb

トークンリストもこの通り。

[zaki@k8s-master01 ~]$ kubeadm token list
TOKEN                     TTL         EXPIRES                     USAGES                   DESCRIPTION                                                EXTRA GROUPS
hne2j7.8wjffv8ph2d2u10d   23h         2020-04-06T10:15:01+09:00   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token
[zaki@k8s-master01 ~]$ 

これでトークンが作成され、kubeadm joinするためのパラメタが用意できた。

トークンはあるが--discovery-token-ca-cert-hashの値が分からない場合

次のコマンドを実行する。

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
   openssl dgst -sha256 -hex | sed 's/^.* //'

実行例

[zaki@k8s-master01 ~]$ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
>    openssl dgst -sha256 -hex | sed 's/^.* //'
73df38227ad8bd6332ae0abf6d20ccdaa1c0cf8b254e24e15f10187b1ea1acdb

この出力にsha256:を頭につければOK

「ノードの追加」参照

新しいworkerノードをクラスタに追加

↑で表示されたkubeadm joinを新しくセットアップしたworkerノードで実行する。
master/worker共通のところ参照

[zaki@k8s-worker03 ~]$ sudo kubeadm join 192.168.0.121:6443 --token hne2j7.8wjffv8ph2d2u10d     --discovery-token-ca-cert-hash sha256:73df38227ad8bd6332ae0abf6d20ccdaa1c0cf8b254e24e15f10187b1ea1acdb
W0405 10:18:41.144431    5511 join.go:346] [preflight] WARNING: JoinControlPane.controlPlane settings will be ignored when control-plane flag is not set.
[preflight] Running pre-flight checks
        [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'
[kubelet-start] Downloading configuration for the kubelet from the "kubelet-config-1.18" ConfigMap in the kube-system namespace
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

[zaki@k8s-worker03 ~]$ 

しばらく待てば(kube-proxyやCNIのpodが追加したノードでも動き始めて)Ready状態になる

[zaki@k8s-master01 ~]$ kubectl get node
NAME                        STATUS   ROLES    AGE    VERSION
k8s-master01.esxi.jp-z.jp   Ready    master   2d9h   v1.18.0
k8s-worker01.esxi.jp-z.jp   Ready    <none>   2d9h   v1.18.0
k8s-worker02.esxi.jp-z.jp   Ready    <none>   2d9h   v1.18.0
k8s-worker03.esxi.jp-z.jp   Ready    <none>   50s    v1.18.0

k8s-worker03ノードが追加されました。


W0405 10:15:01.686014  109747 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]

この警告は無視してもいいんやろか…


通常の構築はこちら

zaki-hmkc.hatenablog.com