Kubernetes 集群证书更新¶
为保证 Kubernetes 各组件之间的通信安全,组件之间的调用会进行 TLS 身份验证,执行验证操作需要配置集群 PKI 证书。
集群证书有效期为1年,为避免证书过期导致业务无法使用,请及时更新证书。
本文介绍如何手动进行证书更新。
检查证书是否过期¶
您可以执行以下命令查看证书是否过期:
输出类似于以下内容:
CERTIFICATE                EXPIRES                  RESIDUAL TIME   CERTIFICATE AUTHORITY   EXTERNALLY MANAGED
admin.conf                 Dec 14, 2024 07:26 UTC   204d                                    no      
apiserver                  Dec 14, 2024 07:26 UTC   204d            ca                      no      
apiserver-etcd-client      Dec 14, 2024 07:26 UTC   204d            etcd-ca                 no      
apiserver-kubelet-client   Dec 14, 2024 07:26 UTC   204d            ca                      no      
controller-manager.conf    Dec 14, 2024 07:26 UTC   204d                                    no      
etcd-healthcheck-client    Dec 14, 2024 07:26 UTC   204d            etcd-ca                 no      
etcd-peer                  Dec 14, 2024 07:26 UTC   204d            etcd-ca                 no      
etcd-server                Dec 14, 2024 07:26 UTC   204d            etcd-ca                 no      
front-proxy-client         Dec 14, 2024 07:26 UTC   204d            front-proxy-ca          no      
scheduler.conf             Dec 14, 2024 07:26 UTC   204d                                    no      
CERTIFICATE AUTHORITY   EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
ca                      Dec 12, 2033 07:26 UTC   9y              no      
etcd-ca                 Dec 12, 2033 07:26 UTC   9y              no      
front-proxy-ca          Dec 12, 2033 07:26 UTC   9y              no      
手动更新证书¶
您可以通过以下命令手动更新证书,只需带上合适的命令行选项。更新证书前请先备份当前证书。
更新指定证书:
更新全部证书:
更新后的证书可以在 /etc/kubernetes/pki 目录下查看,有效期延续 1 年。 以下对应的几个配置文件也会同步更新:
- /etc/kubernetes/admin.conf
 - /etc/kubernetes/controller-manager.conf
 - /etc/kubernetes/scheduler.conf
 
Note
- 如果您部署的是一个高可用集群,这个命令需要在所有控制节点上执行。
 - 此命令用 CA(或者 front-proxy-CA )证书和存储在 
/etc/kubernetes/pki中的密钥执行更新。 
重启服务¶
执行更新操作之后,你需要重启控制面 Pod。因为动态证书重载目前还不被所有组件和证书支持,所有这项操作是必须的。
静态 Pod 是被本地 kubelet 而不是 API 服务器管理,所以 kubectl 不能用来删除或重启他们。
要重启静态 Pod,你可以临时将清单文件从 /etc/kubernetes/manifests/ 移除并等待 20 秒。 参考 KubeletConfiguration 结构中的 fileCheckFrequency 值。
如果 Pod 不在清单目录里,kubelet 将会终止它。 在另一个 fileCheckFrequency 周期之后你可以将文件移回去,kubelet 可以完成 Pod 的重建,而组件的证书更新操作也得以完成。
Note
如果容器服务使用的是 Docker,为了让证书生效,可以使用以下命令对涉及到证书使用的几个服务进行重启:
更新 KubeConfig¶
构建集群时通常会将 admin.conf 证书复制到 $HOME/.kube/config 中,为了在更新 admin.conf 后更新 $HOME/.kube/config 的内容, 必须运行以下命令:
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
为 kubelet 配置证书轮换¶
完成以上操作后,基本完成了集群所有证书的更新,但不包括 kubelet。
因为 kubernetes 包含特性 kubelet 证书轮换, 在当前证书即将过期时, 将自动生成新的秘钥,并从 Kubernetes API 申请新的证书。 一旦新的证书可用,它将被用于与 Kubernetes API 间的连接认证。
Note
此特性适用于 Kubernetes 1.8.0 或更高的版本。
启用客户端证书轮换,配置参数如下:
-  
kubelet 进程接收 --rotate-certificates 参数,该参数决定 kubelet 在当前使用的 证书即将到期时,是否会自动申请新的证书。
 -  
kube-controller-manager 进程接收 --cluster-signing-duration 参数 (在 1.19 版本之前为 --experimental-cluster-signing-duration),用来控制签发证书的有效期限。
 
更多详情参考为 kubelet 配置证书轮换。
自动更新证书¶
为了更高效便捷处理已过期或者即将过期的 kubernetes 集群证书,可参考 k8s 版本集群证书更新。