導入 Kubernetes 工作負載
本頁說明如何使用 Cloud Service Mesh 導入 Kubernetes 工作負載。
部署 Kubernetes 服務
如要將 Kubernetes 服務部署至採用 Cloud Service Mesh 的叢集,請務必執行下列操作:
- 為所有容器建立 Kubernetes 服務。所有「Deployment」都應附加 Kubernetes 服務。 
- 為服務通訊埠命名。雖然 GKE 允許您定義未命名的服務通訊埠,但 Cloud Service Mesh 要求您為通訊埠提供名稱,且該名稱必須與通訊埠的通訊協定相符。 
- 為部署作業加上標籤。您可以使用 Cloud Service Mesh 流量管理功能,例如在同一服務的不同版本之間分配流量。 
以下部署和服務範例說明這些需求:
在叢集上部署服務並啟用 Cloud Service Mesh 後,請務必插入 Sidecar Proxy。
範例:部署 Online Boutique 範例
anthos-service-mesh-packages 存放區中的 Online Boutique 範例應用程式,是根據 microservices-demo 存放區中的原始資訊清單集修改而來。根據最佳做法,每個服務都會部署在獨立的命名空間中,並使用專屬的服務帳戶。
- 為應用程式建立命名空間: - kubectl apply -f \ DIR_PATH/samples/online-boutique/kubernetes-manifests/namespaces- 預期輸出內容: - namespace/ad created namespace/cart created namespace/checkout created namespace/currency created namespace/email created namespace/frontend created namespace/loadgenerator created namespace/payment created namespace/product-catalog created namespace/recommendation created namespace/shipping created
- 啟用要注入的命名空間。步驟取決於控制層實作。 - 代管 (TD)- 將預設插入標籤套用至命名空間: - for ns in ad cart checkout currency email frontend loadgenerator payment product-catalog recommendation shipping; do kubectl label namespace $ns \ istio.io/rev- istio-injection=enabled --overwrite done;- 受管理 (Istiod)- 建議:執行下列指令,將預設插入標籤套用至命名空間: - for ns in ad cart checkout currency email frontend loadgenerator payment product-catalog recommendation shipping; do kubectl label namespace $ns \ istio.io/rev- istio-injection=enabled --overwrite done;- 如果您是使用受管理 Istiod 控制平面的現有使用者: 建議您使用預設注入,但系統也支援以修訂版本為準的注入。請按照下列指示操作: - 執行下列指令,找出可用的發布管道: - kubectl -n istio-system get controlplanerevision- 輸出結果會與下列內容相似: - NAME AGE asm-managed-rapid 6d7h- 在輸出內容中,「 - NAME」欄下方的值是與 Cloud Service Mesh 版本可用發布管道對應的修訂版本標籤。
- 將修訂版本標籤套用至命名空間: - for ns in ad cart checkout currency email frontend loadgenerator payment product-catalog recommendation shipping; do kubectl label namespace $ns \ istio-injection- istio.io/rev=REVISION_LABEL --overwrite done;
 - 叢集內- 建議:執行下列指令,將預設插入標籤套用至命名空間: - for ns in ad cart checkout currency email frontend loadgenerator payment product-catalog recommendation shipping; do kubectl label namespace $ns \ istio.io/rev- istio-injection=enabled --overwrite done;- 建議您使用預設插入方式,但系統也支援以修訂版本為準的插入方式: 請按照下列操作說明進行: - 使用下列指令在 - istiod上找出修訂版本標籤:- kubectl get deploy -n istio-system -l app=istiod -o \ jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'
- 將修訂版本標籤套用至命名空間。在下列指令中, - REVISION_LABEL是您在上一步記下的- istiod修訂版本標籤值。- for ns in ad cart checkout currency email frontend loadgenerator payment product-catalog recommendation shipping; do kubectl label namespace $ns \ istio-injection- istio.io/rev=REVISION_LABEL --overwrite done;
 
