2. K8s PKI 基础:CA根证书、服务端证书、客户端证书、kubeconfig中的证书字段解析
Kubernetes 集群的通信安全完全建立在 PKI(公钥基础设施)之上。理解证书链的构成、各角色的证书用途以及 kubeconfig 中的证书字段,是进行证书轮换与审计排障的前提。本节将拆解 K8s 的 PKI 四层模型,并解析其核心字段。
2.1 K8s PKI 四层模型
K8s 的 PKI 体系分为四个层级,每一层解决不同的信任问题:
| 层级 | 组件 | 证书类型 | 核心作用 |
|---|---|---|---|
| L1 | 集群 CA | 自签名根证书 | 签发所有下级证书,是集群信任的锚点 |
| L2 | API Server | 服务端证书 | 对外提供 HTTPS 服务,客户端验证服务端身份 |
| L3 | kubelet / kube-controller / scheduler | 客户端证书 | 向 API Server 发起请求时证明自身身份 |
| L4 | kubectl / ServiceAccount | 用户/SA 证书 | 嵌入 kubeconfig,用于用户认证与授权 |
排障要点: 根证书(CA)的私钥一旦泄露或过期,整个集群的信任链将断裂。轮换作业中,CA 证书的更新优先级最高,且必须同步更新所有下级证书。
2.2 核心证书字段解析
无论是 PEM 格式的证书文件,还是 kubeconfig 中嵌入的证书数据,都遵循 X.509 v3 标准。以下字段是排障时最常检查的:
- Subject (主体):标识证书持有者。例如
CN=system:node:node-01表示该证书属于节点node-01。 - Issuer (签发者):标识签发该证书的 CA。例如
CN=kubernetes-ca。 - Not Before / Not After (有效期):证书生效与失效时间。轮换排障时,
Not After是最常检查的字段。 - Subject Alternative Names (SANs):证书允许的域名或 IP 列表。API Server 证书必须包含所有可能的访问地址。
- Key Usage & Extended Key Usage (密钥用途):限制证书的使用场景。服务端证书必须包含
serverAuth,客户端证书必须包含clientAuth。
排障命令示例: 使用
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -text -noout 查看 API Server 证书的 SANs 和有效期。
2.3 kubeconfig 中的证书字段
kubeconfig 文件(通常位于 ~/.kube/config)是用户与集群交互的凭证。其核心证书字段如下:
| 字段路径 | 内容 | 排障场景 |
|---|---|---|
clusters[].cluster.certificate-authority-data |
Base64 编码的 CA 根证书 | 客户端验证 API Server 身份时使用 |
users[].user.client-certificate-data |
Base64 编码的用户客户端证书 | 向 API Server 证明用户身份 |
users[].user.client-key-data |
Base64 编码的用户私钥 | 用于 TLS 握手签名 |
users[].user. |
Bearer (非证书场景) | ServiceAccount 或静态 认证 |
安全警告:
client-key-data 字段包含私钥的 Base64 编码。切勿将 kubeconfig 文件提交到版本控制系统或在不安全的通道中传输。
2.4 K8s PKI 证书关系图
下图展示了 K8s 集群中 CA 根证书、服务端证书、客户端证书以及 kubeconfig 之间的信任关系与数据流向:
2.5 证书轮换排障清单
在证书轮换作业中,以下检查点可以帮助快速定位问题:
- 检查 CA 根证书有效期:
openssl x509 -in /etc/kubernetes/pki/ca.crt -text -noout | grep -A2 Validity - 检查 API Server 证书 SANs:确保包含所有集群访问地址(DNS、IP、负载均衡器地址)。
- 检查 kubelet 客户端证书 CN:必须为
system:node:<节点名>,否则节点无法注册。 - 检查 kubeconfig 中的 CA 数据:
kubectl config view --raw -o jsonpath='{.clusters[0].cluster.certificate-authority-data}' | base64 -d | openssl x509 -text -noout | grep -A2 Validity - 验证证书链完整性:
openssl verify -CAfile /etc/kubernetes/pki/ca.crt /etc/kubernetes/pki/apiserver.crt
实战案例: 某集群出现
certificate has expired or is not yet valid 错误。排查发现 kubelet 客户端证书已过期,但 CA 根证书仍在有效期内。轮换 kubelet 证书后,节点恢复正常。