在Kubernetes中,Service Account结合RBAC机制是管理跨Pod通信权限的核心方案。以下是实践经验与挑战:
-
精细化身份隔离:
- 为每个业务组件创建独立Service Account(SA),避免使用default账号。例如通过
kubectl create serviceaccount frontend-sa
创建前端专用SA。 - 在Pod模板中显式指定SA名称,禁用自动挂载默认令牌(设置automountServiceAccountToken: false)
- 为每个业务组件创建独立Service Account(SA),避免使用default账号。例如通过
-
RBAC权限控制:
- 编写Role时严格限制资源类型与操作,如仅允许特定SA对configmap执行get/list操作
- 跨Namespace访问时使用ClusterRole,但需通过
resourceNames
字段限制具体资源实例 - 通过
kubectl auth can-i --as=system:serviceaccount:<ns>:<sa> <action>
验证权限配置
-
服务间认证实践:
- 在需要访问APIServer的Pod中注入SA令牌,通过
/var/run/secrets/kubernetes.io/serviceaccount/token
进行认证 - 对于自定义服务间的认证,可将SA对应的Secret挂载到Pod,使用ca.crt和token构建双向TLS
- 在需要访问APIServer的Pod中注入SA令牌,通过
-
挑战与解决方案:
- 权限泄露风险:通过OPA/Gatekeeper实施策略,禁止创建通配符("*")规则的Role
- 令牌劫持防护:定期轮转SA关联的Secret(需K8s 1.24+版本使用TokenRequest API)
- 跨集群访问:结合Projected Volume将不同集群的SA令牌注入同一Pod实现联邦认证
-
监控审计:
- 启用审计日志记录serviceAccountName字段
- 使用kube-bench检查RBAC配置合规性
- 通过Falco监控异常SA令牌使用行为
典型案例:当需要实现Service A Pod访问Service B的Endpoint时,需为SA绑定允许读取services/endpoints资源的Role,同时配置NetworkPolicy开放对应端口,实现权限与网络的双重管控。