Cilium 证书体系:TLS 证书在 Cilium 中的作用(mTLS、Hubble、ClusterMesh)

Cilium 作为一个基于 eBPF 的云原生网络、安全与可观测性平台,其内部通信的安全性高度依赖 TLS 证书体系。理解证书在 Cilium 不同组件间的角色,是进行证书轮换作业与故障排查的基础。本章将深入剖析 mTLS、Hubble 以及 ClusterMesh 场景下的证书作用机制。

3.1 证书体系总览:三大核心场景

Cilium 的证书体系并非单一用途,而是根据通信双方的身份和网络层级,分为三个主要应用场景。下表总结了各场景的证书用途、通信对象及关键特征:

场景 通信对象 证书用途 关键特征
mTLS (节点间) Cilium Agent ↔ Cilium Agent 节点身份认证与加密隧道 基于 SPIFFE 标准,用于节点间 Overlay 或 Direct Routing 加密
Hubble (可观测性) Hubble Relay ↔ Hubble UI / Hubble CLI API 服务端与客户端双向认证 保护 gRPC 和 HTTP API 通信,防止未授权访问
ClusterMesh (集群互联) Cilium Agent (集群A) ↔ Cilium Agent (集群B) 跨集群节点身份认证与加密 基于 SPIFFE 的联邦信任域,用于跨集群 Service 通信
核心概念: 所有场景均基于 SPIFFE (Secure Production Identity Framework for Everyone) 标准。Cilium 为每个节点颁发一个 SPIFFE ID(如 spiffe://cluster.local/ns/kube-system/sa/cilium-agent),证书轮换本质上是更新与这个 ID 绑定的 X.509 证书。

3.2 mTLS:节点间通信的信任基石

在 Cilium 的加密节点间通信(如使用 WireGuard 或 IPsec 时),mTLS 证书用于建立节点之间的信任关系。其工作流程如下:

  1. 身份声明: 每个 Cilium Agent 启动时,会从 Kubernetes Secret 或文件系统中加载其节点证书和私钥。
  2. 连接发起: 当 Agent A 需要与 Agent B 建立加密隧道时,Agent A 首先发起 TLS 握手。
  3. 双向验证:
    • Agent A 向 Agent B 出示其证书,证明自己是合法的节点。
    • Agent B 验证 Agent A 的证书是否由受信任的 CA 签发,且 SPIFFE ID 匹配。
    • Agent B 同样向 Agent A 出示其证书,完成双向验证。
  4. 密钥协商: 验证通过后,双方通过 TLS 握手协商出对称加密密钥,用于后续的数据面加密。
故障排查要点: 如果 mTLS 证书过期或 CA 证书不匹配,Cilium Agent 日志中会出现 tls: bad certificate 或 x509: certificate has expired or is not yet valid 错误,导致节点间隧道无法建立,进而引发 Pod 间通信中断。

3.3 Hubble:可观测性 API 的安全防护

Hubble 组件(Relay、UI、CLI)之间的通信同样依赖 TLS 证书。Hubble Relay 作为 gRPC 服务端,Hubble UI 和 CLI 作为客户端,它们之间通过 mTLS 进行身份验证和通信加密。

  • Hubble Relay 证书: 作为服务端证书,用于向客户端证明自己的身份。客户端(UI/CLI)验证该证书是否由 Hubble CA 签发。
  • Hubble UI/CLI 证书: 作为客户端证书,用于向 Relay 证明自己的身份。Relay 验证客户端证书是否由 Hubble CA 签发,从而控制访问权限。
  • CA 证书: 用于签发和验证所有 Hubble 组件证书。CA 证书的轮换是所有 Hubble 组件证书轮换的前提。
常见故障: 当 Hubble UI 无法连接 Relay 时,常见原因包括:
1. Hubble Relay 证书过期。
2. Hubble UI 使用的 CA 证书与 Relay 的 CA 证书不一致。
3. 客户端证书未正确挂载到 Hubble UI Pod 中。

3.4 ClusterMesh:跨集群联邦的信任模型

ClusterMesh 允许跨 Kubernetes 集群的 Pod 直接通信。其证书体系比单集群更复杂,涉及跨集群的信任域联邦。

下图展示了 ClusterMesh 场景下,两个集群之间建立信任关系的证书交互流程:

ClusterMesh 跨集群 mTLS 证书交互流程 集群 A (Cluster A) Cilium Agent A SPIFFE ID: A CA 证书 (集群 A) 集群 B (Cluster B) Cilium Agent B SPIFFE ID: B CA 证书 (集群 B) ① 交换 CA 证书 (建立信任域联邦) ② Agent A 发起 TLS 连接 (出示证书 A) ③ Agent B 验证证书 A,出示证书 B ④ 双向验证通过,建立加密隧道

ClusterMesh 的证书轮换需要特别注意:

  • CA 证书一致性: 所有集群的 CA 证书必须保持一致,或者通过联邦机制相互信任。轮换 CA 证书时,需要确保所有集群的 CA 证书更新同步。
  • SPIFFE 信任域: 每个集群有自己的信任域(Trust Domain),ClusterMesh 通过配置信任域联邦来允许跨域验证。证书轮换不能改变 SPIFFE ID 的信任域部分。
  • 轮换顺序: 建议先轮换 CA 证书,再轮换各集群的节点证书。如果先轮换节点证书而 CA 证书未更新,新证书将无法被验证。

3.5 证书生命周期与轮换策略

Cilium 默认使用自签名的 CA 和证书,证书有效期通常为 1 年。在生产环境中,建议制定明确的证书轮换策略:

证书类型 默认有效期 轮换建议 影响范围
CA 证书 10 年 每 2-3 年轮换一次 所有依赖该 CA 的证书
节点证书 (mTLS) 1 年 每 6-9 个月轮换一次 节点间加密通信
Hubble 证书 1 年 每 6-9 个月轮换一次 Hubble API 访问
ClusterMesh 证书 1 年 每 6-9 个月轮换一次 跨集群通信
最佳实践: 使用 cert-manager 等证书管理工具自动轮换 Cilium 证书。Cilium 支持通过 certmanager 集成自动签发和续期证书,减少人工操作带来的风险。