在 k8s 集群的 RBAC 里有用到用户、组的概念,但是它又不直接管理这些资源,而是通过外部身份验证机制(Authentication Mechanisms)来管理和定义的,比如证书进行签名时,将其配置为 Subject: O = system:masters, CN = kubernetes-admin。O 代表用户组,CN 是用户,这些都是通过签署证书管理的。 但是新版本可以直接通过命令去创建,我用的是 1.31
这些在集群管理权限的时候很重要,如何给用户生成相应的 kubeconfig 文件,下面就这个问题说明下,刚接触往往这块会比较懵逼
查看当前的用户组
可以把新建的用户放到这些组下,或者新建组都可以
kubectl get rolebindings <rolebinding-name> -n <namespace> -o json | jq '.subjects[] | select(.kind == "Group") | .name'
kubectl get clusterrolebindings <clusterrolebinding-name> -o json | jq '.subjects[] | select(.kind == "Group") | .name'
创建用户和组并授权
用户授权
- k8s 里kubeadm 命令有提供给用户创建 conf 的命令,下面我们来创建用户jane的 conf,所在的组是podreader,这个组也是我们新创建的没有任何权限,生成 conf 文件存在pod-reader-group.conf
kubeadm kubeconfig user --org podreader --client-name jane --validity-period 24h > pod-reader.conf
- 我们先通过上面这个 conf 文件查看下 pod,会爆没有权限的错误,属于预期范围,因为咱们的用户jane没有任何权限
kubectl get pod --kubeconfig pod-reader.conf
Error from server (Forbidden): pods is forbidden: User "janegroup" cannot list resource "pods" in API group "" in the namespace "default"
- 这一步我们给jane授权,通过创建 role rolebinding
cat pod-reader.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""] "" 标明 core API 组
resources: ["pods"]
verbs: ["get", "watch", "list"]
cat pod-reader-binding.yaml
apiVersion: rbac.authorization.k8s.io/v1
此角色绑定允许 "jane" 读取 "default" 名字空间中的 Pod
你需要在该名字空间中有一个名为 “pod-reader” 的 Role
kind: RoleBinding
metadata:
name: read-pods
namespace: default
subjects:
你可以指定不止一个“subject(主体)”
- kind: User
name: jane "name" 是区分大小写的
apiGroup: rbac.authorization.k8s.io
roleRef:
"roleRef" 指定与某 Role 或 ClusterRole 的绑定关系
kind: Role 此字段必须是 Role 或 ClusterRole
name: pod-reader 此字段必须与你要绑定的 Role 或 ClusterRole 的名称匹配
apiGroup: rbac.authorization.k8s.io
- 现在我们再执行下第二步的命令,会发现可以查看了,已经有查看 default ns 下pod 的权限,但是其他的 ns 仍然没有,因为 role 没有给其他的 ns 授权
kubectl apply -f pod-reader.yaml
kubectl apply -f pod-reader-binding.yaml
上面是给单个用户授权的,但是它所在的组podreader没有任何权限,所以需要再给他授权,方法和上面给用户授权类似
组授权
- 创建一个新的用户janegroup,所属组在podreader里,然后执行get pod 命令,是无法查看的,因为所属的组是没有权限的
kubeadm kubeconfig user --org podreader --client-name janegroup --validity-period 24h > pod-reader-group.conf
kubectl get pod --kubeconfig pod-reader-group.conf
Error from server (Forbidden): pods is forbidden: User "janegroup" cannot list resource "pods" in API group "" in the namespace "default"
- 下面我们给组podreader绑定权限,role 文件和上一步是一样的
cat pod-reader-binding-group.yaml
apiVersion: rbac.authorization.k8s.io/v1
此角色绑定允许 "jane" 读取 "default" 名字空间中的 Pod
你需要在该名字空间中有一个名为 “pod-reader” 的 Role
kind: RoleBinding
metadata:
name: read-pods
namespace: default
subjects:
你可以指定不止一个“subject(主体)”
- kind: Group
name: podreader "name" 是区分大小写的
apiGroup: rbac.authorization.k8s.io
roleRef:
"roleRef" 指定与某 Role 或 ClusterRole 的绑定关系
kind: Role 此字段必须是 Role 或 ClusterRole
name: pod-reader 此字段必须与你要绑定的 Role 或 ClusterRole 的名称匹配
apiGroup: rbac.authorization.k8s.io
- 再次执行查看命令就可以查看了,说明权限已生效
kubectl get pod --kubeconfig pod-reader-group.conf
No resources found in default namespace.