Service account 是为了方便 Pod 里面的进程调用 Kubernetes API 或其他外部服务而设计的。
Service account 有它自己的 namespace,每个 namespace 都会自动创建一个 default service account。
Token controller会检测 service account 的创建,并为它们创建kubernetes.io/service-account-token secret。
Service Account 创建
自动创建 service account
- 每个 Pod 在创建时都会自动设置
spec.serviceAccountName
为 default - 判断 Pod 引用的 service account 是否已经存在,如不存在,拒绝创建该pod
- 如果 Pod 没有指定 ImagePullSecrets,则把 service account 的 ImagePullSecrets 加到 Pod 中
- 每个 container 启动后都会挂载该 service account 的
token
、ca.crt
和namespace
,到目录/var/run/secrets/kubernetes.io/serviceaccount/
手动创建 service account
创建service account
kubectl create serviceaccount jenkins
自动创建与该service account对应的secret
kubectl get secret jenkins-token-l9v7v -o yaml
向该service account 添加imagePullSecret
kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "myregistrykey"}]}'
Service Account 授权
Service Account 为服务提供了一种方便的认证机制,但它不关心授权的问题,但可以配合RBAC来对 Service Account 进行授权。
kind: Role
apiVersion: rbac.authorization.k8s.io/v1alpha1
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]
nonResourceURLs: []
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1alpha1
metadata:
name: read-pods
namespace: default
subjects:
- kind: ServiceAccount
name: default
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
网友评论