Skip to content

gke-gcloud-auth-plugin 及多帳號使用法

gke-gcloud-auth-plugin 是 GKE 用於 Kubernetes 新版的身份驗證插件,可以參考文章: Here's what to know about changes to kubectl authentication coming in GKE v1.26

依照文章的指引執行,最後一步會執行:

sh
gcloud container clusters get-credentials YOUR_CLUSTER_NAME

這個步驟會為 ~/.kube/config 加入 cluster, context 及 user...等設定,其中 user 的設定如下:

yaml
users:
- name: gke_xxx
  user:
    exec:
      apiVersion: client.authentication.k8s.io/v1beta1
      args: null
      command: gke-gcloud-auth-plugin
      env: null
      installHint: Install gke-gcloud-auth-plugin for use with kubectl by following
        https://cloud.google.com/blog/products/containers-kubernetes/kubectl-auth-changes-in-gke
      interactiveMode: IfAvailable
      provideClusterInfo: true

gke-gcloud-auth-plugin 指令會在「需要」的時候被執行,需要的情況如 token 過期、context 切換(且真正用到 kubectl 指令時),指令被執行的時候,會以「當前作用」的 gcloud configuration 去取得 token,然後 kubectl 會將這個 token 及 context 快取在 ~/.kube/gke_gcloud_auth_plugin_cache 這個檔案:

json
{
  "current_context": "xxx",
  "access_token": "xxx",
  "token_expiry": "2023-01-17T13:04:25Z"
}

之後 kubectl 指令的操作就會使用這個快取的 token 去驗證,而不用每次都重新透過 gke-gcloud-auth-plugin 取得新的 token。

以上是 gke-gcloud-auth-plugin 大致的運作流程。

多帳號使用法

假設我們有兩個叢集(cluster-a, cluster-b),且這兩個叢集屬於不同的 Google 帳號,因此我們會有兩組 gcloud config configurations 的設定(config-a, config-b),如果我們使用 kubectx cluster-a kubectx cluster-b 來切換 context,這樣一定會有其中一個叢集在操作 kubectl 指令時發生權限出錯的問題(如帳號 A 沒有權限去操作 cluster-b ),因為前面說到 gke-gcloud-auth-plugin 會以「當前作用」的 gcloud configuration 去取得 token。

因此我們需要在每一次切換 context 的時候,都要切換 gcloud 設定檔,這樣才能確保 gke-gcloud-auth-plugin 取得的 token 是正確的。

sh
gcloud config configurations activate config-a
kubectx cluster-a

gcloud config configurations activate config-b
kubectx cluster-b

既然知道是「作用中」的 configuration 決定 token 的實際身份,我們可以利用 CLOUDSDK_ACTIVE_CONFIG_NAME 這個環境變數,改變作用中的 configuration,同樣的,我們也可以把這個變數設定在 ~/.kube/config 的 user 設定中,這樣就可以不用再手動切換 gcloud 設定檔:

yaml
users:
- name: gke_cluster-a
  user:
    exec:
      apiVersion: client.authentication.k8s.io/v1beta1
      args: null
      command: gke-gcloud-auth-plugin
      # env: null
      # 加入 CLOUDSDK_ACTIVE_CONFIG_NAME 環境變數
      env:
        - name: CLOUDSDK_ACTIVE_CONFIG_NAME
          value: config-a
      installHint: Install gke-gcloud-auth-plugin for use with kubectl by following
        https://cloud.google.com/blog/products/containers-kubernetes/kubectl-auth-changes-in-gke
      interactiveMode: IfAvailable
      provideClusterInfo: true
- name: gke_cluster-b
  user:
    exec:
      apiVersion: client.authentication.k8s.io/v1beta1
      args: null
      command: gke-gcloud-auth-plugin
      # env: null
      # 加入 CLOUDSDK_ACTIVE_CONFIG_NAME 環境變數
      env:
        - name: CLOUDSDK_ACTIVE_CONFIG_NAME
          value: config-b
      installHint: Install gke-gcloud-auth-plugin for use with kubectl by following
        https://cloud.google.com/blog/products/containers-kubernetes/kubectl-auth-changes-in-gke
      interactiveMode: IfAvailable
      provideClusterInfo: true

完成後就能直接使用 kubectx 切換 context 了,不用再手動切換 gcloud 設定檔了。

Written By
YI FENG XIE
YI FENG XIE

Creative Problem Solver