Kubernetes(k8s)での新しいnodeの追加方法の話

Kubernetes(以下k8s)において、nodeを新規に追加する方法の手順を簡単にまとめておきます。

nodeの追加ってmasterのinitで発行されるjoinコマンドを実行すれば?とお思いでしょうが、しばらくすると有効期限が切れます…
今回は新しいtokenを発行してnodeを追加するまでの手順をまとめておきます。

terget

wataru@gitlab:~$ kubectl version
Client Version: version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.5", GitCommit:"c285e781331a3785a7f436042c65c5641ce8a9e9", GitTreeState:"clean", BuildDate:"2022-03-16T15:58:47Z", GoVersion:"go1.17.8", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.3", GitCommit:"816c97ab8cff8a1c72eccca1026f7820e93e0d25", GitTreeState:"clean", BuildDate:"2022-01-25T21:19:12Z", GoVersion:"go1.17.6", Compiler:"gc", Platform:"linux/amd64"}

初期状態の確認

はじめに現在の状態を確認します。
gitlabはmasterの名前w

$ kubectl get nodes
NAME     STATUS     ROLES                  AGE   VERSION
gitlab   NotReady   control-plane,master   38d   v1.23.5

現在はnodeがmasterのみの状態です。

この状態でmasterをinitした最後に発行されるjoinコマンドを実行してもNGとなります…

nodeでmaster init当時のjoinを発行してみる

wataru@k8s-node0:~ $ sudo kubeadm join 192.168.1.201:6443 --token 8hpycp.vrfnwjs1dz7j1zui --discovery-token-ca-cert-hash sha256:d0ec69c988e37f3488623a6ce8e7e4acd8d017ee2c8e59e22e5ce1f9883fbbb3
[preflight] Running pre-flight checks
... 無応答 ...

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 "8hpycp"
To see the stack trace of this error execute with --v=5 or higher

token ID “8hpycp”が見つかりませんとなります。

tokenの状態確認

実際現在のtoken発行状態を確認します

wataru@gitlab:~$ sudo kubeadm token list

何も出ません… tokenは現在発行されていない状態となっております

tokenの発行

tokenの発行はシンプルです、token createすればOKです

wataru@gitlab:~$ sudo kubeadm token create
jsochb.hljwdwugdnfwkvpy

はい、リストで確認すると

wataru@gitlab:~$ sudo kubeadm token list
TOKEN                     TTL         EXPIRES                USAGES                   DESCRIPTION                                                EXTRA GROUPS
jsochb.hljwdwugdnfwkvpy   23h         2022-03-25T03:49:26Z   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token

24時間くらい有効なtokenが発行されます!

新しいtokenでnodeを追加(join)する

新しいtokenの場合は問題なく追加されます

wataru@k8s-node0:~ $ sudo kubeadm join 192.168.1.201:6443 --token jsochb.hljwdwugdnfwkvpy --discovery-token-ca-cert-hash sha256:d0ec69c988e37f3488623a6ce8e7e4acd8d017ee2c8e59e22e5ce1f9883fbbb3
[preflight] Running pre-flight checks
	[WARNING SystemVerification]: missing optional cgroups: hugetlb
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[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.

はい、ちゃんと追加されたようです。
実際の参加の確認はmasterにてget nodesを発行すればOKです

wataru@gitlab:~$ kubectl get nodes
NAME        STATUS     ROLES                  AGE    VERSION
gitlab      NotReady   control-plane,master   41d    v1.23.5
k8s-node0   NotReady   <none>                 115s   v1.23.5

追加されました!(NotReadyですが)

終いに

今回はk8sでしばらく経ったけどnode追加ってどうやったっけ?という覚書です。

k8s-node0はraspberry piなのですが、corednsとkube-flannelが動いていないというまだまだな状態ですが、登録方法は変わらないのでメモを残しておきました

nodeの削除方法

追加は良いけど削除ってどうするのって話ですが、masterでdeleteすればOKです

wataru@gitlab:~$ kubectl get nodes
NAME        STATUS     ROLES                  AGE     VERSION
gitlab      NotReady   control-plane,master   41d     v1.23.5
k8s-node0   NotReady   <none>                 5m25s   v1.23.5

wataru@gitlab:~$ kubectl delete nodes k8s-node0
node "k8s-node0" deleted

wataru@gitlab:~$ kubectl get nodes
NAME     STATUS     ROLES                  AGE   VERSION
gitlab   NotReady   control-plane,master   41d   v1.23.5

 です。

masterのnodeを削除したら、node端末をresetするというのをセットで考えたほうが良いです

pi@k8s-node0:~ $ sudo kubeadm reset
[reset] WARNING: Changes made to this host by 'kubeadm init' or 'kubeadm join' will be reverted.
[reset] Are you sure you want to proceed? [y/N]: y
[preflight] Running pre-flight checks
W0324 13:05:40.266119  732080 removeetcdmember.go:80] [reset] No kubeadm config, using etcd pod spec to get data directory
[reset] No etcd config found. Assuming external etcd
[reset] Please, manually reset etcd to prevent further issues
[reset] Stopping the kubelet service
[reset] Unmounting mounted directories in "/var/lib/kubelet"
[reset] Deleting contents of config directories: [/etc/kubernetes/manifests /etc/kubernetes/pki]
[reset] Deleting files: [/etc/kubernetes/admin.conf /etc/kubernetes/kubelet.conf /etc/kubernetes/bootstrap-kubelet.conf /etc/kubernetes/controller-manager.conf /etc/kubernetes/scheduler.conf]
[reset] Deleting contents of stateful directories: [/var/lib/kubelet /var/lib/dockershim /var/run/kubernetes /var/lib/cni]

The reset process does not clean CNI configuration. To do so, you must remove /etc/cni/net.d

The reset process does not reset or clean up iptables rules or IPVS tables.
If you wish to reset iptables, you must do so manually by using the "iptables" command.

If your cluster was setup to utilize IPVS, run ipvsadm --clear (or similar)
to reset your system's IPVS tables.

The reset process does not clean your kubeconfig files and you must remove them manually.
Please, check the contents of the $HOME/.kube/config file.

discovery-token-ca-cert-hashの話

はい、tokenのca-certってなんじゃら?
これは、serverの認証キーですね。
今回のtokenとは違いますし、サーバごとに一意なのでコピペでは使えません。

確認方法は…

wataru@gitlab:~$ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
d0ec69c988e37f3488623a6ce8e7e4acd8d017ee2c8e59e22e5ce1f9883fbbb3

これで生成できます。
このtoken hashをsha256:の後ろにつければ動作します。
結構sha256を忘れてしまうので要注意です