k8s使用 RBAC 鉴权

发布于:2025-08-03 ⋅ 阅读:(9) ⋅ 点赞:(0)


官方介绍: https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/rbac/

  • 基于角色(Role)的访问控制(RBAC)是一种基于组织中用户的角色来调节控制对计算机或网络资源的访问的方法。

  • RBAC 鉴权机制使用 rbac.authorization.k8s.io API 组来驱动鉴权决定, 允许你通过 Kubernetes API 动态配置策略。

  • 要启用 RBAC,在启动 API 服务器时将 --authorization-mode 参数设置为一个逗号分隔的列表并确保其中包含 RBAC。

kube-apiserver --authorization-mode=Example,RBAC --<其他选项> --<其他选项>

API对象

RBAC API 声明了四种 Kubernetes 对象:Role、ClusterRole、RoleBinding 和 ClusterRoleBinding

1.Role 和 ClusterRole

RBAC 的 Role 或 ClusterRole 中包含一组代表相关权限的规则。 这些权限是纯粹累加的(不存在拒绝某操作的规则)。

Role 总是用来在某个名字空间内设置访问权限; 在你创建 Role 时,你必须指定该 Role 所属的名字空间。

与之相对,ClusterRole 则是一个集群作用域的资源。这两种资源的名字不同(Role 和 ClusterRole) 是因为 Kubernetes 对象要么是名字空间作用域的,要么是集群作用域的,不可两者兼具.

ClusterRole 有若干用法。你可以用它来:

  1. 定义对某名字空间域对象的访问权限,并将在个别名字空间内被授予访问权限;

  2. 为名字空间作用域的对象设置访问权限,并被授予跨所有名字空间的访问权限;

  3. 为集群作用域的资源定义访问权限

Role 或 ClusterRole 对象的名称必须是合法的路径分段名称。

Role 示例

下面是一个位于 “default” 名字空间的 Role 的示例,可用来授予对 Pod 的读访问权限:

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

ClusterRole 示例

ClusterRole 同样可以用于授予 Role 能够授予的权限。 因为 ClusterRole 属于集群范围,所以它也可以为以下资源授予访问权限:

  • 集群范围资源(比如节点(Node))

  • 非资源端点(比如 /healthz)

  • 跨名字空间访问的名字空间作用域的资源(如 Pod)

下面是一个 ClusterRole 的示例,可用来为任一特定名字空间中的 Secret 授予读访问权限, 或者跨名字空间的访问权限

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  # "namespace" 被忽略,因为 ClusterRoles 不受名字空间限制
  name: secret-reader
rules:
- apiGroups: [""]
  # 在 HTTP 层面,用来访问 Secret 资源的名称为 "secrets"
  resources: ["secrets"]
  verbs: ["get", "watch", "list"]

2.RoleBinding 和 ClusterRoleBinding

角色绑定(Role Binding)是将角色中定义的权限赋予一个或者一组用户。 它包含若干 主体(用户、组或服务账户)的列表和对这些主体所获得的角色的引用。 RoleBinding 在指定的名字空间中执行授权,而 ClusterRoleBinding 在集群范围执行授权。

一个 RoleBinding 可以引用同一的名字空间中的任何 Role。 或者,一个 RoleBinding 可以引用某 ClusterRole 并将该 ClusterRole 绑定到 RoleBinding 所在的名字空间。 如果你希望将某 ClusterRole 绑定到集群中所有名字空间,你要使用 ClusterRoleBinding。

RoleBinding 或 ClusterRoleBinding 对象的名称必须是合法的 路径分段名称。

命令行工具

[verb包含:get,list,create,update,patch,watch,delete]

1.kubectl create role

创建 Role 对象,定义在某一名字空间中的权限。例如:

创建名称为 “pod-reader” 的 Role 对象,允许用户对 Pods 执行 get、watch 和 list 操作

kubectl create role pod-reader --verb=get,watch,list --resource=pods
kubectl create role pod-reader --verb=get --verb=list --verb=watch --resource=pods

创建名称为 “pod-reader” 的 Role 对象并指定 resourceNames:

kubectl create role pod-reader --verb=get --resource-name=readpod,anotherpod
kubectl create role pod-reader --verb=get --resource-name=readpod -resource-name=anotherpod

创建名为 “foo” 的 Role 对象并指定 apiGroups:

kubectl create role foo --verb=get,list,watch --resource=replicasets.apps

