4. kube-proxy 证书体系:客户端证书、kubeconfig 结构与 TLS 握手

kube-proxy 作为运行在每个工作节点上的关键组件,负责维护节点上的网络规则并代理 Service 流量。它与 kube-apiserver 之间的通信依赖 客户端证书认证,理解其证书体系是进行证书轮换与规则迁移测试的前提。

4.1 kube-proxy 使用的客户端证书

kube-proxy 使用由集群 CA 签发的 客户端证书 向 kube-apiserver 发起 TLS 连接。该证书通常包含以下关键属性:

属性字段 典型值 / 说明
Common Name (CN) system:kube-proxy — 标识该证书属于 kube-proxy 组件
Organization (O) system:node-proxier — 用于 RBAC 绑定,授予代理相关权限
Key Usage Digital Signature, Key Encipherment
Extended Key Usage Client Authentication — 仅用于客户端身份验证
签发者 集群 CA(如 kubernetes-ca)
运维要点: 证书轮换时需确保新证书的 CN 和 O 字段与旧证书完全一致,否则 RBAC 绑定可能失效,导致 kube-proxy 无法正常 watch EndpointSlice 或 Node 资源。

4.2 kubeconfig 文件结构分析

kube-proxy 的客户端凭据存储在 /etc/kubernetes/kube-proxy.conf 或由 kubeadm 生成的 /var/lib/kube-proxy/kubeconfig 文件中。该 kubeconfig 包含三个核心段:

apiVersion: v1
kind: Config
clusters:
- cluster:
    certificate-authority-data: <base64-CA-cert>   # 信任的集群 CA
    server: https://<apiserver-endpoint>:6443
  name: kubernetes
users:
- name: kube-proxy
  user:
    client-certificate-data: <base64-client-cert>  # kube-proxy 客户端证书
    client-key-data: <base64-client-key>           # 对应的私钥
contexts:
- context:
    cluster: kubernetes
    user: kube-proxy
  name: kube-proxy-context
current-context: kube-proxy-context
配置段 作用 轮换影响
clusters[].certificate-authority-data 验证 apiserver 服务端证书的签发者 CA 轮换时需同步更新
users[].client-certificate-data kube-proxy 向 apiserver 出示的身份凭证 客户端证书轮换时替换
users[].client-key-data 与客户端证书配对的私钥 必须与证书同时轮换
contexts[].context 绑定集群与用户,定义当前生效配置 通常不变,除非集群名称变更
轮换风险提示: 直接修改 kubeconfig 文件时,务必使用 kubectl config set-credentials 或原子替换方式,避免因文件写入中断导致 kube-proxy 读取到不完整的凭据,造成代理规则丢失。

4.3 证书与 kube-apiserver 的 TLS 握手过程

kube-proxy 启动后持续与 kube-apiserver 建立 TLS 连接,以 watch EndpointSlice、Service、Node 等资源。完整的 TLS 握手流程如下:

  1. TCP 连接建立: kube-proxy 向 apiserver 的 6443 端口发起 TCP 三次握手。
  2. Client Hello: kube-proxy 发送支持的 TLS 版本、密码套件列表。
  3. Server Hello + 服务端证书: apiserver 返回选定的 TLS 参数及其服务端证书(含公钥)。
  4. 证书验证(kube-proxy 侧): kube-proxy 使用 kubeconfig 中的 certificate-authority-data 验证 apiserver 证书的签名链与有效期。
  5. Client Certificate + CertificateVerify: kube-proxy 将自己的客户端证书发送给 apiserver,并用私钥对握手摘要签名。
  6. 服务端验证客户端证书: apiserver 使用集群 CA 验证客户端证书的签名,并检查 CN/O 字段是否匹配 RBAC 绑定。
  7. 对称密钥协商完成: 双方通过密钥交换算法生成会话密钥,后续通信使用对称加密。
关键结论: 握手过程中任何一方的证书过期、CA 不信任、CN/O 不匹配都会导致 TLS 握手失败,kube-proxy 将无法从 apiserver 获取最新的 Service 和 Endpoint 信息,进而造成节点上的 iptables/ipvs 规则无法更新。
kube-proxy ↔ kube-apiserver TLS 握手流程 kube-proxy (客户端) kube-apiserver (服务端) ① TCP 三次握手 ② Client Hello ③ Server Hello + 服务端证书 ④ 验证服务端证书 (CA) ⑤ 客户端证书 + CertificateVerify ⑥ 验证客户端证书 (CA + RBAC) ⑦ 对称密钥协商完成 → 加密通信

4.4 证书轮换对 kube-proxy 规则迁移的影响

在集群升级过程中,证书轮换与 kube-proxy 规则迁移存在以下关联风险点:

风险场景 现象 验证方法
客户端证书过期 kube-proxy 日志报 tls: bad certificate,无法 watch 资源 openssl x509 -in /var/lib/kube-proxy/pki/kube-proxy.crt -noout -dates
CA 证书轮换未同步 kube-proxy 无法验证 apiserver 新证书,连接被拒绝 检查 kubeconfig 中 certificate-authority-data 是否与集群 CA 一致
CN/O 字段变更 RBAC 绑定失效,kube-proxy 无权限访问 EndpointSlice kubectl auth can-i --as=system:kube-proxy list endpointslices
私钥与证书不匹配 TLS 握手阶段 CertificateVerify 失败 openssl x509 -noout -modulus -in cert.crt | openssl md5 与私钥比对
最佳实践: 在证书轮换前,先使用 kubectl --kubeconfig=/etc/kubernetes/kube-proxy.conf get nodes 验证当前 kubeconfig 可用性;轮换后立即重启 kube-proxy Pod 并观察日志,确认 TLS 握手成功且规则同步正常。
kube-proxy kubeconfig 文件结构与证书关系 kube-proxy kubeconfig 文件 clusters[].cluster server: https://apiserver:6443 certificate-authority-data (CA 公钥,验证服务端) users[].user client-certificate-data (客户端证书,身份凭证) client-key-data (私钥,签名用) contexts[].context cluster: kubernetes, user: kube-proxy 引用 轮换时需同时更新 client-certificate-data 和 client-key-data,并确保 CA 数据与集群一致