Service account,RBAC Authorization - 1

image

考察sa/role/rolebinding,看题意往role里写对应的规则即可。

主要问题:

  1. 错误的 apiGroups
    Pods 和 Services 属于 Kubernetes 的核心 API 组(空字符串 ""核心组的资源应该更规范一点的话应该写v1组),而不是 "pods""services"
  2. resources 不匹配
    你写了 secrets,但实际需要的是 podsservices
  3. 格式问题
    apiGroupsresources 应该是列表形式(用 []- 分隔)。

✅ 修正后的规则(如果只需要 获取和列举 Pods 和 Services):

rules:
- apiGroups: ["v1"]  # 核心 API 组
  resources: ["pods", "services"]
  verbs: ["get", "list"]

✅ 如果需要 创建、获取、列举 Pods 和 Services:

rules:
- apiGroups: ["v1"]
  resources: ["pods", "services"]
  verbs: ["get", "list", "create"]

关键点说明:

  1. apiGroups: ["v1"]

    • Pods、Services、Secrets 等核心资源属于 ""(空字符串)组。
    • 如果是 Deployment 等资源,则需要 apiGroups: ["apps/v1"]
  2. resources

    • 明确列出需要的资源(如 podsservices),不要混淆无关资源(如 secrets)。
  3. verbs

    • get:查看单个资源详情。
    • list:列举所有资源。
    • create:创建新资源。

如果需要同时管理 Pods、Services 和 Secrets

rules:
- apiGroups: ["v1"]
  resources: ["pods", "services", "secrets"]
  verbs: ["get", "list", "create"]

RBAC 中如何同时授权核心组(如 v1)和非核心组(如 apps/v1networking.k8s.io/v1)的资源,以及区分 RoleBindingClusterRoleBinding的前提是?。

1. 核心组和非核心组的规则是否需要分开写?

  • 不需要分开规则,但需要在同一个 Role/ClusterRole 中分多条 rules 声明不同 apiGroups
  • 示例
    rules:
    # 核心组规则(v1)
    - apiGroups: ["v1"]
      resources: ["pods", "services"]
      verbs: ["get", "list"]
    # 非核心组规则(如 apps/v1)
    - apiGroups: ["apps/v1"]
      resources: ["deployments"]
      verbs: ["get", "create"]
    # 其他非核心组(如 networking.k8s.io/v1)
    - apiGroups: ["networking.k8s.io/v1"]
      resources: ["ingresses"]
      verbs: ["list"]
    

2. 是否需要区分 RoleBindingClusterRoleBinding

  • 取决于资源的作用范围,与 API 组无关:

    • RoleBinding:绑定到 特定命名空间RoleClusterRole(仅限该命名空间内生效)。
    • ClusterRoleBinding:绑定到 ClusterRole,权限 全局生效(所有命名空间)。
  • 关键区别

    类型 作用范围 适用场景
    Role + RoleBinding 单个命名空间 限制权限到特定命名空间(如 default
    ClusterRole + RoleBinding 单个命名空间 复用全局角色但限制到特定命名空间
    ClusterRole + ClusterRoleBinding 集群全局 授予跨命名空间的权限(如管理员)
  • 正确组合示例

    # 示例1:限制权限到 default 命名空间(即使使用 ClusterRole)
    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: limited-binding
      namespace: default  # 指定命名空间
    subjects:
    - kind: User
      name: alice
    roleRef:
      kind: ClusterRole
      name: my-cluster-role
      apiGroup: rbac.authorization.k8s.io
    
    # 示例2:全局权限(所有命名空间)
    kind: ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: global-binding
    subjects:
    - kind: User
      name: admin
    roleRef:
      kind: ClusterRole
      name: admin-role
      apiGroup: rbac.authorization.k8s.io
    

3. 实际建议

  • 场景1:如果用户只需要操作某个命名空间内的资源(无论核心组还是非核心组):
    • 使用 Role + RoleBinding(或 ClusterRole + RoleBinding 限制到特定命名空间)。
  • 场景2:如果用户需要跨命名空间操作资源:
    • 使用 ClusterRole + ClusterRoleBinding
  • 无需 因为 API 组不同而分开绑定。

4. 验证权限

  • 检查用户权限:
    kubectl auth can-i get pods --as=alice -n default
    kubectl auth can-i create deployments --as=admin --all-namespaces
    

总结:

  1. 规则写法:核心组(v1)和非核心组(如 apps/v1)的权限可以在同一个 Role/ClusterRole 中通过多条 rules 声明,无需分开。
  2. 绑定类型:使用 RoleBinding 还是 ClusterRoleBinding 取决于权限作用范围(命名空间或全局),与 API 组无关。
posted on 2025-06-29 16:35  Leo_Yide  阅读(27)  评论(0)    收藏  举报