【Kubernetes】RBAC(基于角色的访问控制)如何设置?如何管理 Kubernetes 的权限?

RBAC (Role-Based Access Control) 是 Kubernetes 中用于控制访问权限的机制。

  • 通过 RBAC,管理员可以细粒度地控制用户和服务账户对 Kubernetes 资源的访问权限。
  • RBAC 的核心思想是根据角色(Role)来授予权限,角色可以是用户、组或服务账户。

1. RBAC 组件简介

在 Kubernetes 中,RBAC 基于以下几个重要的资源:

  • Role:定义了在特定命名空间内的权限。例如,某个用户可以读取某个命名空间中的 Pod,但不能修改它们。
  • ClusterRole:与 Role 类似,但它适用于集群级别的资源。ClusterRole 可以赋予跨所有命名空间的权限,或者集群级别的权限(例如访问节点、查看集群状态等)。
  • RoleBinding:将 Role 或 ClusterRole 与一个用户或服务账户(ServiceAccount)绑定,并且指定该用户或服务账户可以在指定的命名空间中执行的操作。
  • ClusterRoleBinding:将 ClusterRole 与一个用户、服务账户或用户组绑定,并赋予该角色跨集群的权限。

2. RBAC 权限的授予流程

RBAC 权限授予包括以下步骤:

  1. 定义 Role 或 ClusterRole :定义某个角色所拥有的权限(可以是资源的 getlistcreateupdatedelete 权限)。
  2. 创建 RoleBinding 或 ClusterRoleBinding:将用户或服务账户与某个 Role 或 ClusterRole 绑定,从而赋予其相应的权限。

3. 创建和配置 RBAC 资源

1. 定义 Role 和 ClusterRole
  • Role 示例:限制一个用户只能在某个命名空间内查看 Pods 和 Deployments。

    yaml 复制代码
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      namespace: mynamespace  # 适用于某个命名空间
      name: pod-reader
    rules:
    - apiGroups: [""]
      resources: ["pods"]
      verbs: ["get", "list"]
    - apiGroups: ["apps"]
      resources: ["deployments"]
      verbs: ["get", "list"]
  • ClusterRole 示例:授予用户访问集群内所有命名空间的 Pods 和 Deployments 的权限。

    yaml 复制代码
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: cluster-pod-reader
    rules:
    - apiGroups: [""]
      resources: ["pods"]
      verbs: ["get", "list"]
    - apiGroups: ["apps"]
      resources: ["deployments"]
      verbs: ["get", "list"]
2. 绑定 Role 或 ClusterRole
  • RoleBinding:将 Role 绑定到某个用户或服务账户,在特定的命名空间内授予权限。

    yaml 复制代码
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: read-pods-binding
      namespace: mynamespace  # 绑定到特定命名空间
    subjects:
    - kind: User
      name: "johndoe"  # 被绑定的用户
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: Role
      name: pod-reader  # 绑定到之前定义的 Role
      apiGroup: rbac.authorization.k8s.io
  • ClusterRoleBinding:将 ClusterRole 绑定到用户、服务账户或用户组,以便其具有跨所有命名空间的权限。

    yaml 复制代码
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: cluster-read-pods-binding
    subjects:
    - kind: User
      name: "johndoe"  # 被绑定的用户
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: ClusterRole
      name: cluster-pod-reader  # 绑定到之前定义的 ClusterRole
      apiGroup: rbac.authorization.k8s.io

4. 管理 Kubernetes 权限

  • 查看当前权限 :使用 kubectl auth can-i 命令查看某个用户、服务账户或角色是否有某项操作权限。例如,查看 johndoe 用户是否可以查看 Pods:

    bash 复制代码
    kubectl auth can-i get pods --as johndoe
  • 查看 Role 和 RoleBinding :可以通过 kubectl get 命令查看所有 Role 和 RoleBinding。

    查看所有命名空间的 Role:

    bash 复制代码
    kubectl get roles --all-namespaces

    查看指定命名空间的 RoleBinding:

    bash 复制代码
    kubectl get rolebindings -n mynamespace
  • 更新权限:如果需要修改某个用户的权限,只需编辑对应的 Role 或 ClusterRole,或者更新 RoleBinding 或 ClusterRoleBinding。修改后,Kubernetes 会自动生效。

  • 调试权限问题 :当用户或服务账户无法访问资源时,可以使用 kubectl describe 命令查看 RBAC 配置并检查是否有误,或者使用 kubectl auth can-i 命令来测试权限。

5. 权限控制策略

  • 最小权限原则:只授予必要的权限,避免过多的权限分配。通过精细化的 Role 和 ClusterRole,可以确保每个用户或服务账户仅能执行其职责所需的操作。
  • Role 和 ClusterRole 的区别
    • Role 适用于命名空间级别的权限管理,而 ClusterRole 则是集群级别的权限管理,可以跨命名空间。
    • 如果一个应用需要跨多个命名空间的权限,则使用 ClusterRole 和 ClusterRoleBinding;如果只是需要在某个特定命名空间内进行管理,则使用 Role 和 RoleBinding。

总结

  • RBAC 是 Kubernetes 中重要的权限控制机制,可以通过 RoleClusterRoleRoleBindingClusterRoleBinding 资源来管理集群内的访问权限。
  • 通过定义适当的角色和角色绑定,可以控制用户、服务账户或组对 Kubernetes 资源的访问权限。
  • 最小权限原则应始终作为权限管理的最佳实践,以确保安全性并减少潜在的风险。

https://github.com/0voice

相关推荐
遇见火星12 分钟前
Docker入门:快速部署你的第一个Web应用
前端·docker·容器
阿里云云原生42 分钟前
移动端性能监控探索:iOS RUM SDK 技术架构与实践
云原生
阿里云云原生1 小时前
Nacos 3.1.0 正式发布,支持 A2A 注册中心与 MCP 注册协议增强
微服务·云原生
阿里云云原生1 小时前
Qoder 上线提示词增强功能,将开发者从“提示词”的负担中解放出来
云原生
suknna2 小时前
通过命令模拟pod创建
kubernetes
维诺菌2 小时前
k8s java应用pod内存占用过高问题排查
java·jvm·云原生·容器·性能优化·kubernetes
回忆是昨天里的海2 小时前
k8s安装-kubeadm join,将工作节点加入k8s集群
java·服务器·kubernetes
浪飘2 小时前
k8s device plugin
java·docker·kubernetes
冬夜戏雪2 小时前
milvus容器restart不成功,但docker仍在running问题排查
docker·容器·milvus
m0_579146653 小时前
docker desktop的容器间通信
docker·容器·php