Appearance
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 設定檔了。