2、K8s证书体系基础:K8s中使用的证书类型(CA、Server、Client、ServiceAccount)、证书生命周期管理

2.1 证书体系概述

Kubernetes 集群的安全通信建立在 双向 TLS(mTLS) 基础之上。集群内所有组件之间的通信(kube-apiserver、kubelet、kube-controller-manager、kube-scheduler、kube-proxy 等)均通过 X.509 证书进行身份验证和加密。理解证书类型及其生命周期管理,是安全执行集群升级和证书轮换的前提。

核心原则: Kubernetes 不依赖外部 PKI 系统,而是内置了一套基于 集群根 CA 的证书签发体系。所有组件证书均由集群自身的 CA 签发,形成信任链。

2.2 证书类型与用途

Kubernetes 集群中主要使用以下四种证书类型,每种证书对应不同的通信角色和验证场景:

证书类型 签发对象 用途说明 常见文件命名
CA 证书 集群根证书颁发机构 用于签发其他所有组件证书,是信任链的锚点。集群内所有组件必须信任同一个根 CA。 ca.crt、ca.key
Server 证书 API Server、kubelet 服务端身份验证。客户端(如 kubectl、kube-scheduler)通过验证服务端证书来确认连接的是合法组件。 apiserver.crt、kubelet.crt
Client 证书 kube-controller-manager、kube-scheduler、kube-proxy、kubectl 用户 客户端身份验证。服务端(API Server)通过验证客户端证书来确认请求来源的合法性。 admin.crt、controller-manager.crt
ServiceAccount 证书 Pod 内的 ServiceAccount 用于 Pod 与 API Server 之间的身份验证。Kubernetes 自动为每个 Namespace 的 ServiceAccount 签发证书,并挂载到 Pod 中。 service-account.crt(自动管理)
关键区别: Server 证书和 Client 证书在 X.509 标准中通过 Extended Key Usage (EKU) 字段区分。Server 证书包含 serverAuth 扩展,Client 证书包含 clientAuth 扩展。ServiceAccount 证书本质上是 Client 证书的一种特殊形式,由 Controller 自动管理。

2.3 证书信任链与通信流程

下图展示了 Kubernetes 集群中证书的信任链结构以及组件之间的双向 TLS 验证流程:

K8s 证书信任链与双向 TLS 通信流程 K8s 证书信任链与双向 TLS 通信流程 集群根 CA CA 签发:为所有组件签发证书 Server 证书 API Server / kubelet Client 证书 kube-scheduler / kubectl ServiceAccount 证书 Pod → API Server 双向 TLS 验证流程 ① 客户端连接 API Server ② API Server 出示 Server 证书 ③ 客户端验证 Server 证书(CA 签名) ④ 客户端出示 Client 证书 ⑤ API Server 验证 Client 证书(CA 签名)

2.4 证书生命周期管理

Kubernetes 证书的生命周期管理涉及 签发、有效期、轮换、吊销 四个关键阶段。证书过期是集群升级和日常运维中最常见的故障原因之一。

2.4.1 证书有效期与默认值

证书类型 默认有效期 管理方式 轮换触发条件
集群根 CA 10 年 手动管理(kubeadm 初始生成) 过期前手动轮换
API Server 证书 1 年 kubeadm 自动续期(kubeadm certs renew) 到期前 90 天自动触发
kubelet 证书 1 年 kubelet 自动轮换(RotateKubeletServerCertificate 特性) 到期前 80% 时间自动触发
ServiceAccount 证书 自动管理 Controller 自动签发/轮换 Pod 重建或 过期
kubectl 用户证书 1 年(kubeadm 默认) 手动或通过 kubeadm certs renew admin.conf 过期前手动更新
常见陷阱: 许多运维人员误以为 kubelet 证书会自动轮换,但实际上 kubelet 客户端证书(用于连接 API Server)默认不会自动轮换,需要启用 RotateKubeletClientCertificate 特性。在升级前务必检查 kubelet 证书的剩余有效期。

