自动化 Kubernetes 证书轮换
本指南将帮助您在 中安装、了解和运行集群证书轮换,以自动轮换集群中的 Kubernetes 证书。
仅在需要证书轮换时使用此插件
Kubernetes 证书默认有效期为 10 年。启用此插件后,插件管理的证书将变为短期证书:kubelet 证书为 91 天,控制平面证书为 365 天。
自动续订会重启 API server 和 kubelet 等组件,这可能会影响集群可用性和业务工作负载。如果轮换时间超过 30 秒,节点可能变为 NotReady,其 Pod 可能会被驱逐。
如果不需要证书轮换,请勿安装此插件。
安装
请参阅集群插件,了解安装说明。
注意:
当前支持:
- On-Premises 集群
- DCS 集群
配置
以下是插件的默认证书设置。控制器使用为每种证书类型配置的续订阈值,并按配置的间隔检查证书。
证书设置
使用默认设置时,当剩余有效期少于 20% 或 30 天时(以先达到的阈值为准),证书会被续订。这对应于控制平面证书签发后约 292 天,以及 kubelet 证书签发后约 61 天。实际时间可能因一次检查间隔而有所差异。如果覆盖部署值,则以配置的续订阈值为准。
运行设置
覆盖证书设置
控制器接受以下插件参数。时长值使用 Go 的 time.Duration 格式;请使用小时,例如 8760h 或 720h(该格式支持 ns、us、ms、s、m 和 h 等单位)。
对于已安装的插件,请在 global 集群中编辑相应的 ModuleInfo。插件的 spec.config 是受支持的配置输入;cert-rotator valuesTemplates 会将这些字段映射到控制器使用的 chart 值:
找到已安装的实例并进行编辑:
有关高级插件 YAML 安装和配置,请参阅集群插件。请确保每个续订阈值都短于其对应的证书有效期。更改有效期也会导致续订有效期不同的证书。
工作原理
此插件会自动轮换以下证书。
轮换流程
-
加载证书信息
初始步骤包括收集所有目标证书的元数据。由于这些证书存储在主机上的不同路径中,因此必须从相应文件中读取其内容。为此,会在目标节点上创建一个临时 Pod,并挂载证书目录,使 Pod 能够读取相关信息。证书信息每天收集一次。证书详细信息(路径、到期时间)保存在 ConfigMap
cpaas-system/node-local-certs-<node-name>中。加密的 CA 证书存储在 Secretcpaas-system/kubernetes-ca中。 -
轮换触发条件
证书的
notBefore和notAfter字段表示有效期。默认情况下,当剩余有效期少于 20% 或 30 天时(以先达到的阈值为准),会触发轮换。控制器会对每种证书应用配置的续订阈值,因此,覆盖值优先。如果证书的有效期与预期持续时间不同,也会对其进行续订。 -
轮换队列
需要轮换的证书会加入处理队列。轮换程序会评估近期的轮换活动和待处理任务的紧迫程度,以决定是否立即处理这些任务。这可以防止同时轮换多个证书而导致潜在的集群运行状况问题。
-
生成新证书
轮换程序会根据内部存储的 CA 信息生成新证书。轮换过程会在目标节点上创建一个临时 Pod,并挂载必要的证书目录,以便以受控方式修改文件。
-
重启组件
需要重启:
kube-apiserver:需要重启以加载新证书。重启期间,它会重新生成其内部回环证书(有效期为一年,仅供内部使用,无法在外部轮换)。kube-controller-manager:需要重启以重新加载 kubeconfig 文件。kube-scheduler:需要重启以重新加载 kubeconfig 文件。kubelet:需要重启以重新加载服务器证书。
重启方法:向相应静态 Pod 的 YAML 文件添加注解,以触发 kubelet 重新创建 Pod。要重启 kubelet,请使用
hostPID is true挂载主机文件系统,并在容器中运行 "systemctl restart kubelet"。自动重新加载:
- Etcd 可以自动重新加载证书。
操作注意事项
如果 kubelet 在轮换窗口期间处于异常状态,无法自动轮换证书,则需要手动轮换:
操作员必须手动续订证书。
运行以下命令手动续订证书:
例如,续订 kubelet.crt:
运行以下命令下载并准备 cert-renew 工具:
也可以下载 renew-all.sh,以续订节点上的所有证书: