設定 Connect Gateway

本指南適用於平台管理員,他們需要設定 Connect 閘道,供專案使用者和服務帳戶使用。完成設定後,使用者可以:

  • 使用 Google Cloud 控制台登入外部已註冊的叢集Google Cloud ,並使用 Google Cloud 身分。

  • 使用 kubectl 透過 Connect Gateway 存取叢集。

這項設定只允許根據使用者和服務的個別 ID 進行驗證,而非根據他們是否為 Google 群組成員。如要設定其他群組支援,請參閱「使用 Google 網路論壇設定 Connect Gateway」。

如果您不熟悉 Connect 閘道,請參閱總覽,瞭解基本概念和運作方式。

事前準備

  1. 確認您已安裝下列指令列工具:

    • 最新版 Google Cloud CLI,這是與 Google Cloud互動的指令列工具。
    • kubectl,可對 Kubernetes 叢集執行指令。如需安裝 kubectl,請按照這些操作說明進行

    如果您使用 Cloud Shell 做為與Google Cloud互動的 Shell 環境,系統會為您安裝這些工具。

  2. 初始化 gcloud CLI 以搭配專案使用,或執行下列指令授權 gcloud CLI,並將專案設為預設專案:

    gcloud auth login
    gcloud config set project PROJECT_ID
    

設定所需的 IAM 角色

本指南假設您在專案中具備 roles/owner 權限。如果您不是專案擁有者,請要求專案擁有者授予您專案的額外權限,以便執行下列工作:

  • 如要啟用 API,您需要 serviceusage.services.enable 權限,這項權限包含在服務使用情形管理員角色 (roles/serviceusage.serviceUsageAdmin) 中。專案擁有者可以建立啟用 serviceusage.services.enable 權限的自訂角色,也可以授予您 roles/serviceusage.serviceUsageAdmin,方法如下:

    gcloud projects add-iam-policy-binding PROJECT_ID \
       --member user:USER_EMAIL_ADDRESS \
       --role='roles/serviceusage.serviceUsageAdmin'
    
  • 如要將 IAM 權限授予使用者和服務帳戶,讓他們可以使用 Connect 閘道,您需要「專案 IAM 管理員」角色 (roles/resourcemanager.projectIamAdmin)。專案擁有者可以使用下列指令授予這項角色:

    gcloud projects add-iam-policy-binding PROJECT_ID \
       --member user:USER_EMAIL_ADDRESS \
       --role='roles/resourcemanager.projectIamAdmin'
    

啟用 API

如要將閘道新增至專案,請啟用 Connect 閘道 API 及其必要依附元件 API。如果使用者只想使用 Google Cloud 控制台向叢集進行驗證,則不需要啟用connectgateway.googleapis.com,但必須啟用其他 API。

gcloud services enable --project=PROJECT_ID  \
    connectgateway.googleapis.com \
    anthos.googleapis.com \
    gkeconnect.googleapis.com \
    gkehub.googleapis.com \
    cloudresourcemanager.googleapis.com

驗證已註冊的叢集

只有向專案機群註冊的叢集,才能透過 Connect 閘道存取。建立地端和其他公有雲的 GKE 叢集時,系統會自動註冊這些叢集。不過, Google Cloud 上的 GKE 叢集和連結的叢集必須分開註冊。如需註冊叢集,請按照叢集註冊指南中的說明操作。請注意,GKE 叢集必須註冊至機群,才能使用閘道。

如要確認叢集已註冊,請執行下列指令:

gcloud container fleet memberships list

您應該會看到所有已註冊叢集的清單,如下列範例輸出內容所示:

NAME         EXTERNAL_ID
cluster-1    0192893d-ee0d-11e9-9c03-42010a8001c1
cluster-2    f0e2ea35-ee0c-11e9-be79-42010a8400c2

將 IAM 角色授予使用者

叢集的存取權由 Identity and Access Management (IAM) 控管。使用 kubectl 存取叢集所需的 IAM 角色,與在 Google Cloud 控制台中存取叢集所需的角色略有不同,詳情請參閱下列各節。

透過 kubectl 授予存取權的角色

