kubeadm ノードの追加

kubeadmのクラスターで新規ノードを追加したときの備忘録。

公式サイト

一般的にはコントロールプレーンノードでkubeadm initをしたときに出力されるkubeadm initを実行すれば良い

kubeadm join --token <token> <control-plane-host>:<control-plane-port> --discovery-token-ca-cert-hash sha256:<hash>

ただ、それを記録していなかった場合、24時間以内であれば、次のコマンドで<token>を取得可能

kubeadm token list

24時間たってしまい、上記で取得できない場合は、次のコマンドで新しいトークンを作成する必要がある。

kubeadm token create

--discovery-token-ca-cert-hash sha256:<hash>の値は、コントロールプレーンノードで次のコマンドチェーンを実行することで取得可能

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

実際に実行した結果

既存のクラスタ(kube01: master, kubeadm02: worker)にkubeadm03: workerを追加する

作業前の状態

[root@kube01 ~]# k get node
NAME        STATUS   ROLES                  AGE     VERSION
kube01      Ready    control-plane,master   7d18h   v1.21.0
kubeadm02   Ready    <none>                 7d18h   v1.21.0

トークンの作成

[root@kube01 ~]# kubeadm token list #何も表示されなかった場合、createを実施
[root@kube01 ~]# kubeadm token create
a2fybd.2j7fvqa71urarpl2

ca-certのハッシュ値確認

[root@kube01 ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
>    openssl dgst -sha256 -hex | sed 's/^.* //'
4ea2ed8b2642a06bcf4f9117e33b590b9d5e3209ba5ba2aec3e9e5326fe179c8

ipアドレスの確認

[root@kube01 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:50:56:8d:c4:88 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.249/24 brd 192.168.1.255 scope global noprefixroute ens192
       valid_lft forever preferred_lft forever
    inet6 fe80::b56b:899e:2c88:ab13/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
…

kubeadm03でkubeadm joinの実行(デフォルトの<control-plane-port>は6443)

[root@kubeadm03 ~]# kubeadm join --token a2fybd.2j7fvqa71urarpl2 192.168.1.249:6443 --discovery-token-ca-cert-hash sha256:4ea2ed8b2642a06bcf4f9117e33b590b9d5e3209ba5ba2aec3e9e5326fe179c8
[preflight] Running pre-flight checks
[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.

kubeadm03が追加されたことを確認

[root@kube01 ~]# k get nodes
NAME        STATUS     ROLES                  AGE     VERSION
kube01      Ready      control-plane,master   7d18h   v1.21.0
kubeadm02   Ready      <none>                 7d18h   v1.21.0
kubeadm03   NotReady   <none>                 7s      v1.21.0
[root@kube01 ~]# k get nodes
NAME        STATUS   ROLES                  AGE     VERSION
kube01      Ready    control-plane,master   7d18h   v1.21.0
kubeadm02   Ready    <none>                 7d18h   v1.21.0
kubeadm03   Ready    <none>                 13s     v1.21.0