使用不記名權杖進行驗證

本頁面說明如何使用不記名權杖登入 Google Cloud以外的已註冊叢集,設定驗證。設定完成後,叢集管理員就能從Google Cloud 控制台登入叢集。支援 Kubernetes 驗證中指定的許多不記名憑證。最簡單的方式是在叢集中建立 Kubernetes 服務帳戶 (KSA),然後使用其不記名憑證登入

其他驗證方法

除了使用不記名權杖設定驗證之外,您也可以根據貴機構的需求,設定下列其中一種驗證方法:

  • Google 身分,可讓使用者透過 Google Cloud 身分登入。如果使用者已透過 Google 帳戶存取 Google Cloud ,請使用這個選項。

  • 如果叢集已設定為使用 OIDC 識別資訊提供者,您可以使用此方法從 Google Cloud 控制台向叢集進行驗證。如要瞭解如何為 GKE 叢集設定 OIDC,請參閱下列指南:

如果 Google 提供的驗證方法不適合貴機構,請按照本頁面的操作說明,使用不記名權杖設定驗證。

透過 Google Cloud 控制台授予 IAM 角色以取得存取權

如要使用 Google Cloud 控制台查看已連線的叢集,使用者至少需要下列 IAM 角色:

  • roles/container.viewer。使用者可透過這個角色在 Google Cloud 控制台中查看容器資源,包括 GKE 叢集頁面。如要進一步瞭解這個角色包含的權限,請參閱 IAM 說明文件中的「Kubernetes Engine 角色」。

  • roles/gkehub.viewer。使用者可透過這個角色,在 Google Cloud 控制台中查看Google Cloud 外部的叢集。如果機群不含外部叢集,使用者就不需要這個角色 Google Cloud。如要進一步瞭解這個角色包含的權限,請參閱 IAM 說明文件中的「GKE Hub 角色」。

執行下列指令來授予這些角色:

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member='user:EMAIL_ADDRESS' \
    --role=roles/container.viewer
gcloud projects add-iam-policy-binding PROJECT_ID \
    --member='user:EMAIL_ADDRESS' \
    --role=roles/gkehub.viewer

更改下列內容:

  • PROJECT_ID:機群主機專案的專案 ID。

  • EMAIL_ADDRESS:與使用者 Google Cloud 帳戶相關聯的電子郵件地址。

如要進一步瞭解如何授予 IAM 角色,請參閱 IAM 說明文件中的「管理專案、資料夾和機構的存取權」。

設定角色型存取權控管

叢集存取權是透過 Kubernetes 角色型存取權控管 (RBAC) 機制控管。

建議您或叢集管理員為登入叢集的每位使用者建立 KSA。使用不記名權杖就像使用密碼,因此每位使用者都應擁有自己的帳戶。以 KSA 的不記名憑證登入時,所有作業都會以 KSA 身分執行,且僅限於 KSA 持有的 RBAC 角色。

如要透過主控台存取叢集,KSA 至少須在叢集中擁有下列 RBAC 角色:

建立及套用 cloud-console-reader RBAC 角色

如要透過 Google Cloud 控制台 存取叢集資源,經過驗證的使用者必須具備相關的 Kubernetes 權限。如果您不想授予這些使用者更廣泛的權限 (例如叢集管理員權限),可以建立自訂 RBAC 角色,其中包含查看叢集節點、永久磁碟區、Pod 和儲存空間類別所需的最低權限。您可以在叢集中建立 ClusterRole RBAC 資源 cloud-console-reader,定義這組權限。

cloud-console-reader 會授予使用者叢集節點、永久磁碟區、Pod 和儲存空間類別的 getlistwatch 權限,讓使用者查看這些資源的詳細資料。

kubectl

如要建立 cloud-console-reader ClusterRole 並套用至叢集,請執行下列指令:

cat <<EOF > cloud-console-reader.yaml
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: cloud-console-reader
rules:
- apiGroups: [""]
  resources: ["nodes", "persistentvolumes", "pods"]
  verbs: ["get", "list", "watch"]
- apiGroups: ["storage.k8s.io"]
  resources: ["storageclasses"]
  verbs: ["get", "list", "watch"]
EOF
kubectl apply -f cloud-console-reader.yaml

