serviceaccount


weight: 44 title: ServiceAccount date: “2022-05-21T00:00:00+08:00” type: book summary: “ServiceAccountPod中的进程提供身份信息

ServiceAccountPod中的进程提供身份信息。

注意

本文档描述的关于ServiceAccount的行为只有当你按照Kubernetes项目建议的方式搭建集群的情况下才有效。集群管理员可能在你的集群中进行了自定义配置,这种情况下该文档可能并不适用。

当你(真人用户)访问集群(例如使用 kubectl 命令)时,API服务器会将你认证为一个特定的User Account(目前通常是 admin,除非你的系统管理员自定义了集群配置Pod容器中的进程也可以与API服务器联系。当它们在联系API服务器的时候,它们会被认证为一个特定的ServiceAccount(例如default

使用默认的ServiceAccount访问API服务器

当你创建pod的时候,如果你没有指定一个ServiceAccount,系统会自动得在与该pod相同的namespace下为其指派一个defaultServiceAccount。如果你获取刚创建的pod的原始jsonyaml信息(例如使用kubectl get pods/podename -o yaml命令,你将看到spec.serviceAccountName字段已经被设置为 default

你可以在pod中使用自动挂载的ServiceAccount凭证来访问API,如 Accessing the Cluster 中所描述。

ServiceAccount是否能够取得访问API的许可取决于你使用的 授权插件和策略

1.6以上版本中,你可以选择取消为ServiceAccount自动挂载API凭证,只需在ServiceAccount中设置 automountServiceAccountToken: false

apiVersion: v1
kind: ServiceAccount
metadata:
  name: build-robot
automountServiceAccountToken: false

1.6以上版本中,你也可以选择只取消单个podAPI凭证自动挂载:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  serviceAccountName: build-robot
  automountServiceAccountToken: false
  ...

如果在podServiceAccount中同时设置了automountServiceAccountToken, pod设置中的优先级更高。

使用多个ServiceAccount

每个namespace中都有一个默认的叫做 defaultServiceAccount资源。

你可以使用以下命令列出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

如果你看到如下的ServiceAccount对象的完整输出信息:

$ 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已经被自动创建,并被ServiceAccount引用。

你可以使用授权插件来 设置ServiceAccount的权限

设置非默认的ServiceAccount,只需要在podspec.serviceAccountName 字段中将name设置为你想要用的ServiceAccount名字即可。

pod创建之初ServiceAccount就必须已经存在,否则创建将被拒绝。

你不能更新已创建的podServiceAccount

你可以清理ServiceAccount,如下所示:

$ kubectl delete serviceaccount/build-robot

手动创建ServiceAccountAPI token

假设我们已经有了一个如上文提到的名为 ”build-robot“ 的ServiceAccount,我们手动创建一个新的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” 这个ServiceAccount原来的API token

所有已不存在的ServiceAccounttoken将被token controller清理掉。

$ 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

注意

该内容中的token被省略了。

ServiceAccount添加ImagePullSecret

首先,创建一个imagePullSecret,详见这里

然后,确认已创建。如:

$ kubectl get secrets myregistrykey
NAME             TYPE                              DATA    AGE
myregistrykey    kubernetes.io/.dockerconfigjson   1       1d

然后,修改namespace中的默认ServiceAccount使用该secret作为imagePullSecret

kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "myregistrykey"}]}'

Vi交互过程中需要手动编辑:

$ 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中新创建的podspec中都会增加如下内容:

spec:
  imagePullSecrets:
    - name: myregistrykey

参考

上一页
下一页