# Service Account Service account为Pod中的进程提供身份信息。 *本文是关于 Service Account 的用户指南,管理指南另见 Service Account 的集群管理指南 。* *注意:本文档描述的关于 Serivce Account 的行为只有当您按照 Kubernetes 项目建议的方式搭建起集群的情况下才有效。您的集群管理员可能在您的集群中有自定义配置,这种情况下该文档可能并不适用。* 当您(真人用户)访问集群(例如使用`kubectl`命令)时,apiserver 会将您认证为一个特定的 User Account(目前通常是`admin`,除非您的系统管理员自定义了集群配置)。Pod 容器中的进程也可以与 apiserver 联系。 当它们在联系 apiserver 的时候,它们会被认证为一个特定的 Service Account(例如`default`)。 ## 使用默认的 Service Account 访问 API server 当您创建 pod 的时候,如果您没有指定一个 service account,系统会自动得在与该pod 相同的 namespace 下为其指派一个`default` service account。如果您获取刚创建的 pod 的原始 json 或 yaml 信息(例如使用`kubectl get pods/podename -o yaml`命令),您将看到`spec.serviceAccountName`字段已经被设置为 [automatically set](https://kubernetes.io/docs/user-guide/working-with-resources/#resources-are-automatically-modified) 。 您可以在 pod 中使用自动挂载的 service account 凭证来访问 API,如 [Accessing the Cluster](https://kubernetes.io/docs/user-guide/accessing-the-cluster/#accessing-the-api-from-a-pod) 中所描述。 Service account 是否能够取得访问 API 的许可取决于您使用的 [授权插件和策略](https://kubernetes.io/docs/admin/authorization/#a-quick-note-on-service-accounts)。 在 1.6 以上版本中,您可以选择取消为 service account 自动挂载 API 凭证,只需在 service account 中设置 `automountServiceAccountToken: false`: ```yaml apiVersion: v1 kind: ServiceAccount metadata: name: build-robot automountServiceAccountToken: false ... ``` 在 1.6 以上版本中,您也可以选择只取消单个 pod 的 API 凭证自动挂载: ```Yaml apiVersion: v1 kind: Pod metadata: name: my-pod spec: serviceAccountName: build-robot automountServiceAccountToken: false ... ``` 如果在 pod 和 service account 中同时设置了 `automountServiceAccountToken` , pod 设置中的优先级更高。 ## 使用多个Service Account 每个 namespace 中都有一个默认的叫做 `default` 的 service account 资源。 您可以使用以下命令列出 namespace 下的所有 serviceAccount 资源。 ```bash $ kubectl get serviceAccounts NAME SECRETS AGE default 1 1d ``` 您可以像这样创建一个 ServiceAccount 对象: ```bash $ cat > /tmp/serviceaccount.yaml < /tmp/build-robot-secret.yaml < Annotations: kubernetes.io/service-account.name=build-robot,kubernetes.io/service-account.uid=870ef2a5-35cf-11e5-8d06-005056b45392 Type: kubernetes.io/service-account-token Data ==== ca.crt: 1220 bytes token: ... namespace: 7 bytes ``` > 注意该内容中的`token`被省略了。 ## 为 service account 添加 ImagePullSecret 首先,创建一个 imagePullSecret,详见[这里](https://kubernetes.io/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod)。 然后,确认已创建。如: ```bash $ kubectl get secrets myregistrykey NAME TYPE DATA AGE myregistrykey kubernetes.io/.dockerconfigjson 1 1d ``` 然后,修改 namespace 中的默认 service account 使用该 secret 作为 imagePullSecret。 ``` kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "myregistrykey"}]}' ``` Vi 交互过程中需要手动编辑: ```bash $ kubectl get serviceaccounts default -o yaml > ./sa.yaml $ cat sa.yaml apiVersion: v1 kind: ServiceAccount metadata: creationTimestamp: 2015-08-07T22:02:39Z name: default namespace: default resourceVersion: "243024" selfLink: /api/v1/namespaces/default/serviceaccounts/default uid: 052fb0f4-3d50-11e5-b066-42010af0d7b6 secrets: - name: default-token-uudge $ vi sa.yaml [editor session not shown] [delete line with key "resourceVersion"] [add lines with "imagePullSecret:"] $ cat sa.yaml apiVersion: v1 kind: ServiceAccount metadata: creationTimestamp: 2015-08-07T22:02:39Z name: default namespace: default selfLink: /api/v1/namespaces/default/serviceaccounts/default uid: 052fb0f4-3d50-11e5-b066-42010af0d7b6 secrets: - name: default-token-uudge imagePullSecrets: - name: myregistrykey $ kubectl replace serviceaccount default -f ./sa.yaml serviceaccounts/default ``` 现在,所有当前 namespace 中新创建的 pod 的 spec 中都会增加如下内容: ```yaml spec: imagePullSecrets: - name: myregistrykey ``` ## 参考 https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/