如要透過 Connect 閘道使用 kubectl 與叢集互動,使用者和服務帳戶至少需要下列 IAM 角色 (除非使用者在專案中擁有 roles/owner):

  • roles/gkehub.gatewayAdmin:使用者可透過此角色存取 Connect 閘道 API,並使用 kubectl 管理叢集。這個角色包含 gkehub.gateway.stream 權限,可讓使用者執行 attachcpexec kubectl 指令。如要瞭解執行這些指令的其他需求條件,請參閱指令的預先發布支援功能

    • 如果使用者只需要連線叢集的唯讀存取權,可以改為授予roles/gkehub.gatewayReader

    • 如果使用者需要連線叢集的讀取 / 寫入權限,您可以授予roles/gkehub.gatewayEditor

  • roles/gkehub.viewer:使用者可透過這個角色擷取叢集 kubeconfigs

如要進一步瞭解這些角色包含的權限,請參閱 IAM 說明文件中的「GKE Hub 角色」。

您可以使用下列指令授予這些角色:

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=MEMBER \
    --role=GATEWAY_ROLE
gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=MEMBER \
    --role=roles/gkehub.viewer

其中:

  • MEMBER 是使用者或服務帳戶,格式為 user|serviceAccount:emailID,例如:

    • user:alice@example.com
    • serviceAccount:test_sa@example-project.iam.gserviceaccount.com
  • GATEWAY_ROLE 可以是 roles/gkehub.gatewayAdminroles/gkehub.gatewayReaderroles/gkehub.gatewayEditor

如要進一步瞭解如何授予 IAM 權限和角色,請參閱「授予、變更及撤銷資源的存取權」。

透過 Google Cloud 控制台授予存取角色

如要透過 Google Cloud 使用 Google Cloud 控制台與叢集互動,使用者至少需要下列 IAM 角色才能查看叢集:

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

  • roles/gkehub.viewer。使用者可透過這個角色在 Google Cloud 控制台中查看外部叢集。Google Cloud 請注意,這是存取 kubectl 的必要角色之一。如果已將這個角色授予使用者,就不需要再次授予。如要進一步瞭解這個角色包含的權限,請參閱 IAM 說明文件中的「GKE Hub 角色」。

    在下列指令中,將 PROJECT_ID 替換為車隊主專案的專案 ID。此外,請使用 user|serviceAccount:emailID 格式,將 MEMBER 替換成使用者的電子郵件地址或服務帳戶,例如:

    • user:alice@example.com
    • serviceAccount:test_sa@example-project.iam.gserviceaccount.com
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=MEMBER \
        --role=roles/container.viewer
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=MEMBER \
        --role=roles/gkehub.viewer
    

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

設定 RBAC 授權

每個叢集的 Kubernetes API 伺服器都必須能夠授權來自 Google Cloud 控制台或 kubectl 指令的要求,這些要求是透過 Connect 閘道,從您指定的使用者和服務帳戶傳送。為確保這一點,您必須更新每個叢集上的角色型存取權控管 (RBAC) 政策,才能透過閘道存取這些叢集。您需要新增或更新下列政策:

  • 模擬政策,授權 Connect 代理程式代表使用者將要求傳送至 Kubernetes API 伺服器。
  • 權限政策,指定使用者在叢集中的權限。這可以是叢集層級的角色,例如 clusterrole/cluster-adminclusterrole/cloud-console-reader,也可以是命名空間層級的角色,例如 role/default/pod-reader

(選用) 建立 cloud-console-reader 角色

如要透過 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

接著,您可以在設定權限政策時,將這個角色授予使用者,詳情請參閱下一節。

建立及套用必要的 RBAC 政策

以下說明如何建立及套用必要的 RBAC 政策。最簡單的方法是使用 gcloud CLI,為您產生及套用適當的政策。或者,您也可以視需要建立 RBAC 政策檔案,並使用 kubectl 套用。

gcloud

如要使用 gcloud CLI 為所選叢集產生及套用政策,請執行下列指令:

gcloud container fleet memberships generate-gateway-rbac  \
    --membership=MEMBERSHIP_NAME \
    --role=ROLE \
    --users=USERS \
    --project=PROJECT_ID \
    --kubeconfig=KUBECONFIG_PATH \
    --context=KUBECONFIG_CONTEXT \
    --apply

