2. K8s PKI 基础:CA证书、服务端证书、客户端证书、kubeconfig文件中的证书结构

Kubernetes 集群的通信安全完全建立在 PKI(公钥基础设施)之上。理解 CA 证书、服务端证书、客户端证书以及 kubeconfig 文件中的证书结构,是进行证书轮换和节点通信兼容性排查的前提。本节将拆解这四类证书的职责、关系与存储形式。

2.1 四类证书的核心职责

K8s 使用双向 TLS(mTLS)进行组件间认证与加密。每一类证书在握手过程中扮演不同角色:

证书类型 签发对象 核心职责 典型文件
CA 证书 集群根 CA 签发所有其他证书,验证对端证书的合法性 ca.crt
服务端证书 API Server、kubelet 向客户端证明自身身份,加密通信 apiserver.crt、kubelet.crt
客户端证书 kubelet、scheduler、controller-manager、kubectl 向服务端证明自身身份,获取授权 kubelet-client.crt、admin.crt
kubeconfig 证书 用户/组件 将客户端证书、CA 证书、私钥打包为可移植配置 admin.conf、kubelet.conf
关键认知: CA 证书是信任锚点。服务端证书和客户端证书都由同一个集群 CA 签发,但它们的 X.509 扩展属性(如 Extended Key Usage、Subject Alternative Name)不同,决定了各自的使用场景。

2.2 证书链与双向验证流程

下图展示了 K8s 组件间使用 mTLS 进行握手时,CA 证书、服务端证书和客户端证书的交互关系:

K8s 双向 TLS 证书链与验证流程 K8s 双向 TLS 证书链与验证流程 集群根 CA (ca.crt) 服务端证书 (apiserver.crt / kubelet.crt) 客户端证书 (admin.crt / kubelet-client.crt) mTLS 双向验证 验证流程: 1. 客户端连接服务端时,出示客户端证书;服务端用 CA 公钥验证其合法性。 2. 服务端返回服务端证书;客户端用 CA 公钥验证服务端身份。 信任链:CA 证书 → 服务端/客户端证书(均由同一 CA 签发) 任何一方无法出示由可信 CA 签发的证书,连接将被拒绝

2.3 证书的 X.509 关键字段对比

服务端证书和客户端证书在 X.509 标准中的关键字段存在差异,这些差异决定了证书能否在特定场景下被接受:

X.509 字段 服务端证书 客户端证书 说明
Extended Key Usage (EKU) serverAuth clientAuth 必须匹配使用场景,否则 TLS 握手失败
Subject Alternative Name (SAN) 包含 DNS 名称、IP 地址 通常包含用户名或 UID 服务端证书必须包含客户端访问的地址
Common Name (CN) 主机名或服务名 用户名或组件名 K8s 1.20+ 中 CN 不再用于 RBAC 绑定
Organization (O) 通常为空或集群名 用户组(如 system:masters) 用于 RBAC 授权判断
轮换兼容性陷阱: 如果新签发的服务端证书缺少旧客户端所期望的 SAN 条目(例如 kubelet 的 IP 地址),或者 EKU 字段被错误设置为 clientAuth,将导致节点间 TLS 握手失败。排查兼容性时,必须对比新旧证书的 SAN 和 EKU 字段。

2.4 kubeconfig 文件中的证书结构

kubeconfig 文件是 K8s 中分发证书和连接信息的标准格式。一个典型的 kubeconfig 文件包含三个核心段,其中两个直接涉及证书:

apiVersion: v1
kind: Config
clusters:
- cluster:
    certificate-authority-data: <base64 编码的 CA 证书>   # 信任锚点
    server: https://192.168.1.100:6443
  name: kubernetes
users:
- name: admin
  user:
    client-certificate-data: <base64 编码的客户端证书>   # 身份凭证
    client-key-data: <base64 编码的客户端私钥>           # 私钥
contexts:
- context:
    cluster: kubernetes
    user: admin
  name: default-context
current-context: default-context

kubeconfig 中的证书结构可以拆解为以下逻辑关系:

kubeconfig 文件中的证书结构 kubeconfig 文件中的证书结构 clusters[] certificate-authority-data ↓ CA 证书(验证服务端) users[] client-certificate-data client-key-data 客户端证书 + 私钥 contexts[] cluster: kubernetes user: admin 关联集群与用户 轮换操作要点: • 轮换 CA 证书时,必须更新所有 kubeconfig 中的 certificate-authority-data。 • 轮换客户端证书时,只需更新对应 user 的 client-certificate-data 和 client-key-data。 • 如果新旧 CA 不同,需要确保 kubeconfig 中包含新旧两个 CA 证书(多 CA 信任)。

2.5 证书轮换时的兼容性检查清单

在进行证书轮换作业前,建议对照以下清单逐项检查新旧证书的兼容性:

  1. CA 一致性: 新证书是否由集群当前信任的 CA 签发?如果 CA 已轮换,kubeconfig 中是否包含新 CA?
  2. EKU 匹配: 服务端证书的 EKU 是否包含 serverAuth?客户端证书是否包含 clientAuth?
  3. SAN 覆盖: 新服务端证书的 SAN 是否包含所有节点 IP、ClusterIP、DNS 名称?
  4. 密钥算法: 新旧证书是否使用相同的密钥算法(如 RSA 2048、ECDSA P256)?算法不匹配可能导致某些旧客户端无法加载。
  5. 有效期重叠: 轮换期间是否设置了新旧证书的有效期重叠窗口,避免因时间偏差导致验证失败?
实战建议: 在非生产环境先执行一次完整的证书轮换演练,使用 openssl x509 -text -noout 命令对比新旧证书的 EKU、SAN、Issuer 字段。确保所有 kubeconfig 文件中的 certificate-authority-data 与当前集群 CA 一致,这是节点通信兼容性的第一道防线。