【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 :定义某个角色所拥有的权限(可以是资源的 get、list、create、update、delete 权限)。
  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 中重要的权限控制机制,可以通过 Role 、ClusterRole 、RoleBinding 和 ClusterRoleBinding 资源来管理集群内的访问权限。
  • 通过定义适当的角色和角色绑定,可以控制用户、服务账户或组对 Kubernetes 资源的访问权限。
  • 最小权限原则应始终作为权限管理的最佳实践,以确保安全性并减少潜在的风险。

https://github.com/0voice

相关推荐
虎头金猫3 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
分布式存储与RustFS3 天前
MinIO 官方 Docker 镜像被移除:依赖它的项目该怎么办
docker·云原生·devops·对象存储·minio·分布式存储
codeejun3 天前
每日一Go·MySQL-5、锁机制全解析
云原生·golang
赵文宇(温玉)3 天前
CoreDNS的hosts插件的缺行配置导致k8s集群异常
容器·kubernetes·rancher
guo_wen_qiang3 天前
上传本地镜像到harbor中
docker·容器·持续部署
张洛闻Eren3 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
忆~遂愿3 天前
本地片库怎么在外面打开?Plex + cpolar 搭一套可远程访问的私人影音库
docker·容器
Thneonl3 天前
你的 Pod 为什么 Pending:调度器两阶段
后端·kubernetes
不吃香菜kkk、3 天前
CI/CD(GitOps)学习与部署手册
运维·云原生·容器·kubernetes·云计算·jenkins·argocd
ChaITSimpleLove3 天前
云原生性能对决:JDK21虚拟线程+GraalVM vs .NET10/11 技术栈深度对比
微服务·云原生·serverless·graalvm native·native aot·runtime async·.net11/java21