設定 Connect Gateway

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

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

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

這項設定只允許根據使用者和服務的個別 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 \
    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。使用者可透過這個角色在控制台中查看 GKE 叢集頁面和其他容器資源。 Google Cloud 如要進一步瞭解這個角色包含的權限,請參閱 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 參考指南

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 則提供較廣泛的「情境式 perimeter 安全防護功能」,包括控管跨 perimeter 的資料輸出。舉例來說,您可以指定只有特定專案可以存取 BigQuery 資料。如要進一步瞭解 VPC Service Controls 如何保護資料,請參閱 VPC Service Controls 總覽

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

後續步驟