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
「真诚赞赏,手留余香」
真诚赞赏,手留余香
使用微信扫描二维码完成支付