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 验证流程:
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 自动管理,无需人工干预。
- kubeadm 管理的证书:使用
- 手动轮换(升级前检查):
- 使用
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 调度存在以下协同点:
- API Server 证书轮换: 轮换后需要重启 API Server,此时集群控制面短暂不可用。调度器无法创建新 Pod,已有 Pod 继续运行。建议在维护窗口执行,并确保 Pod 副本数足够。
- kubelet 证书轮换: kubelet 证书过期会导致 Node 状态变为
NotReady,调度器会将该 Node 上的 Pod 标记为Terminating并重新调度到其他 Node。轮换前应确保集群有足够的资源容量。 - 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 进行批量续期,再继续升级流程。