权限的艺术:深入剖析 Kubernetes RBAC 模型与架构设计

权限的艺术:深入剖析 Kubernetes RBAC 模型与架构设计

作者:庸子

适用版本:Kubernetes v1.28+

阅读时长:约 18 分钟

目录

[权限的艺术:深入剖析 Kubernetes RBAC 模型与架构设计](#权限的艺术:深入剖析 Kubernetes RBAC 模型与架构设计)

[第一部分:解构 RBAC ------ 核心对象与授权逻辑](#第一部分:解构 RBAC —— 核心对象与授权逻辑)

【专栏正文】

【架构师手记】

[第二部分:高级权限控制 ------ 聚合角色与模拟模式](#第二部分:高级权限控制 —— 聚合角色与模拟模式)

【专栏正文】

【架构师手记】

[第三部分:自动化与 CI/CD 的安全凭证管理](#第三部分:自动化与 CI/CD 的安全凭证管理)

【专栏正文】

【架构师手记】

第四部分:企业级最佳实践与常见反模式

【专栏正文】

【架构师手记】

总结


第一部分:解构 RBAC ------ 核心对象与授权逻辑

【专栏正文】

Kubernetes 的 RBAC(Role-Based Access Control)是一种企业级的权限管理模型,其核心逻辑是:用户 -> 角色 -> 资源操作。它解决了"谁"在"哪个范围"可以对"什么资源"做"什么操作"的问题。

理解 RBAC 必须掌握以下四个核心对象:

  1. Role(角色)与 ClusterRole(集群角色):
    • 定义了"权限的集合"(即:能做什么)。
    • Role:命名空间级别的权限,仅作用于特定的 Namespace。
    • ClusterRole:集群级别的权限,既可以作用于全局资源(如 Node、PV),也可以被绑定到具体的 Namespace 使用。
  2. RoleBinding(角色绑定)与 ClusterRoleBinding(集群角色绑定):
    • 定义了"将权限赋予谁"(即:谁拥有这些权限)。
    • RoleBinding:将 Role 或 ClusterRole 绑定到 Subject(用户/组/ServiceAccount),作用域仅限当前 Namespace。
    • ClusterRoleBinding:将 ClusterRole 绑定到 Subject,作用域为整个集群。

授权逻辑示意图:

复制代码
graph TD
    Subject[Subject: 用户/组/SA] -->|绑定| Binding[RoleBinding / ClusterRoleBinding]
    Binding -->|引用| Role[Role / ClusterRole]
    Role -->|定义规则| Rules[Rules: apiGroups/resources/verbs]

实战 YAML 示例:

开发者在 dev-namespace 中拥有 Pod 的读取权限:

复制代码
# 1. 定义角色:只能读取 Pod
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: dev-namespace
  name: pod-reader
rules:
- apiGroups: [""] # "" 代表 core API Group
  resources: ["pods"]
  verbs: ["get", "watch", "list"]

# 2. 定义绑定:将角色赋予用户 dave
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: read-pods
  namespace: dev-namespace
subjects:
- kind: User
  name: dave # 来自外部认证系统(如 OIDC)
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

【架构师手记】

导师视角的"避坑"指南:
最常见的误区:认为 ClusterRole 只能配合 ClusterRoleBinding 使用。
真相: ClusterRole + RoleBinding 是极其常见且高效的组合。比如,我想让 alicens-ans-bns-c 都有管理员权限。

  • 错误做法 :创建 3 个不同的 Role(包含相同的规则)。
  • *正确做法*:创建一个 admin ClusterRole,然后在 ns-ans-bns-c 分别创建 RoleBinding 引用这个 ClusterRole。这遵循了 DRY(Don't Repeat Yourself)原则。

关于 "Subject":K8s API Server 不管理用户!它只管理 ServiceAccount。对于人类用户(User),你必须在 OIDC、LDAP 或 x509 证书中配置好身份,K8s 的 RBAC 仅仅是在一个字符串上做匹配。不要在 K8s 里找"创建用户"的 API。

第二部分:高级权限控制 ------ 聚合角色与模拟模式

【专栏正文】

随着集群规模扩大,硬编码权限规则维护成本极高。v1.9 引入的 Aggregated ClusterRoles 是架构师必须掌握的高级特性。

  1. 聚合角色

允许你通过 selector 将其他 ClusterRole 的规则"聚合"到当前 ClusterRole 中。这使得管理员可以扩展系统默认角色,而无需直接修改它们。

实战案例:

假设我们想给默认的 view 角色增加对自定义资源(CRD) CronTabs 的查看权限。

复制代码
# 1. 定义一个带有特定标签的扩展角色
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: view-crontabs
  labels:
    # 注意这个标签,它是聚合的关键
    rbac.authorization.k8s.io/aggregate-to-view: "true"
rules:
- apiGroups: ["stable.example.com"]
  resources: ["crontabs"]
  verbs: ["get", "list", "watch"]

一旦创建了该角色,所有绑定到 view 角色的用户(无论是直接绑定还是继承),都会自动获得 crontabs 的查看权限。这极具扩展性。

  1. 模拟模式

作为架构师,你经常需要排查权限问题:为什么开发人员无法访问某个资源?kubectl auth can-i 结合 --as 参数可以完美复现权限场景。

复制代码
# 模拟用户 dave 在 default namespace 是否能创建 pod
kubectl auth can-i create pods --namespace default --as dave

# 模拟某个 ServiceAccount
kubectl auth can-i list secrets --as system:serviceaccount:kube-system:deployment-controller

【架构师手记】

生产环境的"黑魔法":
聚合规则的隐患:在使用 Aggregation 时要极其小心标签的覆盖。如果某个第三方 Operator 创建了一个带有 rbac.authorization.k8s.io/aggregate-to-admin: "true" 的恶意 ClusterRole,它就会悄无声息地获得 Admin 权限!在生产环境中,严格管控谁有权限创建带有聚合标签的 ClusterRole 是防御横向移动的关键。
关于 kubectl auth can-i:这是我的排查利器。不要相信开发人员的口头描述("我肯定有权限"),直接用命令行模拟。

  • 如果返回 yes,但操作报错,那是网络或 Admission Controller 的问题。
  • 如果返回 no,那就是纯粹的 RBAC 配置问题。记得加上 -v=8 查看底层查找链,你会发现 K8s 是如何遍历所有 RoleBinding 并计算最终决策的。

第三部分:自动化与 CI/CD 的安全凭证管理

【专栏正文】

在现代 DevOps 流水线中,Jenkins、GitLab CI、ArgoCD 等 CI/CD 工具需要操作 K8s。绝不能使用人类用户的凭证,必须使用 ServiceAccount。

  1. ServiceAccount 的使用

ServiceAccount 是 K8s API 管理的资源,专门为 Pod 内进程或外部系统提供身份。

  1. 安全的 Token 获取

在 v1.22 之前,Secret 中会自动挂载 ServiceAccount Token。但这带来了巨大的安全风险(如果 Secret 泄露)。v1.22+ 引入了 Bound Service Account Token Volume,Token 具有时效性和绑定性(Audience, Expiration)。

实战配置:Pod 内使用最佳实践 Token

复制代码
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  serviceAccountName: build-robot
  automountServiceAccountToken: false # 显式关闭默认挂载
  volumes:
  - name: token-vol
    projected:
      sources:
      - serviceAccountToken:
          path: token
          audience: api # 指定受众
          expirationSeconds: 3600 # 1小时后过期
  containers:
  - name: my-container
    image: busybox
    volumeMounts:
    - name: token-vol
      mountPath: /var/run/secrets/tokens
  1. 外部系统(如 Jenkins)的认证

对于在 Pod 外运行的 CI 系统,不建议长期挂载 Secret Token。最佳实践是创建一个长期有效的 ServiceAccount,提取其 Secret Token,并将其以 Kubeconfig 的形式安全注入 CI 系统的环境变量中,并定期轮换。

【架构师手记】

架构师的忠告:
自动化工具的权限陷阱:很多团队为了方便,给 CI 工具的 ServiceAccount 绑定了 cluster-admin。这是最严重的违规操作之一。
整改建议:

  1. 命名空间隔离:CI 工具通常只需要操作特定 Namespace 的 Deployment/Service。创建一个名为 ci-deployer 的 ClusterRole,只授予这些资源的权限。
  2. 限制 patchupdate:不要给 CI 工具 update Node 的权限。
  3. 使用 Impersonation:这是高阶玩法。Jenkins 只持有一个具有 impersonate 权限的"主凭证"。在运行 Job 时,Jenkins 通过 API Header 告诉 K8s:"我是以 alice 的身份在操作"。这样,审计日志中记录的是真实的触发者,而不是冷冰冰的 jenkins 用户。

第四部分:企业级最佳实践与常见反模式

【专栏正文】

构建 RBAC 体系不仅仅是写 YAML,更是制定规则。

  1. 遵循最小权限原则
  • 永远不要把 verbs: ["*"] 写入配置。
  • 避免使用 * 通配符在 resources 中,除非非常必要。
  1. 命名空间隔离策略
  • 使用 RoleBinding 而非 ClusterRoleBinding,确保权限被锁在 Namespace 内。
  • 对于敏感 Namespace(如 kube-systemproduction),设置专门的准入控制,禁止普通用户创建 RoleBinding 引用 admincluster-admin 等高权限角色。这可以通过 Kyverno 策略实现。
  1. 定期审计 RBAC 权限
  • RBAC Lookup:使用工具(如 rbac-lookupKubeRBACQuery)反向查询:"谁有删除 Pod 的权限?"
  • 移除僵尸权限:项目结束后,及时清理相关的 RoleBinding。

【架构师手记】

终极反思:RBAC 的边界在哪里?
RBAC 只解决了"授权"问题,它假设"认证"已经解决。
痛点:K8s 本身没有"用户组管理"功能。当你有 100 个开发人员,如何给他们分配 RBAC?
架构解法:不要在 RBAC 里逐个写用户名!

  • 利用 OIDC(OpenID Connect) 集成企业 SSO(如 Okta, Keycloak)。
  • 在 OIDC 中定义 Group(如 dev-team, ops-team)。
  • 在 K8s RBAC 的 subjects 中只引用 kind: Groupname: dev-team

这样,当新员工入职,只需在 SSO 中把他加入 dev-team 组,他立刻获得所有 K8s 集群对应的开发权限。这才是架构师视角的自动化运维------以身份为中心的访问控制(Identity-Centric Access Control)。

总结

Kubernetes RBAC 不仅仅是一堆繁琐的 YAML 文件,它是保障多租户环境安全运行的基石。

  • 初级水平:会写 Role 和 RoleBinding。
  • 中级水平:会使用 kubectl auth can-i 排查问题,懂得 ServiceAccount 管理。
  • 架构师水平:善用 ClusterRole 聚合扩展系统能力,结合 OIDC 实现统一身份认证,并具备权限审计和自动化治理的视野。

希望这篇文章能帮助你从"会配权限"进化为"设计权限体系"。

相关推荐
sld16815 小时前
打破云服务“绑定”局限,打造高适配性、强管控力的混合云架构新范式
微服务·云原生·架构
VermiliEiz15 小时前
二进制文件部署k8s方式(4)
云原生·容器·kubernetes
openFuyao15 小时前
参与openFuyao嘉年华,体验开源开发流程,领视频年卡会员
人工智能·云原生·开源·开源软件·多样化算力
牛奔16 小时前
docker compose up 命令,默认配置文件自动查找规则
java·spring cloud·docker·容器·eureka
BigBigHang16 小时前
【docker】离线设备安装镜像
运维·docker·容器
学好statistics和DS16 小时前
Docker文件与本地文件,系统
运维·docker·容器
liuc031716 小时前
docker下安装SearXNG
运维·docker·容器
oMcLin16 小时前
如何在CentOS 8上配置并优化Docker与Kubernetes结合的容器集群,提升微服务部署效率?
docker·kubernetes·centos
可爱又迷人的反派角色“yang”17 小时前
k8s(一)
linux·运维·网络·云原生·容器·kubernetes
可爱又迷人的反派角色“yang”17 小时前
CICD持续集成Ruo-Yi项目
linux·运维·网络·ci/cd·docker·容器