Kubelet证书过期¶
kubelet节点日志显示客户端证书过期:
E0427 15:38:51.829964 63737 bootstrap.go:205] Part of the existing bootstrap client certificate is expired: 2020-02-23 15:48:00 +0000 UTC
I0427 15:38:51.830135 63737 bootstrap.go:61] Using bootstrap kubeconfig to generate TLS client cert, key and kubeconfig file
I0427 15:38:51.830667 63737 certificate_store.go:131] Loading cert/key pair from "/etc/kubernetes/pki/kubelet-client-current.pem".
I0427 15:38:51.842565 63737 bootstrap.go:235] Failed to connect to apiserver: the server has asked for the client to provide credentials
I0427 15:38:54.222238 63737 bootstrap.go:235] Failed to connect to apiserver: the server has asked for the client to provide credentials
...
kubelet v1.11.0开始,支持 rotateCertificates: true
,默认开启支持了自动客户端证书更新。
使用命令 ps aux | grep kubelet
可以看到开启参数:
--feature-gates=RotateKubeletClientCertificate=true,RotateKubeletServerCertificate=true
如果你使用的是CentOS,可以编辑 /etc/sysconfig/kubelet
配置:
KUBELET_EXTRA_ARGS=--fail-swap-on=false --feature-gates=RotateKubeletClientCertificate=true,RotateKubeletServerCertificate=true
但是,在我这个案例中,由于服务器端异常不断重启,导致客户端证书更新没有生效。而apiserver稳定之后,客户端证书已经过期。所以需要修复这个客户端证书过期异常。
解决方法是重新生成客户端证书
kubelet好像有一个
bootstrap-kubelet.conf
配置了证书失效的时间,停止kubelet,然后等待超时时间过期(10分钟),然后再次启动kubelet。另外也可以移除旧证书:
rm /var/lib/kubelet/pki/kubelet-server-current.pem
然后重启kubelet:
systemctl restart kubelet
不过,上述操作有可能并没有解决 kubelet-client-current.pem 问题,我查询到 How to renew certificates on kubernetes 1.14.x 这个文档应该可以解决这个问题,但是操作比较复杂,需要线下演练。
备注
另外,如果apiserver服务器的证书过期,有一个解决方案 how to renew the certificate when apiserver cert expired? #581 我准备在适当时候验证一下