kube-apiserver中service-account-key-file参数的影响

在用二进制方式安装k8s集群时,安装完master组件时,使用systemctl status命令查看master各组件状态时都正常,接着加入node组件,使用kubectl get nodes查看节点状态,结果显示no resource,这显然是kubelet没有注册成功,接下来使用journalctl -xeu kubelet来查看kubelet的日志。

发现一个这样的错误:

E0309 14:38:08.191651 1046698 reflector.go:123] k8s.io/kubernetes/pkg/kubelet/kubelet.go:459: Failed to list *v1.Node: nodes "192.168.88.180" is forbidden: User "system:anonymous" ...

看到这里我就很奇怪了,因为我已经开启了bootstrap认证,并且绑定了对应的角色,这里是不应该用anonymous去和apiserver通信的。

之后查阅资料发现bootstrap认证是需要kube-controller-manager参与的,接下来就是查看kube-controller-manager的日志,发现以下错误:

F0309 14:36:22.461671 1048173 client_builder.go:238] unable to get token for service account: timed out waiting for the condition

看到这里就可以知道应该是和kube-controller-manager的service-account-private-key-file参数有关,但是我能肯定这个参数设置的值没有问题,接下来突然发现kube-apiserver有个类似的参数service-account-key-file,这时才发现是这个参数错了,这两个参数所对应的key和crt应该是一一对应的,而我service-account-key-file的值是之前卸载时残留下来的,导致二者不匹配,所以kube-controller-manager拿不到service account对应的token,从而所有使用bootstrap token和kube-apiserver通信的组件都无法与kube-apiserver通信。

既然知道了原因,解决方法就很简单了,重新生成一个service-account-key-file需要的证书,并与service-account-private-key-file参数指定的key对应就可以了。

你可能感兴趣的:(kube-apiserver中service-account-key-file参数的影响)