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 之间的信任关系与数据流向:

K8s PKI 证书关系与信任链 K8s PKI 证书关系与信任链 CA 根证书 自签名 · 信任锚点 服务端证书 API Server SANs: server.xxx, 10.0.0.1 客户端证书 kubelet / controller CN: system:node:node-01 kubeconfig 用户证书 kubectl / admin client-certificate-data kubeconfig CA 字段 certificate-authority-data Base64 编码的 CA 根证书 签发 签发 TLS 握手验证 嵌入 排障要点 1. CA 根证书过期 → 所有下级证书验证失败,集群通信中断。 2. kubeconfig 中的 CA 字段必须与集群实际 CA 一致,否则 kubectl 无法连接。

2.5 证书轮换排障清单

在证书轮换作业中,以下检查点可以帮助快速定位问题:

  1. 检查 CA 根证书有效期:openssl x509 -in /etc/kubernetes/pki/ca.crt -text -noout | grep -A2 Validity
  2. 检查 API Server 证书 SANs:确保包含所有集群访问地址(DNS、IP、负载均衡器地址)。
  3. 检查 kubelet 客户端证书 CN:必须为 system:node:<节点名>,否则节点无法注册。
  4. 检查 kubeconfig 中的 CA 数据:kubectl config view --raw -o jsonpath='{.clusters[0].cluster.certificate-authority-data}' | base64 -d | openssl x509 -text -noout | grep -A2 Validity
  5. 验证证书链完整性:openssl verify -CAfile /etc/kubernetes/pki/ca.crt /etc/kubernetes/pki/apiserver.crt
实战案例: 某集群出现 certificate has expired or is not yet valid 错误。排查发现 kubelet 客户端证书已过期,但 CA 根证书仍在有效期内。轮换 kubelet 证书后,节点恢复正常。