一、什么是 k8srbac
k8srbac 全称 Kubernetes Role-Based Access Control(基于角色的访问控制),它是 Kubernetes 集群中的一种访问控制机制。通过 k8srbac,可以在 Kubernetes 集群中实现权限的细分与管理,从而提高集群的安全性。
二、k8srbac 相关术语
在了解 k8srbac 的细节之前,先来了解 k8srbac 相关的术语。下面列出了 k8srbac 中比较重要的一些角色和资源:
- Subject: 能够对 Kubernetes 资源进行访问的主体,可以是一个用户或者一个服务账户。
- Role: 角色代表了一组权限操作,例如可以创建、更新或删除一个或多个资源。在 Kubernetes 中,角色只作用于指定的 Namespace。
- ClusterRole: ClusterRole 与 Role 类似,但是作用于整个 Kubernetes 集群。
- RoleBinding: 用于将 Role 与 Subject 进行绑定,从而赋予 Subject 对 Role 所代表的资源的权限。
- ClusterRoleBinding: 与 RoleBinding 类似,但是作用于整个 Kubernetes 集群,可以将 ClusterRole 与各种 Subject 进行绑定。
三、k8srbac 角色权限设置示例
下面我们通过一个示例来展示如何使用 k8srbac 角色进行权限设置。假设我们有一个 Kubernetes 应用,它只需要访问该 Cluster 的前端应用资源(例如 Ingress 和 Service),不需要访问其他类型的资源。针对这种场景,我们可以创建如下的 k8srbac 角色:
kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: namespace: default name: frontend-role rules: - apiGroups: - networking.k8s.io resources: - ingresses verbs: - get - list - watch - apiGroups: - "" resources: - services verbs: - get - list - watch
在上面的 k8srbac 角色定义中,我们设置了两个规则:
- 允许读取 Ingress 资源。
- 允许读取 Service 资源。
接下来,我们需要将该角色与 Subject 绑定起来。假设我们有一个名为 frontend-svcaccount 的 ServiceAccount,可以通过如下的 RoleBinding 进行绑定:
kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: frontend-rolebinding namespace: default subjects: - kind: ServiceAccount name: frontend-svcaccount apiGroup: "" roleRef: kind: Role name: frontend-role apiGroup: ""
在上面的 RoleBinding 中,我们将 ServiceAccount frontend-svcaccount 与 Role frontend-role 进行了绑定。这样,frontend-svcaccount 就可以读取 Ingress 和 Service 资源了。
四、k8srbac ClusterRole 的使用示例
除了使用 Role 进行 Namespace 级别的权限控制之外,我们还可以使用 ClusterRole 进行 Kubernetes 集群级别的权限控制。下面我们来看一个例子,假设我们需要给某个账号(假设该账号名字为 devops)赋予下列权限:
- 读取 Node 资源。
- 读取 ConfigMap、Secret、Event 和 Pod 资源。
- 读取、创建和删除 Namespace 资源。
- 创建、更新和删除 Pod 和 Service 资源。
- 更新和删除 Deployment 和 StatefulSet 资源。
我们可以创建如下的 ClusterRole:
kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: devops-cluster-role rules: - apiGroups: [""] resources: ["nodes"] verbs: ["get", "watch", "list"] - apiGroups: [""] resources: ["configmaps", "secrets", "events", "pods"] verbs: ["get", "watch", "list"] - apiGroups: [""] resources: ["namespaces"] verbs: ["get", "create", "delete"] - apiGroups: [""] resources: ["pods", "services"] verbs: ["get", "create", "delete"] - apiGroups: ["apps"] resources: ["deployments", "statefulsets"] verbs: ["update", "delete"]
接下来,我们需要将该 ClusterRole 与 devops 账号进行绑定。可以通过如下的 ClusterRoleBinding 完成绑定:
kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: devops-clusterrolebinding subjects: - kind: User name: devops apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: devops-cluster-role apiGroup: rbac.authorization.k8s.io
在上面的 ClusterRoleBinding 中,我们将 devops 账号与 devops-cluster-role 进行了绑定。这样,devops 账号就可以读取和修改被该 ClusterRole 所授权的 Kubernetes 资源了。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/257805.html
微信扫一扫
支付宝扫一扫