事象
kubeadmでKubernetesクラスタを運用していて、久しぶりにノード追加をしようと、新しいノードでkubeadm joinしたらconfigmaps "kubelet-config-1.13" is forbiddenというエラーになる場合があります。
おそらくは2018年12月頃より以前にクラスタを作成し、それ以降にノードを追加しようとした際に発生します。
[kubelet] Downloading configuration for the kubelet from the "kubelet-config-1.13" ConfigMap in the kube-system namespace
configmaps "kubelet-config-1.13" is forbidden: User "system:bootstrap:######" cannot get resource "configmaps" in API group "" in the namespace "kube-system"
原因
この時期の前後で、kubernetes.repoから導入するkubeadm,kubeletのバージョンが1.12から1.13に上がったと考えられます。すると、クラスタ作成時は1.12で作成されますが、ノード追加時に新規ノード側のkubeletが1.13になってしまい、バージョンが不整合になっていることが原因です。
内部的には、kubelet-config-1.12というConfigMapしかない状態で、新規ノードがkubelet-config-1.13を探しに行ってエラーになっています。
そのため、両者のバージョンを合わせる必要があります。今回は、クラスタ全体をバージョンアップするのではなく、新規ノードのバージョンをクラスタに合わせる方法で対応します。
手順
新規ノードでkubeadm,kubeletをインストールするときにバージョンを明示します。例えばyum系の場合は次のようにします。
# yum install -y kubelet-1.12.3-0 kubeadm-1.12.3-0 --disableexcludes=kubernetes
これで、kubeadm joinすれば問題なく通るはずです。
以上です。