RBAC

  • 基于角色的访问控制(Role-Based Access Control, 即”RBAC”)使用”rbac.authorization.k8s.io” API Group实现授权决策,允许管理员通过Kubernetes API动态配置策略。
  • 基于RBAC配置User权限,包括操作(get、create、list、delete、update、patch、edit、watch、exec)资源:

Pods
PV
ConfigMaps
Deployments
Nodes
Secrets
Namespaces

Role和RoleBinding

Role

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

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

RoleBinding

roleBinding.yaml

apiVersion: rbac.authorization.k8s.io/v1
# 此角色绑定允许 "system:serviceaccount:default" 读取 "default" 名字空间中的 Pods
# You need to already have a Role named "pod-reader" in that namespace.
kind: RoleBinding
metadata:
  name: read-pods
  namespace: default
subjects:
# 你可以指定不止一个“subject(主体)”
- kind: ServiceAccount
  name: default # "name" is case sensitive
  namespace: default
roleRef:
  # "roleRef" 指定与某 Role 或 ClusterRole 的绑定关系
  kind: Role # 此字段必须是 Role 或 ClusterRole
  name: pod-reader     # 此字段必须与你要绑定的 Role 或 ClusterRole 的名称匹配
  apiGroup: rbac.authorization.k8s.io

验证

$ kubectl apply -f role.yaml 
role.rbac.authorization.k8s.io/pod-reader created

$ kubectl apply -f roleBinding.yaml 
rolebinding.rbac.authorization.k8s.io/read-pods created

$ kubectl get role,rolebinding
NAME                                        CREATED AT
role.rbac.authorization.k8s.io/pod-reader   2022-04-13T13:34:47Z

NAME                                              ROLE              AGE
rolebinding.rbac.authorization.k8s.io/read-pods   Role/pod-reader   15s

$ kubectl auth can-i list pods --as=system:serviceaccount:default:default -n default
yes

ClusterRole和ClusterRoleBinding

ClusterRole

clusterRole.yaml

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

ClusterRoleBinding

clusterRoleBinding.yaml

apiVersion: rbac.authorization.k8s.io/v1
# 此集群角色绑定允许 “system:serviceaccount:default” 组中的任何人访问任何名字空间中的 nodes
kind: ClusterRoleBinding
metadata:
  name: read-nodes
subjects:
- kind: ServiceAccount
  name: default
  namespace: default
roleRef:
  kind: ClusterRole
  name: node-reader
  apiGroup: rbac.authorization.k8s.io

验证

$ kubectl apply -f clusterRole.yaml 
clusterrole.rbac.authorization.k8s.io/node-reader created

$ kubectl apply -f clusterRoleBinding.yaml
clusterrolebinding.rbac.authorization.k8s.io/read-nodes created

$ kubectl get clusterrole,clusterrolebinding
NAME                                                                                                         CREATED AT
clusterrole.rbac.authorization.k8s.io/node-reader                                                            2022-04-13T13:37:08Z

NAME                                                                                                ROLE                                                                               AGE
clusterrolebinding.rbac.authorization.k8s.io/read-nodes                                             ClusterRole/node-reader                                                            104s

$ kubectl auth can-i list nodes --as=system:serviceaccount:default:default
Warning: resource 'nodes' is not namespace scoped
yes

定义ServiceAccount

客户端访问k8s API服务的途径通常有三种:kubectl、客户端库或者直接使用 REST接口进行请求。
而可以执行此类请求的主体也被 Kubernetes 分为两类:现实中的“人”和 Pod 对象,
它们的用户身份分别对应于常规用户 (User Account )和服务账号 ( Service Account) 。

  • Use Account(用户账号):一般是指由独立于Kubernetes之外的其他服务管理的用 户账号,例如由管理员分发的密钥、Keystone一类的用户存储(账号库)、甚至是包 含有用户名和密码列表的文件等。Kubernetes中不存在表示此类用户账号的对象, 因此不能被直接添加进 Kubernetes 系统中 。

  • Service Account(服务账号):是指由Kubernetes API 管理的账号,用于为Pod 之中的服务进程在访问Kubernetes API时提供身份标识( identity ) 。Service Account通常要绑定于特定的命名空间,它们由 API Server 创建,或者通过 API 调用于动创建 ,附带着一组存储为Secret的用于访问API Server的凭据。

apiVersion: v1
kind: ServiceAccount
metadata:
  name: ts
  namespace: test
  labels:
    test: ts

参考

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