Kubernetes でコントロールプレーンノード(マスターノード)を追加する場合、以下のように実行します。このコマンドで使用する token などの情報は、kubeadm で最初のマスターノードを構築した時点で含まれています。
sudo kubeadm join 10.0.1.180:6443 --token <token> \
--discovery-token-ca-cert-hash <discovery-token-ca-cert-hash> \
--control-plane --certificate-key <certificate-key>
しかし、何らかの理由で追加できない場合があります。以下は私の環境での例です。このエラーログから判断すると、kubeadm join コマンドが失敗した理由は、kubeadm-certsというシークレットがクラスターのkube-systemネームスペースに存在しないためです。このシークレットが存在しないか、期限切れになった可能性があります。
[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'
[preflight] Running pre-flight checks before initializing the new control plane instance
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
W0823 05:11:09.565428 3204 checks.go:844] detected that the sandbox image "registry.k8s.io/pause:3.8" of the container runtime is inconsistent with that used by kubeadm.It is recommended to use "registry.k8s.io/pause:3.9" as the CRI sandbox image.
[download-certs] Downloading the certificates in Secret "kubeadm-certs" in the "kube-system" Namespace
error execution phase control-plane-prepare/download-certs: error downloading certs: error downloading the secret: Secret "kubeadm-certs" was not found in the "kube-system" Namespace. This Secret might have expired. Please, run kubeadm init phase upload-certs --upload-certs on a control plane to generate a new one
To see the stack trace of this error execute with --v=5 or higher
私の環境では、以下の方法で解決しました。
まず、既存のコントロールプレーンノードで以下のコマンドを実行し、証明書を再度アップロードします。これにより、新しい kubeadm-certs シークレットが生成されます。一見、既存のクラスターに影響がある?と思いましたが、それは問題ありません。このコマンドで新しい certificate-key が作成されます。
sudo kubeadm init phase upload-certs --upload-certs
次に、以下のコマンドで新しい kubeadm join コマンドを作成します。
sudo kubeadm token create --print-join-command --certificate-key <certificate-key>
出力されたコマンドをを新しいコントロールプレーンノードで実行することで、問題なくクラスターに追加できました。
Kubernetes コントロールプレーンノードを追加できない場合