1. 程式人生 > >在 kubectl 中使用 Service Account Token_Kubernetes中文社群

在 kubectl 中使用 Service Account Token_Kubernetes中文社群

在執行基於 Kubernetes 的 CI/CD 過程中,經常有需求在容器中對 Kubernetes 的資源進行操作,其中隱藏的安全問題,目前推薦的最佳實踐也就是使用 Service Account 了。而除錯賬號能力的最好方法,必須是 kubectl 了。下面就講講如何利用 kubectl 引用 Servie Account 憑據進行 Kubernetes 操作的方法。

這裡用 default Service Account 為例

假設

目前已經能對目標叢集進行操作,文中需要的許可權主要就是讀取名稱空間中的 Secret 和 Service Account。

準備配置檔案

新建一個 Yaml 檔案,命名請隨意,例如 kubectl.yaml。內容:

apiVersion: v1
kind: Config
clusters:
- cluster:
    certificate-authority-data: {ca data}
    server: https://{server}
  name: awesome-cluster
users:
- user:
    token: {token}
  name: account
- context:
    cluster: awesome-cluster
    user: account
  name: sa
current-context: sa

其中的 {ca data} 可以從現有連線憑據中獲取。

{server}:伺服器地址

{token}:將在後面設定

獲取資料

首先檢視 Service Account 的 Token 在哪裡:

kubectl get serviceaccount default -o yaml

返回內容如下:

apiVersion: v1
kind: ServiceAccount
metadata:
  creationTimestamp: 2017-05-07T10:41:50Z
  name: default
  namespace: default
  resourceVersion: "26"
  selfLink: /api/v1/namespaces/default/serviceaccounts/default
  uid: c715217d-3311-11e7-a4ae-42010a8c0095
secrets:
- name: default-token-7h4bd

這裡我們看到他包含了 secret: “default-token-7h4bd”,獲取其中的內容:

kubectl get secret default-token-7h4bd -o yaml

apiVersion: v1
data:
  ca.crt: [ca data]   
  namespace: ZGVmYXVsdA==
  token: [token data]
  kind: Secret
metadata:
  annotations:
    kubernetes.io/service-account.name: default
    kubernetes.io/service-account.uid: c715217d-3311-11e7-a4ae-42010a8c0095
  creationTimestamp: 2017-05-07T10:41:50Z
  name: default-token-7h4bd
  namespace: default
  resourceVersion: "24"
  selfLink: /api/v1/namespaces/default/secrets/default-token-7h4bd
  uid: c71cc72d-3311-11e7-a4ae-42010a8c0095
type: kubernetes.io/service-account-token

上面 Token Data 內容就是我們需要的認證 Token 了

export my_token="[tokendata]"
kubectl --kubeconfig=kubectl.yaml \
config set-credentials account \
--token=`echo ${tokendata} | base64 -D`

這樣就把 Service Account 的 Token 取出來,並儲存在 kubectl.yaml 中。利用這一配置檔案就可以憑 Service Account 的身份來執行 kubectl 指令了。