Kubernetes RBAC
Kubernetes 是一个强大的容器编排平台,但随着集群规模的扩大,如何管理用户和服务账户的访问权限变得至关重要。基于角色的访问控制(RBAC,Role-Based Access Control)是 Kubernetes 中用于管理权限的核心机制之一。本文将详细介绍 RBAC 的概念、工作原理以及如何在实际场景中应用它。
什么是 RBAC?
RBAC 是一种权限管理机制,它通过定义角色(Role)和角色绑定(RoleBinding)来控制用户或服务账户对 Kubernetes 资源的访问权限。RBAC 的核心思想是将权限分配给角色,然后将角色绑定到用户或组,而不是直接将权限分配给用户。
RBAC 是 Kubernetes 1.6 版本引入的,取代了之前的基于属性的访问控制(ABAC)机制。
RBAC 的核心组件
RBAC 主要由以下几个核心组件组成:
- Role:定义了一组权限,指定了可以对哪些资源执行哪些操作(如
get
、list
、create
、delete
等)。 - ClusterRole:与 Role 类似,但作用范围是整个集群,而不是某个命名空间。
- RoleBinding:将 Role 或 ClusterRole 绑定到用户、组或服务账户,授予它们相应的权限。
- ClusterRoleBinding:与 RoleBinding 类似,但作用范围是整个集群。
Role 示例
以下是一个 Role 的示例,它允许用户对 pods
资源执行 get
、list
和 watch
操作:
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
:
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 的工作原理可以概括为以下几个步骤:
- 定义角色:首先,你需要定义一个 Role 或 ClusterRole,指定允许的操作和资源。
- 绑定角色:然后,通过 RoleBinding 或 ClusterRoleBinding 将角色绑定到用户、组或服务账户。
- 验证权限:当用户或服务账户尝试访问资源时,Kubernetes 会检查其是否具有相应的权限。
你可以使用 kubectl auth can-i
命令来检查某个用户或服务账户是否具有执行特定操作的权限。例如:
kubectl auth can-i get pods --as=jane
实际应用场景
场景 1:限制开发人员对生产环境的访问
假设你有一个 Kubernetes 集群,其中包含开发环境和生产环境。你希望开发人员只能访问开发环境的资源,而不能访问生产环境的资源。你可以通过以下步骤实现:
- 为开发环境创建一个 Role,允许开发人员对
pods
、deployments
等资源执行操作。 - 为生产环境创建一个 Role,限制开发人员的访问权限。
- 使用 RoleBinding 将开发环境的 Role 绑定到开发人员,将生产环境的 Role 绑定到运维人员。
场景 2:为 CI/CD 系统分配权限
假设你有一个 CI/CD 系统,它需要部署应用程序到 Kubernetes 集群。你可以为 CI/CD 系统创建一个服务账户,并为其分配一个 ClusterRole,允许它创建、更新和删除 deployments
和 services
等资源。
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 系统的服务账户:
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,你可以确保集群的安全性,防止未经授权的访问。
附加资源
练习
- 创建一个 Role,允许用户对
configmaps
资源执行get
和list
操作。 - 创建一个 RoleBinding,将该 Role 绑定到用户
john
。 - 使用
kubectl auth can-i
命令验证john
是否具有访问configmaps
的权限。
通过完成这些练习,你将更好地理解 Kubernetes RBAC 的工作原理和应用场景。