使用 asmcli 佈建代管 Cloud Service Mesh
總覽
代管 Cloud Service Mesh 搭配 asmcli 服務提供代管控制層和代管資料層,設定簡單。Google 會以回溯相容的方式,為您處理穩定性、升級、資源調度和安全性工作。本指南說明如何使用 asmcli,在單一或多叢集設定中,設定應用程式或將應用程式遷移至代管 Cloud Service Mesh。
如要瞭解代管 Cloud Service Mesh 支援的功能和限制,請參閱「代管 Cloud Service Mesh 支援的功能」。
必要條件
本指南假設您已具備下列條件:
- 雲端專案
- Cloud Billing 帳戶
- 取得佈建 Cloud Service Mesh 的必要權限
asmcli安裝工具、kpt,以及「安裝必要工具」中指定的其他工具
如要加快佈建速度,叢集必須啟用 Workload Identity。如果未啟用 Workload Identity,佈建程序會自動啟用這項功能。
需求條件
- 一或多個叢集,且叢集使用支援的 GKE 版本,並位於支援的區域。
- 請注意,受管理 Cloud Service Mesh 會使用 GKE 發布管道,在穩定性和升級速度之間取得平衡。Cloud Service Mesh 叢集內元件 (包括 CNI、MDPC、Proxy 和 Istio CRD) 的新變更,會先推出至訂閱 GKE Rapid Channel 的叢集。如果穩定性足夠,就會升級至 GKE 一般版,最後再升級至 GKE 穩定版。
- 最佳做法是在較早的 GKE 發布管道中,佈建部分機群叢集,確保這些叢集優先收到 Cloud Service Mesh 元件的更新。
- 受管理 Cloud Service Mesh 不支援變更 GKE 發布管道。
- 如果您變更 GKE 發布管道,Cloud Service Mesh 不會阻止這項作業。Cloud Service Mesh 會自動更新叢集內元件 (CNI、MDPC、預設注入的 Proxy 版本和 Istio CRD),與目前的 GKE 發布管道保持一致。
- 請確保叢集有足夠的容量,可供叢集中安裝受管理 Cloud Service Mesh 時所需的元件。
kube-system命名空間中的mdp-controllerDeployment 要求 cpu:50m、memory: 128Mi。kube-system命名空間中的istio-cni-nodeDaemonSet 會在每個節點上要求 cpu: 100m、memory: 100Mi。
- 確認機構政策
constraints/compute.disableInternetNetworkEndpointGroup已停用。 如果啟用這項政策,ServiceEntry 可能無法運作。 - 確認您從中佈建受管理 Cloud Service Mesh 的用戶端電腦,已連線至 API 伺服器。
- 叢集必須註冊至機群。
您可以在佈建前單獨執行這個步驟,也可以傳遞
--enable-registration和--fleet-id旗標,在佈建時一併執行。 專案必須啟用 Service Mesh 機群功能。您可以傳送
--enable-gcp-components啟用這項功能,也可以執行下列指令:gcloud container fleet mesh enable --project=FLEET_PROJECT_ID
其中 FLEET_PROJECT_ID 是機群主專案的專案 ID。
GKE Autopilot 僅支援 GKE 1.21.3 以上版本。
Cloud Service Mesh 可在單一專案單一網路環境或多專案單一網路環境中使用多個 GKE 叢集。
- 如果加入的叢集不在同一個專案中,則必須註冊至同一個機群主專案,且叢集必須在同一個網路中,一起採用共用虛擬私有雲設定。
- 如果是單一專案的多叢集環境,機群專案可以與叢集專案相同。如要進一步瞭解車隊,請參閱「車隊總覽」。
- 如果是多專案環境,建議您在叢集專案以外的專案中代管機群。如果貴機構的組織政策和現有設定允許,建議您使用 Shared VPC 專案做為機群主機專案。詳情請參閱「使用 Shared VPC 設定叢集」。
- 如果貴機構使用 VPC Service Controls ,且您在 GKE 叢集上佈建 Cloud Service Mesh 時,發布版本大於或等於 1.22.1-gke.10,則可能需要採取額外的設定步驟:
- 如果您在一般或穩定
發布管道上佈建 Cloud Service Mesh,則套用代管控制層時,必須使用額外的
--use-vpcsc旗標,並遵循 VPC Service Controls (預先發布版) 指南。否則佈建作業會無法通過安全控管。 - 如果您是在快速
發布管道上佈建 Cloud Service Mesh,則套用代管控制層時不需要使用額外的
--use-vpcsc旗標,但需要遵循 VPC Service Controls (正式版) 指南。
- 如果您在一般或穩定
發布管道上佈建 Cloud Service Mesh,則套用代管控制層時,必須使用額外的
安裝 Cloud Service Mesh 時所需的角色
下表說明安裝受管理 Cloud Service Mesh 時所需的角色。
| 角色名稱 | 角色 ID | 授予位置資訊存取權 | 說明 |
|---|---|---|---|
| GKE Hub 管理員 | roles/gkehub.admin | 機群專案 | 具備 GKE Hub 和相關資源的完整存取權限。 |
| 服務使用情形管理員 | roles/serviceusage.serviceUsageAdmin | 機群專案 | 可啟用、停用及檢查服務狀態、檢查作業,以及消耗消費者專案的配額和帳單。(Note 1) |
| CA 服務管理員 Beta 版 | roles/privateca.admin | 機群專案 | 具備所有 CA 服務資源的完整存取權限。 (Note 2) |
執行 Cloud Service Mesh 時所需的角色
下表說明服務帳戶執行受管理 Cloud Service Mesh 時所需的角色。如果網路或叢集專案與機群主專案不同,您必須在其他專案中,將這些角色授予機群專案中的服務帳戶。
| 角色名稱 | 角色 ID | 授予位置資訊存取權 | 說明 |
|---|---|---|---|
| Anthos 服務網格服務代理 | roles/anthosservicemesh.serviceAgent | 機群專案 | |
| 網格代管控制層服務代理 (舊版) | roles/meshcontrolplane.serviceAgent | 機群專案 | 這是舊版角色,屬於舊版 Cloud Service Mesh 安裝作業。如果您的安裝項目有這個服務角色,可以保留原狀。新安裝項目不需要這個角色。 |
限制
建議您查看 Cloud Service Mesh 支援的功能和限制清單。請特別注意下列事項:
不支援使用
hostNetwork: true執行的工作負載 Pod。由於
IstioOperatorAPI 的主要用途是控制叢集內元件,因此不支援這項 API。
如果是 GKE Autopilot 叢集,只有 GKE 1.23 以上版本支援跨專案設定。
對於 GKE Autopilot 叢集,為了配合 GKE Autopilot 資源上限,預設的 Proxy 資源要求和限制會設為 500 m CPU 和 512 MB 記憶體。您可以使用自訂插入覆寫預設值。
如果是 GKE Autopilot 叢集,在叢集的 NodePool 擴充前,Cloud Service Mesh 元件可能會顯示「DaemonSet has no nodes selected」警告。
在受管理控制層的佈建程序中,系統會在指定叢集中佈建 Istio CRD。如果叢集內有現有的 Istio CRD,系統會覆寫這些 CRD。
Istio CNI 和 Traffic Director 與 GKE Sandbox 不相容。因此,透過
TRAFFIC_DIRECTOR實作的代管 Cloud Service Mesh 不支援已啟用 GKE Sandbox 的叢集。asmcli工具必須有權存取 Google Kubernetes Engine (GKE) 端點。 您可以透過「跳躍」伺服器 (例如虛擬私有雲 (VPC) 內的 Compute Engine VM,提供特定存取權) 設定存取權。
事前準備
設定 gcloud
即使使用 Cloud Shell,也請完成下列步驟。
使用 Google Cloud CLI 進行驗證:
gcloud auth login --project PROJECT_ID其中 PROJECT_ID 是叢集專案的專屬 ID。 執行下列指令來取得 PROJECT_ID:
gcloud projects list --filter="<PROJECT ID>" --format="value(PROJECT_NUMBER)" ```更新元件:
gcloud components update設定
kubectl以指向叢集。gcloud container clusters get-credentials CLUSTER_NAME \ --zone CLUSTER_LOCATION \ --project PROJECT_ID
下載安裝工具
將最新版本的工具下載至目前的工作目錄:
curl https://storage.googleapis.com/csm-artifacts/asm/asmcli > asmcli將工具設為可執行:
chmod +x asmcli
設定每個叢集
請按照下列步驟,為網格中的每個叢集設定受管理 Cloud Service Mesh。
套用受管理控制層
套用受管理控制層之前,請務必選取發布管道。代管 Cloud Service Mesh 佈建時,Cloud Service Mesh 管道會由 GKE 叢集管道決定。請注意,系統不支援在同一叢集同時使用多個管道。
針對要使用受管理 Cloud Service Mesh 的每個叢集,執行安裝工具。 建議您同時提供下列兩種選項:
--enable-registration --fleet_id FLEET_PROJECT_ID這兩個旗標會將叢集註冊至機群,其中 FLEET_ID 是機群主機專案的專案 ID。如果使用單一專案,FLEET_PROJECT_ID與 PROJECT_ID 相同,也就是機群主機專案和叢集專案相同。如果是多專案等較複雜的設定,建議使用獨立的機群主機專案。--enable-all。這個旗標會啟用必要元件和註冊功能。
asmcli 工具會使用 CLI 工具內的工具和邏輯,直接設定受管理控制層。請根據偏好的 CA,按照下列說明操作。
憑證授權
選取要用於網格的憑證授權單位。
網狀 CA
執行下列指令,安裝具有預設功能和 Mesh CA 的控制層。在提供的預留位置中輸入值。
./asmcli install \
-p PROJECT_ID \
-l LOCATION \
-n CLUSTER_NAME \
--fleet_id FLEET_PROJECT_ID \
--managed \
--verbose \
--output_dir DIR_PATH \
--enable-all
CA 服務
- 按照「設定憑證授權單位服務」中的步驟操作。
- 執行下列指令,安裝具有預設功能和 憑證授權單位服務 的控制層。在提供的預留位置中輸入值。
./asmcli install \
-p PROJECT_ID \
-l LOCATION \
-n CLUSTER_NAME \
--fleet_id FLEET_PROJECT_ID \
--managed \
--verbose \
--output_dir DIR_PATH \
--enable-all \
--ca gcp_cas \
--ca_pool pool_name
這項工具會下載所有檔案,以便在指定的 --output_dir 中設定受管理控制層、安裝 istioctl 工具和範例應用程式。本指南中的步驟假設您從執行 asmcli install 時指定的 --output_dir 位置執行 istioctl,且 istioctl 位於其 <Istio release dir>/bin 子目錄中。
如果對同一個叢集重新執行 asmcli,系統會覆寫現有的控制層設定。如要使用相同的設定,請務必指定相同的選項和標記。
確認控制層已佈建
幾分鐘後,請確認控制層狀態為 ACTIVE:
gcloud container fleet mesh describe --project FLEET_PROJECT_ID
輸出內容大致如下:
membershipStates:
projects/746296320118/locations/us-central1/memberships/demo-cluster-1:
servicemesh:
controlPlaneManagement:
details:
- code: REVISION_READY
details: 'Ready: asm-managed'
state: ACTIVE
...
state:
code: OK
description: 'Revision(s) ready for use: asm-managed.'
如果狀態在幾分鐘內未達到 ACTIVE`,請參閱「檢查受管理控制層狀態」,進一步瞭解可能發生的錯誤。
零接觸升級
安裝受管理控制層後,Google 會在有新版本或修補程式時自動升級。
代管資料層
如果您使用代管 Cloud Service Mesh,Google 會全面管理 Proxy 升級作業。
啟用代管資料層功能後,系統會與代管控制層一併主動自動更新 Sidecar Proxy 和注入的閘道,方法是重新啟動工作負載,重新注入新版 Proxy。這項作業會在控制層升級後開始,通常會在開始後 2 週內完成。
如果停用,系統會被動管理 Proxy,也就是根據叢集中 Pod 的自然生命週期進行管理,且使用者必須手動觸發,才能控制更新頻率。
受管理資料層會逐一移除執行舊版 Proxy 的 Pod,藉此升級 Proxy。系統會逐步執行驅逐作業,遵守 Pod 中斷預算,並控制變更率。
詳情請參閱「受管理資料層」。
設定端點探索 (僅適用於多叢集安裝)
如果網格只有一個叢集,請略過這些多叢集步驟,直接前往「部署應用程式」或「遷移應用程式」。
繼續操作前,請確認每個叢集都已設定 Cloud Service Mesh。
公開叢集
設定公有叢集之間的端點探索
如果您在公開叢集 (非私人叢集) 上運作,可以設定公開叢集之間的端點探索,或更簡單地啟用公開叢集之間的端點探索。
私人叢集
設定私人叢集之間的端點探索
使用 GKE 私人叢集時,請將叢集控制層端點設定為公開端點,而非私人端點。請參閱「在私人叢集之間設定端點探索」。
如需包含兩個叢集的範例應用程式,請參閱「HelloWorld 服務範例」。
部署應用程式
啟用命名空間以進行插入作業。實際步驟取決於控制層實作方式。
代管 (TD)
- 將預設插入標籤套用至命名空間:
kubectl label namespace NAMESPACE \
istio.io/rev- istio-injection=enabled --overwrite
受管理 (Istiod)
建議:執行下列指令,將預設插入標籤套用至命名空間:
kubectl label namespace NAMESPACE \
istio.io/rev- istio-injection=enabled --overwrite
如果您是使用受管理 Istiod 控制層的現有使用者: 建議使用預設注入功能,但系統也支援以修訂版本為準的注入功能。請按照下列指示操作:
執行下列指令,找出可用的發布管道:
kubectl -n istio-system get controlplanerevision輸出結果會與下列內容相似:
NAME AGE asm-managed-rapid 6d7h注意:如果上述清單中出現兩個控制層修訂版本,請移除其中一個。叢集不支援多個控制層通道。
在輸出內容中,「
NAME」欄下方的值是與 Cloud Service Mesh 版本可用發布管道對應的修訂版本標籤。將修訂版本標籤套用至命名空間:
kubectl label namespace NAMESPACE \ istio-injection- istio.io/rev=REVISION_LABEL --overwrite
使用下列指令,確認命名空間標籤是否已正確套用。
kubectl get namespace -L istio-injection
輸出內容範例:
NAME STATUS AGE ISTIO-INJECTION
default Active 5m9s enabled
到目前為止,您已成功設定代管 Cloud Service Mesh。如果標籤命名空間中有任何現有工作負載,請重新啟動這些工作負載,以便插入 Proxy。
如果您在多叢集設定中部署應用程式,請在所有叢集中複製 Kubernetes 和控制層設定,除非您打算將特定設定限制在部分叢集。套用至特定叢集的設定,就是該叢集的可靠資料來源。
自訂插入內容 (選用)
您可以覆寫預設值並自訂插入設定,但這可能會導致無法預測的設定錯誤,並造成附屬容器發生問題。自訂注入程序前,請先閱讀範例後方的資訊,瞭解特定設定和建議的注意事項。
您可以透過每個 Pod 的設定,覆寫個別 Pod 的這些選項。
方法是在 Pod 中新增 istio-proxy 容器。Sidecar 注入程序會將這裡定義的任何設定,視為預設注入範本的覆寫項目。
舉例來說,下列設定會自訂多項設定,包括降低 CPU 要求、新增磁碟區掛接,以及新增 preStop 勾點:
apiVersion: v1
kind: Pod
metadata:
name: example
spec:
containers:
- name: hello
image: alpine
- name: istio-proxy
image: auto
resources:
requests:
cpu: "200m"
memory: "256Mi"
limits:
cpu: "200m"
memory: "256Mi"
volumeMounts:
- mountPath: /etc/certs
name: certs
lifecycle:
preStop:
exec:
command: ["sleep", "10"]
volumes:
- name: certs
secret:
secretName: istio-certs
一般來說,Pod 中的任何欄位都可以設定。不過,請務必注意特定欄位:
- Kubernetes 要求在執行插入作業前設定
image欄位。 雖然您可以設定特定圖片來覆寫預設圖片,但建議您將image設為auto,讓邊車容器加入器自動選取要使用的圖片。 containers中的部分欄位取決於相關設定。舉例來說,必須小於或等於 CPU 限制。如果這兩個欄位未正確設定,Pod 可能無法啟動。- Kubernetes 可讓您為 Pod
spec中的資源設定requests和limits。GKE Autopilot 只會考量requests。詳情請參閱「在 Autopilot 中設定資源限制」。
此外,您也可以透過 Pod 上的註解設定特定欄位,但建議使用上述方法自訂設定。請特別留意下列註解:
- 如果是 GKE Standard,請務必明確設定
sidecar.istio.io/proxyCPULimit,sidecar.istio.io/proxyCPU否則,系統會將 Sidecar 的 CPU 限制設為無限制。 - 如果是 GKE Standard,且已設定
sidecar.istio.io/proxyMemory,請務必明確設定sidecar.istio.io/proxyMemoryLimit。否則,系統會將 Sidecar 的記憶體限制設為無限制。 - 如果是 GKE Autopilot,使用註解設定資源
requests和limits可能會過度佈建資源。請使用圖片範本方法,請參閱「Autopilot 中的資源修改範例」。
舉例來說,請參閱下列資源註解:
spec:
template:
metadata:
annotations:
sidecar.istio.io/proxyCPU: "200m"
sidecar.istio.io/proxyCPULimit: "200m"
sidecar.istio.io/proxyMemory: "256Mi"
sidecar.istio.io/proxyMemoryLimit: "256Mi"
驗證控制層指標
您可以在 Metrics Explorer 中查看控制層和資料層的版本。
如要確認設定是否正常運作,請按照下列步驟操作:
在 Google Cloud 控制台中,查看控制層指標:
選擇工作區,然後使用下列參數新增自訂查詢:
- 資源類型:Kubernetes 容器
- 指標:Proxy 用戶端
- 篩選條件:
container_name="cr-REVISION_LABEL" - 依據分組:
revision標籤和proxy_version標籤 - 匯總器:sum
- 週期:1 分鐘
如果同時使用 Google 代管和叢內控制層執行 Cloud Service Mesh,您可以根據容器名稱區分指標。舉例來說,受管理指標會顯示
container_name="cr-asm-managed",未受管理指標則會顯示container_name="discovery"。如要同時顯示兩者的指標,請移除「篩選器」container_name="cr-asm-managed"。在 Metrics Explorer 中檢查下列欄位,確認控制層版本和 Proxy 版本:
- 「修訂版本」欄位會顯示控制層版本。
- proxy_version 欄位會指出
proxy_version。 - 「值」欄位會顯示連線的 Proxy 數量。
如要瞭解目前管道對應的 Cloud Service Mesh 版本,請參閱「各管道的 Cloud Service Mesh 版本」。
將應用程式遷移至代管 Cloud Service Mesh
為遷移作業做好準備
如要準備將應用程式從叢內 Cloud Service Mesh 遷移至代管型 Cloud Service Mesh,請完成下列步驟:
按照「套用 Google 管理的控制層」一節的說明執行工具。
(選用) 如要使用 Google 管理的資料層,請啟用資料層管理:
kubectl annotate --overwrite controlplanerevision REVISION_TAG \ mesh.cloud.google.com/proxy='{"managed":"true"}'
遷移應用程式
如要將應用程式從叢內 Cloud Service Mesh 遷移至代管 Cloud Service Mesh,請按照下列步驟操作:
- 取代目前的命名空間標籤。實際步驟取決於控制層實作方式。
代管 (TD)
- 將預設插入標籤套用至命名空間:
kubectl label namespace NAMESPACE \
istio.io/rev- istio-injection=enabled --overwrite
受管理 (Istiod)
建議:執行下列指令,將預設插入標籤套用至命名空間:
kubectl label namespace NAMESPACE \
istio.io/rev- istio-injection=enabled --overwrite
如果您是使用受管理 Istiod 控制層的現有使用者: 建議使用預設注入功能,但系統也支援以修訂版本為準的注入功能。請按照下列指示操作:
執行下列指令,找出可用的發布管道:
kubectl -n istio-system get controlplanerevision輸出結果會與下列內容相似:
NAME AGE asm-managed-rapid 6d7h注意:如果上述清單中出現兩個控制層修訂版本,請移除其中一個。叢集不支援多個控制層通道。
在輸出內容中,「
NAME」欄下方的值是與 Cloud Service Mesh 版本可用發布管道對應的修訂版本標籤。將修訂版本標籤套用至命名空間:
kubectl label namespace NAMESPACE \ istio-injection- istio.io/rev=REVISION_LABEL --overwrite
在命名空間中執行 Deployment 的滾動升級:
kubectl rollout restart deployment -n NAMESPACE測試應用程式,確認工作負載是否正常運作。
如果其他命名空間也有工作負載,請針對每個命名空間重複執行上述步驟。
如果您在多叢集設定中部署應用程式,請在所有叢集中複製 Kubernetes 和 Istio 設定,除非您只想將該設定限制在部分叢集。套用至特定叢集的設定,就是該叢集的可靠資料來源。
確認應用程式運作正常後,您可以將所有命名空間切換至受管理控制平面,然後移除叢內 istiod,也可以保留做為備份。istiod 會自動縮減規模,減少資源用量。如要移除,請跳至「刪除舊版控制層」。
如果遇到問題,可以參考「解決受管理控制層問題」一文中的資訊找出並解決問題,必要時則可復原至先前版本。
刪除舊控制層
安裝並確認所有命名空間都使用 Google 管理的控制層後,即可刪除舊的控制層。
kubectl delete Service,Deployment,HorizontalPodAutoscaler,PodDisruptionBudget istiod -n istio-system --ignore-not-found=true
如果您使用 istioctl kube-inject 而非自動插入,或是安裝了其他閘道,請檢查控制層的指標,並確認連線端點數量為零。
復原
如要還原至先前的控制平面版本,請按照下列步驟操作:
更新工作負載,以便注入舊版控制層。在下列指令中,修訂版本值
asm-191-1僅做為範例。將範例值替換為先前控制層的修訂版本標籤。kubectl label namespace NAMESPACE istio-injection- istio.io/rev=asm-191-1 --overwrite重新啟動 Pod,觸發重新注入程序,讓 Proxy 採用先前版本:
kubectl rollout restart deployment -n NAMESPACE
如果沒有使用,受管理控制層會自動縮減至零,不會使用任何資源。變動 Webhook 和佈建作業會保留,且不會影響叢集行為。
閘道現在已設為 asm-managed 修訂版本。如要復原,請重新執行 Cloud Service Mesh 安裝指令,系統會重新部署閘道,並將其指向叢集內控制層:
kubectl -n istio-system rollout undo deploy istio-ingressgateway
成功時的預期輸出內容:
deployment.apps/istio-ingressgateway rolled back
解除安裝
如果沒有任何命名空間使用代管控制層,系統會自動將其縮放至零。如需詳細步驟,請參閱「解除安裝 Cloud Service Mesh」。
疑難排解
如要找出並解決使用受管理控制層時的問題,請參閱「解決受管理控制層問題」。
後續步驟
- 瞭解發布版本。
- 從
IstioOperator遷移。 - 將閘道遷移至代管控制層。
- 瞭解如何啟用選用的受管理 Cloud Service Mesh 功能,例如: