简介
本教程提供了一份全面指南,用于理解和配置 Kubernetes 中的基于角色的访问控制(RBAC)。RBAC 是一种强大的机制,可让你控制和管理对 Kubernetes 资源的访问,确保集群的安全性和完整性。你将学习关键的 RBAC 概念、如何创建和管理角色(Role)、角色绑定(RoleBinding)、集群角色(ClusterRole)和集群角色绑定(ClusterRoleBinding),以及如何排查未授权错误。
本教程提供了一份全面指南,用于理解和配置 Kubernetes 中的基于角色的访问控制(RBAC)。RBAC 是一种强大的机制,可让你控制和管理对 Kubernetes 资源的访问,确保集群的安全性和完整性。你将学习关键的 RBAC 概念、如何创建和管理角色(Role)、角色绑定(RoleBinding)、集群角色(ClusterRole)和集群角色绑定(ClusterRoleBinding),以及如何排查未授权错误。
Kubernetes RBAC(基于角色的访问控制)是一种强大的机制,可让你控制和管理对 Kubernetes 资源的访问。它提供了一种方法来定义谁可以在你的 Kubernetes 集群中的哪些资源上执行何种操作。
在 Kubernetes RBAC 中,有几个关键概念需要理解:
为了说明 RBAC 的工作原理,让我们考虑一个简单的示例。假设你有一个 Kubernetes 集群,并且你想授予名为 “alice” 的用户在 “default” 命名空间中查看和管理 Pod 的能力。
首先,你将创建一个定义必要权限的角色(Role):
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-manager
rules:
- apiGroups: [""] ## "" 表示核心 API 组
resources: ["pods"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
接下来,你将创建一个将 “alice” 用户与 “pod-manager” 角色相关联的角色绑定(RoleBinding):
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
namespace: default
name: alice-pod-manager
subjects:
- kind: User
name: alice
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-manager
apiGroup: rbac.authorization.k8s.io
通过此配置,“alice” 用户将能够在 “default” 命名空间中的 Pod 上执行指定的操作。
在 Kubernetes 中配置 RBAC 涉及创建和管理角色(Roles)、集群角色(ClusterRoles)、角色绑定(RoleBindings)和集群角色绑定(ClusterRoleBindings),以便向主体(用户、组或服务账户)授予所需的权限。
角色(Roles)和集群角色(ClusterRoles)定义了对 Kubernetes 资源的允许操作。它们之间的区别在于,角色(Roles)作用域限定于特定的命名空间,而集群角色(ClusterRoles)是集群范围的。
以下是一个授予对 “default” 命名空间中的 Pod 读取访问权限的角色(Role)示例:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""] ## "" 表示核心 API 组
resources: ["pods"]
verbs: ["get", "list", "watch"]
以及一个授予对整个集群管理员访问权限的集群角色(ClusterRole)示例:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: cluster-admin
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["*"]
角色绑定(RoleBindings)和集群角色绑定(ClusterRoleBindings)将角色(Roles)或集群角色(ClusterRoles)与主体相关联,授予指定的权限。
以下是一个在 “default” 命名空间中向 “alice” 用户授予 “pod-reader” 角色的角色绑定(RoleBinding)示例:
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
namespace: default
name: alice-pod-reader
subjects:
- kind: User
name: alice
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
以及一个在整个集群中向 “admin” 组授予 “cluster-admin” 角色的集群角色绑定(ClusterRoleBinding)示例:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-cluster-admin
subjects:
- kind: Group
name: admin
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
在使用 Kubernetes RBAC 时,你可能会遇到 “未授权” 错误,这表明主体(用户、组或服务账户)没有执行请求操作所需的权限。排查这些错误需要了解根本原因并相应地调整 RBAC 配置。
排查未授权错误的第一步是确定主体试图执行的具体操作以及他们试图访问的资源。你通常可以在错误消息中或通过检查 Kubernetes 审计日志找到此信息。
例如,未授权错误消息可能如下所示:
用户 “alice” 无法获取 “default” 命名空间中的 Pod
这表明 “alice” 用户试图访问 “default” 命名空间中的 “pods” 资源,但没有必要的权限。
确定问题后,你可以开始调查 RBAC 配置以确定根本原因。你可以使用以下命令检查相关的角色(Roles)、集群角色(ClusterRoles)、角色绑定(RoleBindings)和集群角色绑定(ClusterRoleBindings):
kubectl get roles -n default
kubectl get rolebindings -n default
kubectl get clusterroles
kubectl get clusterrolebindings
通过检查配置的权限,你可以识别导致未授权错误的任何权限缺失或配置错误。
要解决未授权错误,你需要更新 RBAC 配置,以向主体授予必要的权限。这可能涉及创建新的角色(Role)或集群角色(ClusterRole),或修改现有角色,然后将角色绑定到适当的主体。
例如,要授予 “alice” 用户对 “default” 命名空间中 Pod 的读取访问权限,你可以创建如下的角色绑定(RoleBinding):
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
namespace: default
name: alice-pod-reader
subjects:
- kind: User
name: alice
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
应用此配置后,“alice” 用户应该能够执行请求的操作而不会遇到未授权错误。
在本教程中,你已经学习了如何在 Kubernetes 中配置 RBAC 来管理权限并保护你的集群安全。你探索了关键的 RBAC 概念,包括主体、角色和绑定,并应用实际示例来授予用户、组和服务账户对 Kubernetes 资源的必要访问权限。通过理解并正确配置 RBAC,你可以确保只有经过授权的实体才能在你的 Kubernetes 环境中执行操作,从而增强集群的整体安全性和可控性。