创建名为 “foo” 的 Role 对象并指定子资源权限:

kubectl create role foo --verb=get,list,watch --resource=podss,pods/status

创建名为 “my-component-lease-holder” 的 Role 对象,使其具有对特定名称的资源执行 get/update 的权限:

kubectl create role my-component-lease-holder --verb=get,list,watch,update --resource=lease --resource-name=my-component

2.kubectl create clusterrole

创建 ClusterRole 对象。例如:

创建名称为 “pod-reader” 的 ClusterRole 对象,允许用户对 Pods 对象执行 get、 watch 和 list 操作:

kubectl create clusterrole pod-reader --verb=get,watch,list --resource=pods

创建名为 “pod-reader” 的 ClusterRole 对象并指定 resourceNames:

kubectl create clusterrole pod-reader --verb=get --resource=pods --resource-name=readpod,anothespod

创建名为 “foo” 的 ClusterRole 对象并指定 apiGroups:

kubectl create clusterrole foo --verb=get --resource=replicasets.apps

创建名为 “foo” 的 ClusterRole 对象并指定子资源:

kubectl create clusterrole foo --verb=get --resource=podss,pods/status

创建名为 “foo” 的 ClusterRole 对象并指定 nonResourceURL:

kubectl create clusterrole foo --verb=get --non-resource-url=/logs/*

创建名为 “monitoring” 的 ClusterRole 对象并指定 aggregationRule:

kubectl create clusterrole monitoring --aggregation-rule="rbac.example.com/aggregate-to-monitoring=true"

3.kubectl create rolebinding

在特定的名字空间中对 Role 或 ClusterRole 授权。例如:

在名字空间 “acme” 中,将名为 admin 的 ClusterRole 中的权限授予名称 “bob” 的用户:

kubectl create rolebinding cicd --clusterrole=admin --user=bob -n acme

在名字空间 “acme” 中,将名为 view 的 ClusterRole 中的权限授予名字空间 “acme” 中名为 myapp 的服务账户:

kubectl create rolebinding cicd --clusterrole=view --serviceaccount=acme:myapp -n acme

在名字空间 “acme” 中,将名为 view 的 ClusterRole 对象中的权限授予名字空间 “myappnamespace” 中名称为 myapp 的服务账户:

kubectl create rolebinding cicd --clusterrole=view --serviceaccount=myappnamespace:myapp -n acme

4.kubectl create clusterrolebinding

在整个集群(所有名字空间)中用 ClusterRole 授权。例如:

在整个集群范围,将名为 cluster-admin 的 ClusterRole 中定义的权限授予名为 “root” 用户:

kubectl create clusterrolebinding cluster-admin-binding --clusterrole=cluster-admin --user=root

在整个集群范围内,将名为 system:node-proxier 的 ClusterRole 的权限授予名为 “system:kube-proxy” 的用户:

kubectl create clusterrolebinding node-proxy-binding --clusterrole=system:node-proxier --user=system:kube-proxy

在整个集群范围内,将名为 view 的 ClusterRole 中定义的权限授予 “acme” 名字空间中名为 “myapp” 的服务账户:

kubectl create clusterrolebinding view-binding --clusterrole=view --serviceaccount=acme:myapp

5.kubectl auth reconcile

使用清单文件来创建或者更新 rbac.authorization.k8s.io/v1 API 对象。

尚不存在的对象会被创建,如果对应的名字空间也不存在,必要的话也会被创建。

已经存在的角色会被更新,使之包含输入对象中所给的权限。如果指定了 --remove-extra-permissions,可以删除额外的权限。

例如:

测试应用 RBAC 对象的清单文件,显示将要进行的更改

kubectl auth reconcile -f my-rbac-rules.yaml --dry-run=client

应用 RBAC 对象的清单文件,保留角色(roles)中的额外权限和绑定(bindings)中的其他主体:

kubectl auth reconcile -f my-rbac-rules.yaml

应用 RBAC 对象的清单文件,删除角色(roles)中的额外权限和绑定中的其他主体:

kubectl auth reconcile -f my-rbac-rules.yaml --remove-extra-subjects --remove-extra-permissions

服务账户权限

默认的 RBAC 策略为控制面组件、节点和控制器授予权限。 但是不会对 kube-system 名字空间之外的服务账户授予权限。 (除了授予所有已认证用户的发现权限)