更改下列內容:

  • MEMBERSHIP_NAME:用於在車隊中以專屬方式代表叢集的名稱。如要瞭解如何查看叢集的成員名稱,請參閱「取得車隊成員狀態」。
  • ROLE:要授予叢集使用者存取權的 Kubernetes 角色,例如 clusterrole/cluster-adminclusterrole/cloud-console-readerrole/mynamespace/namespace-reader。執行指令前,這個角色必須已存在。
  • USERS:以半形逗號分隔的清單,列出要授予權限的使用者 (使用者帳戶或服務帳戶) 電子郵件地址。例如: --users=dana@example.com,test-acct@test-project.iam.gserviceaccount.com
  • PROJECT_ID:叢集註冊的專案 ID。
  • KUBECONFIG_PATH:儲存叢集項目 kubeconfig 的本機路徑。在大多數情況下,這個值是 $HOME/.kube/config
  • KUBECONFIG_CONTEXT:叢集的內容,因為其出現在 kubeconfig 檔案中。如要從指令列取得目前的環境,請執行 kubectl config current-context。無論是否使用目前的環境,請務必執行下列指令,確認環境可存取叢集:

    kubectl get namespaces \
      --kubeconfig=KUBECONFIG_PATH \
      --context=KUBECONFIG_CONTEXT

執行 gcloud container fleet memberships generate-gateway-rbac 後,輸出內容結尾會顯示類似下列的內容,為方便閱讀,部分內容已遭截斷

Validating input arguments.
Specified Cluster Role is: clusterrole/cluster-admin
Generated RBAC policy is:
--------------------------------------------
...
---
Applying the generate RBAC policy to cluster with kubeconfig: artifacts/kubeconfig, context: example-cluster-admin@example-cluster
Writing RBAC policy for user: 222larabrown@gmail.com to cluster.
Successfully applied the RBAC policy to cluster.

這是透過 Connect 閘道存取叢集的環境。

如要進一步瞭解 generate-gateway-rbac 指令,請參閱 gcloud CLI 參考指南

如果執行這項指令時看到 ERROR: (gcloud.container.hub.memberships) Invalid choice: 'generate-gateway-rbac' 等錯誤,請按照更新指南更新 Google Cloud CLI。

kubectl

以下範例說明如何為使用者 (dana@example.com) 和服務帳戶 (test@example-project.iam.gserviceaccount.com) 建立適當的政策,授予兩者叢集上的 cluster-admin 權限,並將政策檔案儲存為 /tmp/gateway-rbac.yaml。然後,政策會套用至與目前環境相關聯的叢集:

cat <<EOF > /tmp/gateway-rbac.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: gateway-impersonate
rules:
- apiGroups:
  - ""
  resourceNames:
  - dana@example.com
  - test@example-project.iam.gserviceaccount.com
  resources:
  - users
  verbs:
  - impersonate
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: gateway-impersonate
roleRef:
  kind: ClusterRole
  name: gateway-impersonate
  apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
  name: connect-agent-sa
  namespace: gke-connect
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: gateway-cluster-admin
subjects:
- kind: User
  name: dana@example.com
- kind: User
  name: test@example-project.iam.gserviceaccount.com
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io
EOF
# Apply policies to the cluster.
kubectl apply --kubeconfig=KUBECONFIG_PATH  -f /tmp/gateway-rbac.yaml

如要進一步瞭解如何指定 RBAC 權限,請參閱「使用 RBAC 授權」。

VPC Service Controls 支援

VPC Service Controls 可為Google Cloud 服務提供 Identity and Access Management (IAM) 以外的另一層防護。IAM 提供精細的「身分式存取權控管功能」,VPC Service Controls 則提供較廣泛的「情境式範圍安全防護功能」,包括控管跨範圍的資料輸出作業。舉例來說,您可以指定只有特定專案可以存取 BigQuery 資料。如要進一步瞭解 VPC Service Controls 如何保護資料,請參閱 VPC Service Controls 總覽

確認可從指定服務範圍內存取使用閘道所需的 API 後,即可搭配 Connect 閘道使用 VPC Service Controls,進一步確保資料安全。

後續步驟