納入 Kubernetes 工作負載
本頁面說明如何透過 Cloud Service Mesh 導入 Kubernetes 工作負載。
部署 Kubernetes 服務
如要透過 Cloud Service Mesh 將 Kubernetes 服務部署至叢集,您必須執行下列操作:
為所有容器建立 Kubernetes 服務。所有部署都應附加 Kubernetes 服務。
為服務通訊埠命名。雖然 GKE 可讓您定義未命名的服務通訊埠,但 Cloud Service Mesh 要求您提供通訊埠名稱,且該名稱必須與通訊埠的通訊協定相符。
為部署作業加上標籤。這樣一來,您就能使用 Cloud Service Mesh 流量管理功能,例如在同一個服務的不同版本之間拆分流量。
以下是部署和服務範例,說明這些需求:
在叢集上部署含有 Cloud Service Mesh 的服務後,請務必插入附屬 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;
如果您是現有的 Managed 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
如果您是現有的 Managed 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
透過自動附加元件插入功能,您可以透過 Pod 重新啟動來更新現有 Pod 的附加元件:
重新啟動 Pod 的方式取決於 Pod 是否是部署的一部分。
如果您使用了 Deployment,請重新啟動 Deployment,這樣便可重新啟動所有具有附屬程式的 Pod:
kubectl rollout restart deployment -n NAMESPACE
如果您未使用部署作業,請刪除 Pod,系統會自動使用 sidecar 重新建立 Pod:
kubectl delete pod -n NAMESPACE --all
請確認命名空間中的所有 Pod 都已注入 sidecar:
kubectl get pod -n NAMESPACE
在以下先前指令的範例輸出內容中,請注意
READY
欄表示每個工作負載都有兩個容器:主要容器和附屬 Proxy 的容器。NAME READY STATUS RESTARTS AGE WORKLOAD 2/2 Running 0 20s ...