Service account 是为了方便 Pod 里面的进程调用 Kubernetes API 或其他外部服务而设计的。它与 User account 不同
- User account 是为人设计的,而 service account 则是为 Pod 中的进程调用 Kubernetes API 而设计;
 - User account 是跨 namespace 的,而 service account 则是仅局限它所在的 namespace;
 - 每个 namespace 都会自动创建一个 default service account
 - Token controller 检测 service account 的创建,并为它们创建 secret
 开启 ServiceAccount Admission Controller 后
- 每个 Pod 在创建后都会自动设置 
spec.serviceAccountName为 default(除非指定了其他 ServiceAccout) - 验证 Pod 引用的 service account 已经存在,否则拒绝创建
 - 如果 Pod 没有指定 ImagePullSecrets,则把 service account 的 ImagePullSecrets 加到 Pod 中
 - 每个 container 启动后都会挂载该 service account 的 token 和 
ca.crt到/var/run/secrets/kubernetes.io/serviceaccount/ 
- 每个 Pod 在创建后都会自动设置 
 
$ kubectl exec nginx-3137573019-md1u2 ls /var/run/secrets/kubernetes.io/serviceaccountca.crtnamespacetoken
注:你可以使用 https://jwt.io/ 来查看 token 的详细信息(如 PAYLOAD、SIGNATURE 等)。
创建 Service Account
$ kubectl create serviceaccount jenkinsserviceaccount "jenkins" created$ kubectl get serviceaccounts jenkins -o yamlapiVersion: v1kind: ServiceAccountmetadata:creationTimestamp: 2017-05-27T14:32:25Zname: jenkinsnamespace: defaultresourceVersion: "45559"selfLink: /api/v1/namespaces/default/serviceaccounts/jenkinsuid: 4d66eb4c-42e9-11e7-9860-ee7d8982865fsecrets:- name: jenkins-token-l9v7v
自动创建的 secret:
kubectl get secret jenkins-token-l9v7v -o yamlapiVersion: v1data:ca.crt: (APISERVER CA BASE64 ENCODED)namespace: ZGVmYXVsdA==token: (BEARER TOKEN BASE64 ENCODED)kind: Secretmetadata:annotations:kubernetes.io/service-account.name: jenkinskubernetes.io/service-account.uid: 4d66eb4c-42e9-11e7-9860-ee7d8982865fcreationTimestamp: 2017-05-27T14:32:25Zname: jenkins-token-l9v7vnamespace: defaultresourceVersion: "45558"selfLink: /api/v1/namespaces/default/secrets/jenkins-token-l9v7vuid: 4d697992-42e9-11e7-9860-ee7d8982865ftype: kubernetes.io/service-account-token
添加 ImagePullSecrets
apiVersion: v1kind: ServiceAccountmetadata:creationTimestamp: 2015-08-07T22:02:39Zname: defaultnamespace: defaultselfLink: /api/v1/namespaces/default/serviceaccounts/defaultuid: 052fb0f4-3d50-11e5-b066-42010af0d7b6secrets:- name: default-token-uudgeimagePullSecrets:- name: myregistrykey
授权
Service Account 为服务提供了一种方便的认证机制,但它不关心授权的问题。可以配合 RBAC 来为 Service Account 鉴权:
- 配置 
--authorization-mode=RBAC和--runtime-config=rbac.authorization.k8s.io/v1alpha1 - 配置 
--authorization-rbac-super-user=admin - 定义 Role、ClusterRole、RoleBinding 或 ClusterRoleBinding
 
比如
# This role allows to read pods in the namespace "default"kind: RoleapiVersion: rbac.authorization.k8s.io/v1alpha1metadata:namespace: defaultname: pod-readerrules:- apiGroups: [""] # The API group"" indicates the core API Group.resources: ["pods"]verbs: ["get", "watch", "list"]nonResourceURLs: []---# This role binding allows "default" to read pods in the namespace "default"kind: RoleBindingapiVersion: rbac.authorization.k8s.io/v1alpha1metadata:name: read-podsnamespace: defaultsubjects:- kind: ServiceAccount # May be "User", "Group" or "ServiceAccount"name: defaultroleRef:kind: Rolename: pod-readerapiGroup: rbac.authorization.k8s.io
