UP | HOME

Service Account

Table of Contents

Service Account 为Pod中的进程提供 身份 信息

注意:接下来是关于 Service Account 的用户指南,而不是 Service Account 的集群管理指南

如果k8s集群管理员可能在集群中有自定义配置,这种情况下接下来描述的内容可能并不适用

默认的 Service Account

当创建 pod 的时候,如果没有指定一个 service account,系统会自动在与 该pod 相同的 namespace 下为其 指派 一个 default service account

如果获取刚创建的 pod 的原始 json 或 yaml 信息,例如使用kubectl get pods/podename -o yaml命令,将看到spec.serviceAccountName字段已经被设置为 default

可以在 pod 中使用自动挂载的 service account 凭证来访问 API,是否能够取得访问 API 的许可取决于使用的 授权插件和策略

  • 可以选择取消为 service account 自动挂载 API 凭证,只需在 service account 中设置 automountServiceAccountToken: false

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: build-robot
    automountServiceAccountToken: false
    
  • 可以选择只取消单个 pod 的 API 凭证自动挂载:

    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 资源:

$ kubectl get serviceAccounts
NAME      SECRETS    AGE
default   1          1d

可以像这样创建一个 ServiceAccount 对象:

$ cat > /tmp/serviceaccount.yaml <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
  name: build-robot
EOF
$ kubectl create -f /tmp/serviceaccount.yaml
serviceaccount "build-robot" created

这个 Service account 对象的完整输出信息:

$ kubectl get serviceaccounts/build-robot -o yaml
apiVersion: v1
kind: ServiceAccount
metadata:
creationTimestamp: 2015-06-16T00:12:59Z
name: build-robot
namespace: default
resourceVersion: "272500"
selfLink: /api/v1/namespaces/default/serviceaccounts/build-robot
uid: 721ab723-13bc-11e5-aec2-42010af0021e
secrets:
- name: build-robot-token-bvbk5
看到有一个 token 已经被自动创建,并被 service account 引用

清理 service account:

$ kubectl delete serviceaccount/build-robot

注意:

  • 可以使用授权插件来 设置 service account 的权限
  • 设置非默认的 service account,只需要在 pod 的spec.serviceAccountName 字段中将name设置为想要用的 service account 名字即可
  • 在 pod 创建之初 service account 就必须已经存在,否则创建将被拒绝
  • 不能更新已创建的 pod 的 service account

API token

假设已经有了一个如上文提到的名为 build-robot 的 service account,手动创建一个新的 secret:

$ cat > /tmp/build-robot-secret.yaml <<EOF
apiVersion: v1
kind: Secret
metadata:
  name: build-robot-secret
  annotations: 
    kubernetes.io/service-account.name: build-robot
type: kubernetes.io/service-account-token
EOF
$ kubectl create -f /tmp/build-robot-secret.yaml
secret "build-robot-secret" created

现在可以确认下新创建的 secret 取代了 build-robot 这个 service account 原来的 API token:

$ kubectl describe secrets/build-robot-secret 
Name:   build-robot-secret
Namespace:  default
Labels:   <none>
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
所有已不存在的 service account 的 token 将被 token controller 清理掉

Image Pull Secret

首先,创建一个 imagePullSecret:

kubectl create secret docker-registry <name> --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL

确认已创建:

$ 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"}]}'
$ 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
Vi 交互过程中需要手动编辑

现在,所有当前 namespace 中新创建的 pod 的 spec 中都需要增加如下内容:

spec:
  imagePullSecrets:
  - name: myregistrykey
Next: RBAC Home:安全