4. 多集群身份与认证:X.509证书体系、ServiceAccount跨集群使用、OIDC与多集群集成
4.1 多集群身份认证的核心挑战
在多集群架构中,每个集群拥有独立的CA(证书颁发机构)和身份管理系统。当工作负载或管理员需要跨集群访问资源时,身份认证面临三个核心挑战:
- 信任锚不一致:集群A签发的证书在集群B的CA信任链中无效。
- 凭证生命周期不同步:各集群的、证书过期时间独立管理,缺乏统一轮换机制。
- 身份映射缺失:集群A的ServiceAccount在集群B中没有对应的RBAC绑定。
关键原则:多集群身份认证的核心是建立“信任传递”而非“凭证复制”。通过联邦CA、OIDC代理或交换协议,实现跨集群的身份断言。
4.2 X.509证书体系:集群间信任的基石
Kubernetes原生使用X.509证书作为kube-apiserver与kubelet、kubectl之间的TLS认证基础。在多集群场景下,证书体系需要扩展为“根CA联邦”或“中间CA代理”。
4.2.1 单集群证书结构回顾
| 组件 | 证书用途 | 签发者 |
|---|---|---|
| kube-apiserver | 服务端TLS,验证客户端身份 | 集群根CA |
| kubelet | 客户端证书,向apiserver注册 | 集群根CA |
| kubectl / admin | 客户端证书,访问apiserver | 集群根CA |
| ServiceAccount | JWT (非证书) | Controller |
4.2.2 多集群证书联邦方案
实现跨集群证书信任的两种主流模式:
- 共享根CA模式:所有集群使用同一个根CA签发证书。优点:天然信任;缺点:根CA泄露风险极高,集群解耦困难。
- 中间CA代理模式:每个集群保留独立根CA,通过一个“联邦中间CA”签发跨集群通信证书。联邦中间CA的证书被所有集群信任。
生产建议:中间CA代理模式更符合安全最小化原则。联邦中间CA可以部署在管理集群中,仅用于签发跨集群通信的短期证书(TTL ≤ 24小时)。
4.3 ServiceAccount跨集群使用
ServiceAccount(SA)是Pod内进程访问Kubernetes API的凭证载体。默认情况下,SA的JWT 仅在本集群有效。跨集群使用SA需要解决的“可移植性”和“信任传递”。
4.3.1 跨集群SA 交换流程
- 源集群SA获取:Pod使用挂载的SA (JWT)向源集群apiserver发起请求。
- 交换代理:源集群的代理组件将SA 发送给目标集群的 Review API进行验证。
- 身份映射:目标集群根据中的`sub`(Subject)或`iss`(Issuer)字段,映射到本地RBAC绑定。
- 返回临时凭证:目标集群签发一个短期客户端证书或新的JWT ,供Pod后续调用。
安全风险:直接暴露SA 给其他集群可能导致凭证泄露。必须使用TokenReview API进行验证,并限制的`aud`(Audience)字段为目标集群的API Server URL。
4.3.2 跨集群SA配置示例
在源集群创建SA并绑定RBAC,允许其访问目标集群的指定资源:
# 源集群:创建SA
apiVersion: v1
kind: ServiceAccount
metadata:
name: cross-cluster-sa
namespace: default
---
# 源集群:创建ClusterRole和ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: cross-cluster-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: cross-cluster-reader-binding
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cross-cluster-reader
subjects:
- kind: ServiceAccount
name: cross-cluster-sa
namespace: default
# 目标集群:创建TokenReview和RBAC映射(通过代理组件自动完成)
# 代理组件配置示例(伪代码)
tokenReview:
issuer: https://source-cluster.example.com
audience: https://target-cluster.example.com
rbacMapping:
subject: "system:serviceaccount:default:cross-cluster-sa"
clusterRole: "target-pod-reader"
4.4 OIDC与多集群集成
OpenID Connect(OIDC)是Kubernetes官方推荐的集群外部身份认证协议。通过OIDC,多集群可以共享同一个身份提供者(IdP),实现统一的用户和ServiceAccount认证。
4.4.1 OIDC多集群架构
- 统一IdP:所有集群配置同一个OIDC Issuer(如Dex、Keycloak、Azure AD)。
- 集群独立配置:每个集群的apiserver通过`--oidc-issuer-url`、`--oidc-client-id`等参数指向IdP。
- 断言:用户或SA从IdP获取ID ,携带给任意集群的apiserver进行验证。
4.4.2 OIDC与ServiceAccount结合
Kubernetes 1.20+支持ServiceAccount 投射(Projected ),可以配置OIDC作为的验证后端。这使得SA 可以被OIDC IdP验证,实现SA级别的跨集群认证。
| 特性 | 传统SA | OIDC投射 |
|---|---|---|
| 签发者 | 集群自身 Controller | OIDC IdP(如Dex) |
| 跨集群验证 | 需要TokenReview代理 | 直接由目标集群OIDC验证 |
| 格式 | JWT,无标准`aud` | JWT,包含`aud`和`iss` |
| 生命周期 | 永久(除非手动轮换) | 可配置短TTL(如1小时) |
| 安全性 | 低(泄露后风险高) | 高(支持绑定Pod生命周期) |
4.4.3 多集群OIDC配置要点
- Issuer一致性:所有集群的`--oidc-issuer-url`必须指向同一个IdP,且IdP的证书链被所有集群信任。
- Client ID管理:每个集群可以注册独立的Client ID,但建议使用同一个Client ID简化管理。
- Claims映射:通过`--oidc-username-claim`和`--oidc-groups-claim`将IdP中的用户属性映射到Kubernetes RBAC。
- 验证:确保IdP的JWKS(JSON Web Key Set)端点可被所有集群网络访问。
最佳实践:在多集群环境中,优先使用OIDC投射替代传统SA 。结合Pod Identity Webhook,可以实现SA 的自动轮换和绑定,将凭证泄露风险降至最低。
4.5 三种认证方案的对比与选型
| 方案 | 适用场景 | 复杂度 | 安全性 | 推荐度 |
|---|---|---|---|---|
| X.509证书联邦 | 集群间组件通信(kubelet、kube-controller) | 中 | 高(需保护CA私钥) | ⭐⭐⭐ |
| ServiceAccount 交换 | Pod跨集群访问API | 中高 | 中(依赖TokenReview代理) | ⭐⭐ |
| OIDC统一认证 | 用户、CI/CD、SA跨集群访问 | 高(需部署IdP) | 高(支持短、Audience绑定) | ⭐⭐⭐⭐ |
选型建议:对于新建多集群平台,优先采用OIDC方案。对于已有大量证书基础设施的集群,可以采用证书联邦作为过渡。SA 交换方案仅建议在无法部署IdP的受限环境中使用。