- 將範例應用程式部署至叢集。 - 建立服務帳戶和部署作業: - kubectl apply -f \ DIR_PATH/samples/online-boutique/kubernetes-manifests/deployments- 預期輸出內容: - serviceaccount/ad created deployment.apps/adservice created serviceaccount/cart created deployment.apps/cartservice created serviceaccount/checkout created deployment.apps/checkoutservice created serviceaccount/currency created deployment.apps/currencyservice created serviceaccount/email created deployment.apps/emailservice created serviceaccount/frontend created deployment.apps/frontend created serviceaccount/loadgenerator created deployment.apps/loadgenerator created serviceaccount/payment created deployment.apps/paymentservice created serviceaccount/product-catalog created deployment.apps/productcatalogservice created serviceaccount/recommendation created deployment.apps/recommendationservice created serviceaccount/shipping created deployment.apps/shippingservice created
- 建立服務: - kubectl apply -f \ DIR_PATH/samples/online-boutique/kubernetes-manifests/services- 預期輸出內容: - service/adservice created service/cartservice created service/checkoutservice created service/currencyservice created service/emailservice created service/frontend created service/frontend-external created service/paymentservice created service/productcatalogservice created service/recommendationservice created service/shippingservice created
- 建立服務項目: - kubectl apply -f \ DIR_PATH/samples/online-boutique/istio-manifests/allow-egress-googleapis.yaml- 預期輸出內容: - serviceentry.networking.istio.io/allow-egress-googleapis created serviceentry.networking.istio.io/allow-egress-google-metadata created
 
為服務通訊埠命名
如要納入 Cloud Service Mesh,服務通訊埠必須命名,且名稱必須包含通訊埠的通訊協定,例如:
apiVersion: v1
kind: Service
metadata:
  name: ratings
  labels:
    app: ratings
    service: ratings
spec:
  ports:
  - port: 9080
    name: http服務通訊埠名稱可包含以下語法的後置字元:
name: protocol[-suffix]
方括號表示選用後置字元,開頭必須是連字號,例如:
kind: Service
metadata:
  name: myservice
spec:
  ports:
  - number: 3306
    name: mysql
  - number: 80
    name: http-web如要在 Google Cloud 控制台中顯示指標,服務通訊埠必須以下列其中一種通訊協定命名:http、http2 或 grpc。以 https 通訊協定命名的服務通訊埠會視為 tcp,且系統不會顯示這些服務的指標。
插入補充 Proxy
本節說明如何使用 Cloud Service Mesh 設定邊車模式 Proxy 插入功能,提升網路安全性、可靠性和可觀測性。這些功能會從應用程式的主要容器中移除,並且會在相同的 Pod 中以各自獨立的容器,透過程序以外的共用 Proxy (補充資訊) 執行。您可以使用 Cloud Service Mesh 的功能,不必重新設計生產環境應用程式,即可加入服務網格。
當 Cloud Service Mesh 偵測到您為工作負載的 Pod 設定的命名空間標籤時,就會自動注入補充資訊 Proxy (自動注入)。Proxy 會攔截工作負載的所有傳入和傳出流量,並與 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 label namespace NAMESPACE \ istio.io/rev- istio-injection=enabled --overwrite- 建議您使用預設插入方式,但系統也支援以修訂版本為準的插入方式: 請按照下列操作說明進行: - 使用下列指令在 - istiod上找出修訂版本標籤:- kubectl get deploy -n istio-system -l app=istiod -o \ jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'
- 將修訂版本標籤套用至命名空間。在下列指令中, - REVISION_LABEL是您在上一步記下的- istiod修訂版本標籤值。- kubectl label namespace NAMESPACE \ istio-injection- istio.io/rev=REVISION_LABEL --overwrite
 
- 按照下一節的步驟,重新啟動受影響的 Pod。 
- 請為 - demo命名空間新增下列註解:- kubectl annotate --overwrite namespace NAMESPACE \ mesh.cloud.google.com/proxy='{"managed":"true"}'
重新啟動 Pod,更新補充 Proxy
使用自動 Sidecar 插入功能時,您可以重新啟動 Pod,更新現有 Pod 的 Sidecar:
Pod 的重新啟動方式取決於 Pod 是否是部署的一部分。
- 如果您使用 Deployment,請重新啟動 Deployment,這會重新啟動所有含有 Sidecar 的 Pod: - kubectl rollout restart deployment -n NAMESPACE - 如果未使用 Deployment,請刪除 Pod,系統會自動重新建立 Pod 並加入 Sidecar: - kubectl delete pod -n NAMESPACE --all 
- 確認命名空間中的所有 Pod 都已注入 Sidecar: - kubectl get pod -n NAMESPACE - 在先前指令的下列範例輸出內容中,請注意 - READY欄表示每個工作負載都有兩個容器:主要容器和 Sidecar 代理程式的容器。- NAME READY STATUS RESTARTS AGE WORKLOAD 2/2 Running 0 20s ...