Kubernetes 证书自动轮换

本指南将帮助你在 中安装、了解和运行 Kubernetes 证书轮换器,从而自动轮换集群中的 Kubernetes 证书。

NOTE

从 ACP 4.5 开始,Kubernetes Certificates Rotator 更名为 Cluster Certificate Rotation。从 Customer Portal 下载插件时,请搜索 Cluster Certificate Rotation。在更名之前发布的插件包上传后,在平台中仍会显示为 Kubernetes Certificates Rotator。

安装

请参阅 集群插件,了解安装说明。

注意:

  • 当前支持:

    • 本地部署集群
    • DCS 集群

工作原理

此插件可自动轮换以下证书。

证书文件功能节点类型
apiserver.crtkube-apiserver 的服务器证书控制平面节点
apiserver-etcd-client.crtkube-apiserver 访问 etcd 的客户端证书控制平面节点
apiserver-kubelet-client.crtkube-apiserver 访问 kubelet 的客户端证书控制平面节点
front-proxy-client.crtkube-apiserver 访问聚合 API 服务器的客户端证书控制平面节点
etcd/server.crtetcd 的服务器证书控制平面节点
etcd/peer.crtetcd 成员之间通信的对等证书控制平面节点
/root/.kube/config, admin.conf, super-admin.conf用于集群管理的 kubeconfig 客户端证书控制平面节点
controller-manager.confkube-controller-manager 的 kubeconfig 客户端证书控制平面节点
scheduler.confkube-scheduler 的 kubeconfig 客户端证书控制平面节点
kubelet.crtkubelet 的服务器证书所有节点
kubelet-client-current.pemkubelet 的客户端证书(由 kubelet.conf 引用)所有节点

轮换流程

  1. 加载证书信息

    首先收集所有目标证书的元数据。由于这些证书存储在主机上的不同路径中,因此必须从相应文件读取其内容。为此,系统会在目标节点上创建一个临时 Pod,并挂载证书目录,以便 Pod 读取相关信息。证书信息每天收集一次。证书详细信息(路径、到期时间)保存在 ConfigMap cpaas-system/node-local-certs-<node-name> 中。加密的 CA 证书保存在 Secret cpaas-system/kubernetes-ca 中。

  2. 轮换触发条件

    证书的 notBefore 和 notAfter 字段表示有效期。当剩余有效期不足 20% 或少于 30 天时,将触发轮换。

  3. 轮换队列

    需要轮换的证书会加入队列进行处理。轮换程序会评估近期的轮换活动以及待处理任务的紧迫程度,以决定是否立即处理。这样可以避免同时轮换多个证书可能导致的集群健康问题。

  4. 生成新证书

    轮换程序会根据内部存储的 CA 信息生成新证书。轮换过程中,系统会在目标节点上创建一个临时 Pod,并挂载所需的证书目录,以便按受控方式修改文件。

  5. 重启组件

    需要重启:

    • kube-apiserver:需要重启以加载新证书。重启期间,它会重新生成内部回环证书(有效期为一年,仅供内部使用,无法从外部轮换)。
    • kube-controller-manager:需要重启以重新加载 kubeconfig 文件。
    • kube-scheduler:需要重启以重新加载 kubeconfig 文件。
    • kubelet:需要重启以重新加载服务器证书。

    重启方法:在相应静态 Pod 的 YAML 文件中添加注解,触发 kubelet 重新创建 Pod。要重启 kubelet,请使用 hostPID is true 挂载主机文件系统,并在容器中运行 "systemctl restart kubelet"。

    自动重新加载:

    • etcd 可以自动重新加载证书。
  6. 轮换时间

    • kubelet 证书:在第 61 天轮换(有效期为 91 天)
    • 控制平面证书:在第 292 天轮换(有效期为 365 天)

操作注意事项

如果 kubelet 在轮换窗口期间处于异常状态,无法自动轮换证书,则需要手动轮换:

操作员必须手动续订证书。

运行以下命令手动续订证书:

cert-renew --ca-cert <ca-cert-path> --ca-key <ca-key-path> --days <days> <certificate or kubeconfig 1> <certificate or kubeconfig 2> ...

例如,续订 kubelet.crt:

cert-renew --ca-cert /etc/kubernetes/pki/ca.crt --ca-key /etc/kubernetes/pki/ca.key --days 91 /etc/kubernetes/pki/kubelet.crt

要下载并准备 cert-renew 工具,请运行:

curl "$(kubectl get services -n cpaas-system frontend -o jsonpath='{.spec.clusterIP}'):8080/cluster-cert-rotator/download/cert-renew" -o ./cert-renew && chmod +x ./cert-renew

也可以下载 renew-all.sh,以续订节点上的所有证书:

curl "$(kubectl get services -n cpaas-system frontend -o jsonpath='{.spec.clusterIP}'):8080/cluster-cert-rotator/download/renew-all.sh" -o ./renew-all.sh