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 目录下。