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 版本集群证书更新。