導入 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 ...