接著,請按照下一節的說明,將這個角色授予 KSA。

建立並授權 KSA

kubectl

如要建立 KSA 並將權限繫結至該 KSA,請按照下列步驟操作:

  1. 建立 KSA 和 ClusterRoleBinding 資源,將 viewcloud-console-reader Kubernetes RBAC ClusterRoles 繫結至 KSA:

    KSA_NAME=KSA_NAME
    kubectl create serviceaccount ${KSA_NAME}
    kubectl create clusterrolebinding VIEW_BINDING_NAME \
       --clusterrole view --serviceaccount default:${KSA_NAME}
    kubectl create clusterrolebinding CLOUD_CONSOLE_READER_BINDING_NAME \
       --clusterrole cloud-console-reader --serviceaccount default:${KSA_NAME}
    

    更改下列內容:

    • KSA_NAME:您為 KSA 選擇的名稱
    • VIEW_BINDING_NAME:您為 view ClusterRoleBinding 資源選擇的名稱;您可以為其命名,但以 KSA 命名可能最簡單
    • CLOUD_CONSOLE_READER_BINDING_NAME:您為 cloud-console-reader ClusterRoleBinding 資源選擇的名稱;您也可以為這個資源指定任何名稱
  2. 視服務帳戶應有的存取權而定,將其他角色繫結至 KSA。如需相關選項,請參閱 Kubernetes 預設角色

    舉例來說,如果您想從 Cloud Marketplace 部署 Kubernetes 應用程式,請將 cluster-admin 角色繫結至 KSA:

    kubectl create clusterrolebinding BINDING_NAME \
       --clusterrole cluster-admin --serviceaccount default:KSA_NAME
    

    BINDING_NAME 替換為服務帳戶的叢集角色繫結名稱。

授權其他帳戶

kubectl

如要讓其他使用者或服務帳戶存取叢集,請建立 ClusterRoleBinding 資源,將 viewcloud-console-reader 角色繫結至他們的帳戶:

  1. 繫結 viewcloud-console-reader ClusterRoles

    ACCOUNT_NAME=ACCOUNT_NAME
    kubectl create clusterrolebinding VIEW_BINDING_NAME \
       --clusterrole view --serviceaccount default:${ACCOUNT_NAME}
    kubectl create clusterrolebinding CLOUD_CONSOLE_READER_BINDING_NAME \
       --clusterrole cloud-console-reader --serviceaccount default:${ACCOUNT_NAME}
    

    更改下列內容:

    • ACCOUNT_NAME:Kubernetes 服務帳戶
    • VIEW_BINDING_NAME:您為 view ClusterRoleBinding 資源選擇的名稱;您可以為其指定任何名稱,但以使用者或服務帳戶命名可能最簡單
    • CLOUD_CONSOLE_READER_BINDING_NAME:您為 view ClusterRoleBinding 資源選擇的名稱;您也可以將此資源命名為任何名稱
  2. 視帳戶應有的存取權,繫結其他角色。如需相關選項,請參閱 Kubernetes 預設角色

    舉例來說,如要繫結 cluster-admin 角色,請執行下列指令:

    kubectl create clusterrolebinding BINDING_NAME \
       --clusterrole cluster-admin --serviceaccount default:ACCOUNT_NAME
    

    BINDING_NAME 替換為服務帳戶的叢集角色繫結名稱。

取得 KSA 的不記名憑證

kubectl

若要取得 KSA 的不記名憑證,請執行下列指令︰

SECRET_NAME=KSA_NAME-token

kubectl apply -f - << __EOF__
apiVersion: v1
kind: Secret
metadata:
  name: "${SECRET_NAME}"
  annotations:
    kubernetes.io/service-account.name: "${KSA_NAME}"
type: kubernetes.io/service-account-token
__EOF__

until [[ $(kubectl get -o=jsonpath="{.data.token}" "secret/${SECRET_NAME}") ]]; do
  echo "waiting for token..." >&2;
  sleep 1;
done

kubectl get secret ${SECRET_NAME} -o jsonpath='{$.data.token}' | base64 --decode

KSA_NAME 替換成您為 KSA 選擇的名稱。

從該指令的輸出複製憑證並加以儲存,供使用者登入 Google Cloud 控制台