Kubernetes-Service Account


  • kube-apiserver

配置文件:/etc/kubernetes/apiserver

KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"

KUBE_API_PORT="--port=8080"

KUBE_ETCD_SERVERS="--etcd-servers=http://127.0.0.1:2379"

KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"

KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota,ServiceAccount"

KUBE_API_ARGS=""

Configure Service Accounts for Pods

ServiceAccount給運行在Pod中的進程提供一個身份。

若要詳細了解,需要參考文檔https://kubernetes.io/docs/admin/service-accounts-admin/

注:這篇文章描述了ServiceAccount在Kubernetes集群中的表現方式。你的集群管理員可能有自定義的表現在你自己的集群中,所以在某些情景下面,這篇文檔並不符合。

當你可以進入到集群(kubectl),你將被apiserver認定為一個特殊的用戶(admin,除非你的集群管理員有自定義了集群的某些設置),在Pod中的容器中的進程也可以與apiserver通信,當他們通信的時候,他們將被認定為一個特殊的ServiceAccount(default)。

Use the Default Service Account to access the API server

當你創建一個Pod並沒有指定一個service account,它將自動的為Pod在相同的namespace中分配default service account。當你截取你所創建的Pod信息為json或yaml格式輸出(例如:kubectl get pods/podname -o yaml ),你將會看到spec.serviceAccountName字段被自動的設置。

Pod可以使用自動掛載的service account憑證來獲取訪問API的權限,就如在訪問集群的時候一樣。service account的權限取決於在用的認證插件及策略。

在1.6版本以后,你可以通過設置automountServiceAccountToken:false對某個service account不加載API憑證:

apiVersion: v1

kind:ServiceAccount

metadata:

    name:build-robot

automountServiceAccountToken:false

在1.6版本之后,你可以選擇不加載API憑據到一個特殊的Pod中:

apiVersion:v1

kind:Pod

metadata:

    name:my-pod

spec:

    serviceAccountName:build-robot

    automountServiceAccountToken:false

如果在Pod和ServiceAccout中均設置的automountServiceAccountToken,在Pod的sepc中設置的優先於在service account。

Use Multiple Service Accounts

每一個namespace都有一個默認的service account(default),可以通過如下命令來列出相應namespace下的所有service account:

  • kubectl get serviceAccount

你也可以創建額外的ServiceAccount如:

  • cat serviceaccount.yaml

apiVersion:v1

kind:ServiceAccount

metadata:

    name:build-robot

  •     kubectl create -f serviceaccount.yaml

如果你查看一個完整的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

通過上面的信息就可以發現,一個令牌被自動創建生成並被ServiceAccount引用。

你也可以通過認證插件來設置service account的權限。

如果你不想使用默認的service account,只需要在spec.serviceAccountName字段設置你想使用的serviceaccount的名字就可以了。

可以通過如下命令對serviceaccount進行清除:

  • kubectl delete serviceaccount/build-robot

Manaually create a service account API token

假如有一個已經存在的service account叫“build-robot”,我們手動創建一個新的secret。

  • cat build-robot-secret.yaml

apiVersion: v1

kind:Secret

metadata:

    name:build-robot-secret

    annotations:

        kubernetes.io/service-account.name:build-robot

type:kubernetes.io/service-account-token

  • kubectl create -f build-robot-secret.yaml

現在你可以確認新構建的secret使用了build-robot的service account的API令牌。

不存在的service account的任何令牌都將被令牌控制器清理。

  • kubectl describe secrets/build-robot-secret
$ 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=da68f9c6-9d26-11e7-b84e-002dc52800da Type: kubernetes.io/service-account-token Data ==== ca.crt: 1338 bytes namespace: 7 bytes token: ...

注:此處令牌的內容被省略

Add ImagePullSecret to a service account

首先創建一個imagePullSecret,然后再驗證他被創建。

  • kubectl get secrets myregistrykey
  • kubectl patch serviceaccount default -p ‘{“imagePullSecrets”:[{"name":myregistrykey}]}’

上面的命令則是修改一個namespace默認的service account,使其用這個secret作為一個imagePullSecret。

互動版本需要手動編輯:

  • kubectl get serviceaccounts default -o yaml > ./sa.yaml
  • cat sa.yaml

apiVersion: v1

kind: ServiceAccount

metadata:

    creationTimestamp: 2017-11-20T22:23:33Z

    name: default

    namespace: default

    resourceVersion: "243024"

    selfLink: /api/v1/namespace/default/serviceaccounts/default

    uid: 3ee3453r-3erfd-112e-33rf-dfgt5678ujyh

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: 2017-11-20T22:23:33Z

    name: default

    namespace: default

    resourceVersion: "243024"

    selfLink: /api/v1/namespace/default/serviceaccounts/default

    uid: 3ee3453r-3erfd-112e-33rf-dfgt5678ujyh

secrets:

- name: default-token-uudge

imagePullSecrets:

- name: myregistrykey

在這個namespace中任何創建的新的pods將會加上這個imagePullSecrets。

spec:

    imagePullSecrets:

    - name: myregistrykey

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM