2. K8s证书体系概述:K8s内部证书类型与生命周期管理

Kubernetes 集群的安全通信完全建立在 双向 TLS(mTLS) 之上。集群内每个组件(etcd、kube-apiserver、kubelet、kube-controller-manager、kube-scheduler)都持有由集群根 CA 签发的数字证书,用于身份验证和通信加密。理解这些证书的类型、用途及生命周期,是实现零停机证书轮换的理论基础。

2.1 核心证书类型与用途

K8s 集群主要包含以下三类核心证书,它们分别服务于不同的通信链路:

证书类型 签发对象 主要用途 通信链路
etcd 证书 etcd 节点、etcd 客户端 etcd 集群成员间通信(peer)、客户端与 etcd 通信(client) etcd ↔ etcd、apiserver ↔ etcd
kube-apiserver 证书 kube-apiserver 实例 对外暴露 HTTPS API,验证客户端身份(kubectl、kubelet、scheduler) 客户端 ↔ apiserver、apiserver ↔ kubelet
kubelet 证书 每个 Node 上的 kubelet kubelet 向 apiserver 注册、提供 kubelet API、接收 apiserver 指令 kubelet ↔ apiserver、apiserver ↔ kubelet
关键认知: 证书轮换的核心难点不在于签发新证书,而在于新旧证书交替期间,所有依赖该证书的组件必须平滑切换,不中断正在进行的连接。这正是亲和性调度策略要解决的核心问题。

2.2 证书生命周期管理

K8s 证书的生命周期包含四个阶段:签发 → 分发 → 使用 → 轮换。每个阶段都可能成为零停机部署的瓶颈。

2.2.1 证书签发与有效期

  • 自签发 vs CA 签发: 生产环境强烈建议使用独立的集群根 CA(Certificate Authority)统一签发所有组件证书,而非自签名证书。CA 签发的证书便于集中管理和吊销。
  • 默认有效期: kubeadm 部署的集群默认证书有效期为 1 年(365 天)。etcd 证书通常为 5 年或 10 年,但建议统一缩短至 1 年以降低泄露风险。
  • 证书续期触发条件: 当证书剩余有效期低于阈值(如 30 天)时,必须启动轮换流程。K8s 1.21+ 支持 kubelet --rotate-certificates 自动轮换 kubelet 证书,但 apiserver 和 etcd 证书仍需手动或借助工具(如 cert-manager)处理。

2.2.2 证书分发与挂载

证书文件通常以 Secret 或 ConfigMap 形式挂载到 Pod 中。对于静态 Pod(如 kube-apiserver、etcd),证书直接存放在宿主机文件系统路径下(如 /etc/kubernetes/pki/)。

# 典型证书文件结构(kubeadm 部署)
/etc/kubernetes/pki/
├── apiserver.crt
├── apiserver.key
├── apiserver-kubelet-client.crt
├── apiserver-kubelet-client.key
├── ca.crt                  # 集群根 CA 证书
├── etcd/
│   ├── ca.crt
│   ├── server.crt
│   ├── server.key
│   ├── peer.crt
│   └── peer.key
└── front-proxy-ca.crt
⚠️ 常见陷阱: 证书文件权限必须严格限制。私钥文件(.key)通常设置为 600 或 400,证书文件(.crt)设置为 644。错误的权限会导致组件启动失败或安全漏洞。

2.3 证书轮换的核心挑战

证书轮换并非简单的文件替换。以下三个挑战直接决定了是否需要引入亲和性调度策略:

  1. 连接中断: 替换证书后,已建立的 TLS 连接不会自动使用新证书。如果组件不支持动态证书重载(如 etcd 3.4 以下版本),必须重启进程,导致所有客户端连接中断。
  2. 新旧证书共存: 在轮换窗口期内,部分组件可能持有旧证书,部分持有新证书。如果新旧 CA 不同,会导致跨组件认证失败。
  3. 静态 Pod 重启: kube-apiserver 和 etcd 通常以静态 Pod 运行,替换证书后需要 kubelet 重新拉取 Pod 清单,这会导致短暂的 API 不可用。
💡 零停机思路: 通过亲和性调度将客户端 Pod 与证书更新后的服务端 Pod 绑定在同一节点,利用本地通信减少网络延迟和证书验证失败概率。同时,采用滚动更新策略,确保集群中始终有可用的服务端实例。

2.4 证书体系架构图

下图展示了 K8s 集群内部各组件之间的证书依赖关系与通信链路:

K8s 证书体系架构图 K8s 集群证书体系与通信链路 集群根 CA (ca.crt) etcd 证书 server.crt / peer.crt kube-apiserver 证书 apiserver.crt kubelet 证书 kubelet-client.crt mTLS 双向认证 apiserver → kubelet kubectl / 客户端 kube-controller-manager kube-scheduler 📌 说明: 所有证书均由集群根 CA 统一签发。etcd 与 apiserver 之间使用 mTLS 双向认证;apiserver 与 kubelet 之间使用单向 TLS + 客户端证书认证。 证书轮换时,需确保所有链路在切换窗口期内保持连通

2.5 证书轮换策略对比

针对不同组件,证书轮换策略存在显著差异。下表对比了三种主流轮换方式:

轮换策略 适用组件 是否需重启 零停机支持 复杂度
静态文件替换 + 重启 etcd、kube-apiserver(静态 Pod) 是 ❌ 不支持 低
动态证书重载 kubelet(--rotate-certificates)、Ingress Controller 否 ✅ 支持 中
滚动更新 + 亲和性调度 所有组件(需配合多副本) 是(滚动) ✅ 支持 高
课程聚焦: 本课程将重点讲解第三种策略——滚动更新 + 亲和性调度。通过将客户端 Pod 调度到已更新证书的服务端 Pod 所在节点,确保在滚动过程中,客户端始终与持有有效证书的服务端通信,从而实现真正的零停机证书轮换。

2.6 证书生命周期时间线

一个完整的证书生命周期管理流程如下:

  1. 签发阶段: 使用集群 CA 签发新证书,设置有效期(建议 365 天)。
  2. 分发阶段: 将新证书通过 Secret 或直接文件挂载到目标组件。
  3. 生效阶段: 组件加载新证书(通过重启或动态重载)。
  4. 共存阶段: 新旧证书同时存在于集群中,客户端需能同时信任两者。
  5. 清理阶段: 确认所有组件已使用新证书后,吊销或删除旧证书。
⚠️ 关键时间点: 证书过期前 30 天应触发轮换预警。如果证书已过期,所有基于该证书的 TLS 连接将立即失败,导致集群功能瘫痪。务必配置证书过期监控(如 Prometheus + cert-exporter)。