⼀个只能访问某个 namespace 的ServiceAccount

149 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天,点击查看活动详情

前言

上一篇文章我们创建了⼀个只能访问某个命名空间的普通⽤户,之前我们提到过 subjects 下⾯还有⼀种类型的主题资源:ServiceAccount,本篇文章我们就创建⼀个只能访问某个 namespace 的ServiceAccount

在这里插入图片描述

@[toc]

创建ServiceAccount对象

现在我们来创建⼀个集群内部的⽤户只能操作 kube-system 这个命名空间下⾯的 podsdeployments,⾸先来创建⼀个 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”

在这里插入图片描述