共计 1700 个字符,预计需要花费 5 分钟才能阅读完成。
什么是 serviceAccount
顾名思义,相对于userAccount(比如:kubectl访问APIServer时用的就是userAccount),serviceAccount 就是 Pod 中的 Process 用于访问 Kubernetes API的 account,它为 Pod 中的进程提供了一种身份标识。相比于 userAccount 的全局性权限,serviceAccount 更适合一些轻量级的task,更聚焦于授权给某些特定Pod中的Process所使用。
serviceAccount 并不复杂,只是关联了一个 Secret 资源作为 token,该token也叫service-account-token。
任意一个 pod 如果在不指定 serviceAccount 的情况下,都是用的默认的 serviceAccount。相关内容在容器的 /run/secrets/kubernetes.io/serviceaccount
目录下。该目录下有三个文件:ca.crt,namespace,token。
- ca.crt 用来验证 APIServer 的证书,因为证书都是自己生成的,所以需要创建集群 CA 证书进行验证。
- namespace 是该 pod 所在命名空间。
- token 是容器访问 APIServer 认证和授权所使用的内容,请求时放在 Authorization。
接下来创建 serviceAccount 并进行权限的测试。
serviceAccount 实战
1. 创建账号和角色
sa-pod-reader.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: pod-reader
namespace: dev
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: pod-role
namespace: dev
rules:
- apiGroups: [""] # 支持的API组列表,""空字符串,表示核心API群
resources: ["pods"] # 支持的资源对象列表
verbs: ["get","watch","list"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: authorization-role-binding
namespace: dev
subjects:
- kind: ServiceAccount
name: pod-reader
roleRef:
kind: Role
name: pod-role
apiGroup: rbac.authorization.k8s.io
# 创建用户和角色
kubectl apply -f sa-pod-reader.yaml
创建一个 pod-reader 的角色并和账号 pod-reader 进行绑定,pod-reader 的权限仅限于 dev 命名空间下 pod 的查询。
2. 创建 pod-reader 的 token
在以前版本的 kubernetes 中,进行了创建 serviceaccount 会自动生成一个 Secret 里面存放 token 值,但是新版本不会这样做了。可以参考之前的文章 k8s 手动管理 ServiceAccount 的 Secret。
pod-reader-token.yaml
apiVersion: v1
kind: Secret
metadata:
name: pod-reader
namespace: dev
annotations:
kubernetes.io/service-account.name: pod-reader
type: kubernetes.io/service-account-token
# 创建 secret
kubectl apply -f pod-reader-token.yaml
3. 测试权限
kubectl describe secret pod-reader -n dev
获取到 token 以后,使用 postman 进行测试。
设置 token。
3.1 获取 dev 下的 pod
可以看见能够进行获取。
3.2 获取 default 下的 pod
提示没有权限,至此,测试完毕。
提醒:本文发布于690天前,文中所关联的信息可能已发生改变,请知悉!