ServiceAccount

Posted by     "Richie" on Wednesday, January 23, 2019

ServieAccount

Service Account 为Pod中的进程提供身份信息 当用户访问集群时(例如使用kubeclt 命令), apiserver 会将您认证为一个特定的UserAccount(例如admin). Pod容器中的进程也可以与apiserver通信。当它们在与apiserver通信时,它们会被认证为一个特定的ServiceAccount(例如default)

使用默认的Service Account 访问 API server

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

您可以在pod中使用自动挂载的service account 凭证来访问API, 如Accessing the Cluster 中所描述.

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

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

apiVersion: v1
kind: ServiceAccount
metadata:
  name: build-test
automountServiceAccountToken: false
...

在1.6以上版本中,您也可以选择只需要单个pod的API凭证自动挂载:

apiVersion: v1
kind: pod
metadata:
  name: my-pod
spec:
  serviceAccountName: built-test
  automountServiceAccountToken: false
...

如果在pod和service account 中同时设置了 automountServiceAccountToken,

使用多个Service Account

每个namespace 中都有一个默认的叫做default的 service account 资源. 您可以使用以下命令列出namespace下的所有ServiceAccount资源.

[root@10-10-215-69 ~]# kubectl get serviceaccounts
NAME      SECRETS   AGE
default   1         14d
testsa    1         7d

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

[root@10-10-215-69 k8s-demo]# cat > testsa.yaml <<EOF
> apiVersion: v1
> kind: ServiceAccount
> metadata:
>   name: richie-test
> EOF
[root@10-10-215-69 k8s-demo]# kubectl create -f testsa.yaml
serviceaccount/richie-test created
```python
[root@10-10-215-69 k8s-demo]# kubectl get serviceaccounts/richie-test -o yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  creationTimestamp: "2019-01-30T03:16:24Z"
  name: richie-test
  namespace: default
  resourceVersion: "1925406"
  selfLink: /api/v1/namespaces/default/serviceaccounts/richie-test
  uid: 6cb20967-243d-11e9-99b0-525400c5db01
secrets:
- name: richie-test-token-zh5t8

然后您将看到有一个token已经被自动创建, 并被service account 引用. 您可以使用授权插件来设置service account 的权限 设置非默认的service account, 只需要在pod的spec.serviceAccountName字段中将name 设置为您想要用的service account 名字即可.

在pod创建之初service account 就必须已经存在, 否则创建将被拒绝. 您不能更新已经创建的pod的serviceaccount. 您可以删除service account 如下示例:

[root@10-10-215-69 k8s-demo]# kubectl delete sa/richie-test
serviceaccount "richie-test" deleted

手动创建service account 的API token

假设我们已经有了一个如上文提到的名为"richie-test" 的service account, 我们手动创建一个新的secret.

[root@10-10-215-69 k8s-demo]# cat > richie-test-secret.yaml <<EOF
> apiVersion: v1
> kind: Secret
> metadata:
>   name: richie-test-secret
>   annotations:
>     kubernetes.io/service-account.name: richie-test
> type: kubernetes.io/service-account-token
> EOF
[root@10-10-215-69 k8s-demo]# kubectl create -f richie-test-secret.yaml
secret/richie-test-secret created

现在您可以确认下新创建的secret 取代了’richie-test’ 这个servie account 原来的API token.

[root@10-10-215-69 ~]# kubectl describe secrets/richie-test-secret
Name:         richie-test-secret
Namespace:    default
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: richie-test
              kubernetes.io/service-account.uid: ad47830f-2441-11e9-99b0-525400c5db01

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1310 bytes
namespace:  7 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6InJpY2hpZS10ZXN0LXNlY3JldCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJyaWNoaWUtdGVzdCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImFkNDc4MzBmLTI0NDEtMTFlOS05OWIwLTUyNTQwMGM1ZGIwMSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OnJpY2hpZS10ZXN0In0.DKIP1CcxBYkwgYdGQcCwV2VZXOHKsMk82ZAcx3PYbnzt-L243wy6Vowp1CWKpnyL-qyvqit9AP6wXAxZTrbAwTTEOb2KaTpv7SW5xhLErvtXbO2UD7ldYNAkvzhz0S28oIfUdhQo_1PU771GDhUMlrsVUrRLIt5S2rCDX9444wdx3BNDhtrd6vO013WNOAQ2zF9WEcClbhPQUBsfm6RtYb0QC1gUxe-JUW0UeqRM-lQ2JqcdKPoTq5HVPSY03eX3MazZ-1ULWESwgEHkMJZL9gdDC_2A-xAwLAFhoxhQr9NYQ5MbqxRlooZutESMOps5SecGpVcJZVVQ_D0BRRWijQ

「真诚赞赏,手留余香」

Richie Time

真诚赞赏,手留余香

使用微信扫描二维码完成支付