2.4.2 证书轮换策略

证书轮换策略分为 自动轮换 和 手动轮换 两种模式:

  • 自动轮换(推荐):
    • kubeadm 管理的证书:使用 kubeadm certs renew --config=kubeadm-config.yaml 批量续期。
    • kubelet 证书:启用 RotateKubeletServerCertificate 和 RotateKubeletClientCertificate 特性门控。
    • ServiceAccount 证书:由 Controller 自动管理,无需人工干预。
  • 手动轮换(升级前检查):
    • 使用 openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text | grep -A2 "Validity" 检查有效期。
    • 使用 kubeadm certs check-expiration 查看所有证书的过期时间。
    • 手动替换证书后,需要重启对应组件(kube-apiserver、kube-controller-manager、kube-scheduler)。

2.4.3 证书轮换与 Pod 调度的协同关系

在集群升级过程中,证书轮换与 Pod 调度存在以下协同点:

  1. API Server 证书轮换: 轮换后需要重启 API Server,此时集群控制面短暂不可用。调度器无法创建新 Pod,已有 Pod 继续运行。建议在维护窗口执行,并确保 Pod 副本数足够。
  2. kubelet 证书轮换: kubelet 证书过期会导致 Node 状态变为 NotReady,调度器会将该 Node 上的 Pod 标记为 Terminating 并重新调度到其他 Node。轮换前应确保集群有足够的资源容量。
  3. ServiceAccount 证书轮换: 自动轮换对 Pod 无影响,但手动轮换需要重建所有使用该 ServiceAccount 的 Pod,否则 Pod 无法通过 API Server 的身份验证。
最佳实践: 在集群升级前,使用 kubeadm certs check-expiration 检查所有证书的有效期。如果证书将在 30 天内过期,先执行证书轮换再升级,避免升级过程中证书过期导致集群不可用。

2.5 证书文件结构

kubeadm 部署的集群证书文件默认存储在 /etc/kubernetes/pki/ 目录下,结构如下:

/etc/kubernetes/pki/
├── ca.crt                   # 集群根 CA 证书(公钥)
├── ca.key                   # 集群根 CA 私钥(机密)
├── apiserver.crt            # API Server 证书
├── apiserver.key            # API Server 私钥
├── apiserver-kubelet-client.crt  # API Server 连接 kubelet 的客户端证书
├── apiserver-kubelet-client.key  # 对应私钥
├── front-proxy-ca.crt       # 前端代理 CA 证书(用于聚合 API)
├── front-proxy-client.crt   # 前端代理客户端证书
├── front-proxy-client.key   # 对应私钥
├── etcd/
│   ├── ca.crt               # etcd 集群 CA 证书
│   ├── server.crt           # etcd 服务端证书
│   ├── server.key           # etcd 服务端私钥
│   └── peer.crt             # etcd 对等通信证书
└── sa.pub                   # ServiceAccount 公钥
    sa.key                   # ServiceAccount 私钥
注意: sa.pub 和 sa.key 用于签发 ServiceAccount 的 JWT ,不是标准的 X.509 证书,但属于证书体系的一部分。轮换 ServiceAccount 密钥需要重建所有 Pod。

2.6 证书验证命令速查

以下命令用于快速检查证书的有效期和详细信息:

# 查看所有证书过期时间(kubeadm 集群)
kubeadm certs check-expiration

# 查看单个证书的详细信息
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text | grep -E "Validity|Subject|Issuer"

# 验证证书是否由指定 CA 签发
openssl verify -CAfile /etc/kubernetes/pki/ca.crt /etc/kubernetes/pki/apiserver.crt

# 查看证书的 SAN(Subject Alternative Name)
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text | grep -A1 "Subject Alternative Name"
升级前必做: 在开始集群升级之前,务必执行 kubeadm certs check-expiration 并记录所有证书的过期时间。如果发现证书将在升级窗口内过期,先执行 kubeadm certs renew all 进行批量续期,再继续升级流程。