使用 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 版的叢集。如果穩定性足夠,就會升級至 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、記憶體: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 專案做為機群主機專案。詳情請參閱「透過 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 是叢集專案的唯一識別碼。執行下列指令來取得 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,使用下列一組操作說明。
憑證授權
選取要用於網格的憑證授權單位。
Mesh 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 hook:
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,讓 Sidecar 注入器自動選取要使用的映像檔。 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 版本:
- revision 欄位會指出控制層版本。
- proxy_version 欄位會指出
proxy_version。 - value 欄位會指出連線的 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
對命名空間中的部署執行滾動升級:
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 功能,例如: