跳到主要内容

Kubernetes RBAC

Kubernetes 是一个强大的容器编排平台,但随着集群规模的扩大,如何管理用户和服务账户的访问权限变得至关重要。基于角色的访问控制(RBAC,Role-Based Access Control)是 Kubernetes 中用于管理权限的核心机制之一。本文将详细介绍 RBAC 的概念、工作原理以及如何在实际场景中应用它。

什么是 RBAC?

RBAC 是一种权限管理机制,它通过定义角色(Role)和角色绑定(RoleBinding)来控制用户或服务账户对 Kubernetes 资源的访问权限。RBAC 的核心思想是将权限分配给角色,然后将角色绑定到用户或组,而不是直接将权限分配给用户。

备注

RBAC 是 Kubernetes 1.6 版本引入的,取代了之前的基于属性的访问控制(ABAC)机制。

RBAC 的核心组件

RBAC 主要由以下几个核心组件组成:

  1. Role:定义了一组权限,指定了可以对哪些资源执行哪些操作(如 getlistcreatedelete 等)。
  2. ClusterRole:与 Role 类似,但作用范围是整个集群,而不是某个命名空间。
  3. RoleBinding:将 Role 或 ClusterRole 绑定到用户、组或服务账户,授予它们相应的权限。
  4. ClusterRoleBinding:与 RoleBinding 类似,但作用范围是整个集群。

Role 示例

以下是一个 Role 的示例,它允许用户对 pods 资源执行 getlistwatch 操作:

yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]

RoleBinding 示例

以下是一个 RoleBinding 的示例,它将 pod-reader 角色绑定到用户 jane

yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: default
subjects:
- kind: User
name: jane
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io

RBAC 的工作原理

RBAC 的工作原理可以概括为以下几个步骤:

  1. 定义角色:首先,你需要定义一个 Role 或 ClusterRole,指定允许的操作和资源。
  2. 绑定角色:然后,通过 RoleBinding 或 ClusterRoleBinding 将角色绑定到用户、组或服务账户。
  3. 验证权限:当用户或服务账户尝试访问资源时,Kubernetes 会检查其是否具有相应的权限。
提示

你可以使用 kubectl auth can-i 命令来检查某个用户或服务账户是否具有执行特定操作的权限。例如:

bash
kubectl auth can-i get pods --as=jane

实际应用场景

场景 1:限制开发人员对生产环境的访问

假设你有一个 Kubernetes 集群,其中包含开发环境和生产环境。你希望开发人员只能访问开发环境的资源,而不能访问生产环境的资源。你可以通过以下步骤实现:

  1. 为开发环境创建一个 Role,允许开发人员对 podsdeployments 等资源执行操作。
  2. 为生产环境创建一个 Role,限制开发人员的访问权限。
  3. 使用 RoleBinding 将开发环境的 Role 绑定到开发人员,将生产环境的 Role 绑定到运维人员。

场景 2:为 CI/CD 系统分配权限

假设你有一个 CI/CD 系统,它需要部署应用程序到 Kubernetes 集群。你可以为 CI/CD 系统创建一个服务账户,并为其分配一个 ClusterRole,允许它创建、更新和删除 deploymentsservices 等资源。

yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: cicd-deployer
rules:
- apiGroups: ["apps", ""]
resources: ["deployments", "services"]
verbs: ["create", "update", "delete"]

然后,使用 ClusterRoleBinding 将该 ClusterRole 绑定到 CI/CD 系统的服务账户:

yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: cicd-deployer-binding
subjects:
- kind: ServiceAccount
name: cicd-deployer
namespace: default
roleRef:
kind: ClusterRole
name: cicd-deployer
apiGroup: rbac.authorization.k8s.io

总结

RBAC 是 Kubernetes 中管理权限的强大工具,它通过角色和角色绑定来控制用户和服务账户对集群资源的访问。通过合理使用 RBAC,你可以确保集群的安全性,防止未经授权的访问。

附加资源

练习

  1. 创建一个 Role,允许用户对 configmaps 资源执行 getlist 操作。
  2. 创建一个 RoleBinding,将该 Role 绑定到用户 john
  3. 使用 kubectl auth can-i 命令验证 john 是否具有访问 configmaps 的权限。

通过完成这些练习,你将更好地理解 Kubernetes RBAC 的工作原理和应用场景。