kubernetes 配置示例 - RBAC

3个基本概念:

(1) Role: 角色。它其实是一组规则,定义了一组对 kubernetes API 对象的操作权限 。

(2)Subject:被作用者。可以是“人”,也可以是“机器”。

(3)RoleBinding: 定义了 subject 和 role 间的绑定关系。

Role 的定义示例如下:

apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: mynamespace  # 定义了 examle-role 这个 Role 的作用域
  name: example-role  # Role 的名称
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list"]

注: rules 是 Role 定义的权限。此例中这个Role 的含义就是: 允许 Subject 对 mynamespace 下面的 Pod 对象进行 get,watch, list 操作。

使用 RoleBinding 把 Role 和 Subject 进行绑定:

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: example-rolebinding
  namespace: mynamespace 
subjects:
- kind: User
  name: example-user
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: example-role
  apiGroup: rbac.authorization.k8s.io

这里的“被作用者”的类型是 User(即k8s 里的用户,只是授权系统的一个逻辑概念),这个用户的名字是 example-user。

Role 和 RoleBinding 都是 Namespace 对象,所以它们对权限的限制规则仅在它们自己的 Namespace 内有效, roleRef 也只能引用当前Namespace 里的 Role 对象。如果想要作用于所有的 Namespace,则需要使用 ClusterRole 和 ClusterRoleBinding。

大多数时候,我们不太使用 User 这个功能,而是直接使用 k8s 里的 “内置用户”,即 ServiceAccount

--- 
# 定义一个名为 example-sa 的 ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
  namespace: mynamespace
  name: example-sa
-- 
# SeviceAccount 和 Role 进行绑定
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: sa-rb
subjects:
- kind: ServiceAccount
  name: example-sa
  namespace: mynamespace
roleRef:
  kind: Role
  name: example-role
  apiGroup: rbac.authorization.k8s.io
---
#声明使用 ServiceAccount
apiVersion: v1
kind: Pod
metadata:
  namespace: mynamespace
  name: sa-token-test
spec:
  containers:
  - name: nginx
    image: nginx:1.7.9
  serviceAccountName: example-sa

运行上面的 yaml 后,运行下面的命令

kubectl get sa -n mynamespace -o yaml

可以看到 k8s 自动为 ServiceAccount 创建并分配了一个 Secret 对象。

当 Pod 运行起来之后,该 ServiceAccount 的 Token,被 k8s 自动挂载到了容器的 /var/run/secrets/kubernetes.io/serviceaccount 目录下。

 

posted @ 2022-01-24 10:12  一剑侵心  阅读(120)  评论(0编辑  收藏  举报