持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天,点击查看活动详情
前言
上一篇文章我们创建了⼀个只能访问某个命名空间的普通⽤户,之前我们提到过 subjects 下⾯还有⼀种类型的主题资源:
ServiceAccount,本篇文章我们就创建⼀个只能访问某个 namespace 的ServiceAccount
@[toc]
创建ServiceAccount对象
现在我们来创建⼀个集群内部的⽤户只能操作 kube-system 这个命名空间下⾯的 pods 和 deployments,⾸先来创建⼀个 ServiceAccount 对象:
$ kubectl create sa haimaxy-sa -n kube-system
当然我们也可以定义成 YAML ⽂件的形式来创建。
新建Role对象
然后新建⼀个 Role 对象:(haimaxy-sa-role.yaml)
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: haimaxy-sa-role
namespace: kube-system
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]
- apiGroups: ["apps"]
resources: ["deployments"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
可以看到我们这⾥定义的⻆⾊没有创建、删除、更新 Pod 的权限,待会我们可以重点测试⼀下,创建该 Role 对象:
$ kubectl create -f haimaxy-sa-role.yaml
创建 RoleBinding 对象
然后创建⼀个 RoleBinding 对象,将上⾯的 haimaxy-sa 和⻆⾊ haimaxy-sa-role 进⾏绑定:(haimaxysa-rolebinding.yaml)
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: haimaxy-sa-rolebinding
namespace: kube-system
subjects:
- kind: ServiceAccount
name: haimaxy-sa
namespace: kube-system
roleRef:
kind: Role
name: haimaxy-sa-role
apiGroup: rbac.authorization.k8s.io
添加这个资源对象:
$ kubectl create -f haimaxy-sa-rolebinding.yaml
验证 ServiceAccount
然后我们怎么去验证这个 ServiceAccount 呢?我们前⾯是不是提到过⼀个 ServiceAccount会⽣成⼀个 Secret 对象和它进⾏映射,这个 Secret ⾥⾯包含⼀个 token,我们可以利⽤这个 token 去登录 Dashboard,然后我们就可以在 Dashboard 中来验证我们的功能是否符合预期了:
$ kubectl get secret -n kube-system |grep haimay-sahaimay-sa-token-nxgqx kubernetes.io/service-account-token 3 47m
$ kubectl get secret haimay-sa-token-nxgqx -o jsonpath={.data.token} -n kube-system |base6
4 -d
# 会⽣成⼀串很⻓的base64后的字符串
使⽤这⾥的 token 去 Dashboard ⻚⾯进⾏登录:
我们可以看到上⾯的提示信息,这是因为我们登录进来后默认跳转到 default 命名空间,我们切换到
kube-system 命名空间下⾯就可以了:
我们可以看到可以访问pod列表了,但是也会有⼀些其他额外的提示:
events is forbidden: User“system:serviceaccount:kube-system:haimaxy-sa” cannot list events in the namespace “kubesystem”,这是因为当前登录⽤只被授权了访问 pod 和 deployment 的权限,同样的,访问下deployment看看可以了吗?
同样的,你可以根据⾃⼰的需求来对访问⽤户的权限进⾏限制,可以⾃⼰通过 Role 定义更加细粒度的权限,也可以使⽤系统内置的⼀些权限……
下篇文章将向大家演示“创建⼀个可以访问所有 namespace 的ServiceAccount”