導入 Kubernetes 工作負載

本頁說明如何使用 Cloud Service Mesh 導入 Kubernetes 工作負載。

部署 Kubernetes 服務

如要將 Kubernetes 服務部署至採用 Cloud Service Mesh 的叢集,請務必執行下列操作:

  • 為所有容器建立 Kubernetes 服務。所有「Deployment」都應附加 Kubernetes 服務。

  • 為服務通訊埠命名。雖然 GKE 允許您定義未命名的服務通訊埠,但 Cloud Service Mesh 要求您為通訊埠提供名稱,且該名稱必須與通訊埠的通訊協定相符。

  • 為部署作業加上標籤。您可以使用 Cloud Service Mesh 流量管理功能,例如在同一服務的不同版本之間分配流量。

以下部署和服務範例說明這些需求:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: helloserver
spec:
  replicas: 1
  selector:
    matchLabels:
      app: helloserver
  template:
    metadata:
      labels:
        app: helloserver
    spec:
      containers:
      - image: gcr.io/google-samples/istio/helloserver:v0.0.1
        imagePullPolicy: Always
        name: main
      restartPolicy: Always
      terminationGracePeriodSeconds: 5
apiVersion: v1
kind: Service
metadata:
  name: hellosvc
spec:
  ports:
  - name: http
    port: 80
    targetPort: 8080
  selector:
    app: helloserver
  type: LoadBalancer

在叢集上部署服務並啟用 Cloud Service Mesh 後,請務必插入 Sidecar Proxy

範例:部署 Online Boutique 範例

anthos-service-mesh-packages 存放區中的 Online Boutique 範例應用程式,是根據 microservices-demo 存放區中的原始資訊清單集修改而來。根據最佳做法,每個服務都會部署在獨立的命名空間中,並使用專屬的服務帳戶。

  1. 為應用程式建立命名空間:

    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
    
  2. 啟用要注入的命名空間。步驟取決於控制層實作

    代管 (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 控制平面的現有使用者: 建議您使用預設注入,但系統也支援以修訂版本為準的注入。請按照下列指示操作:

    1. 執行下列指令,找出可用的發布管道:

      kubectl -n istio-system get controlplanerevision
      

      輸出結果會與下列內容相似:

      NAME                AGE
      asm-managed-rapid   6d7h
      

      在輸出內容中,「NAME」欄下方的值是與 Cloud Service Mesh 版本可用發布管道對應的修訂版本標籤。

    2. 將修訂版本標籤套用至命名空間:

      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;
    

    建議您使用預設插入方式,但系統也支援以修訂版本為準的插入方式: 請按照下列操作說明進行:

    1. 使用下列指令在 istiod 上找出修訂版本標籤:

      kubectl get deploy -n istio-system -l app=istiod -o \
         jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'
      
    2. 將修訂版本標籤套用至命名空間。在下列指令中,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;
      
  3. 將範例應用程式部署至叢集。

    1. 建立服務帳戶和部署作業:

      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
      
    2. 建立服務:

      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
      
    3. 建立服務項目:

      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 控制台中顯示指標,服務通訊埠必須以下列其中一種通訊協定命名:httphttp2grpc。以 https 通訊協定命名的服務通訊埠會視為 tcp,且系統不會顯示這些服務的指標。

插入補充 Proxy

本節說明如何使用 Cloud Service Mesh 設定邊車模式 Proxy 插入功能,提升網路安全性、可靠性和可觀測性。這些功能會從應用程式的主要容器中移除,並且會在相同的 Pod 中以各自獨立的容器,透過程序以外的共用 Proxy (補充資訊) 執行。您可以使用 Cloud Service Mesh 的功能,不必重新設計生產環境應用程式,即可加入服務網格。

當 Cloud Service Mesh 偵測到您為工作負載的 Pod 設定的命名空間標籤時,就會自動注入補充資訊 Proxy (自動注入)。Proxy 會攔截工作負載的所有傳入和傳出流量,並與 Cloud Service Mesh 通訊。

啟用自動補充植入功能

  1. 啟用要用於注入的命名空間。步驟取決於控制層實作

    代管 (TD)

    1. 將預設插入標籤套用至命名空間:
    kubectl label namespace NAMESPACE
        istio.io/rev- istio-injection=enabled --overwrite
    

    受管理 (Istiod)

    建議:執行下列指令,將預設插入標籤套用至命名空間:

      kubectl label namespace NAMESPACE \
          istio.io/rev- istio-injection=enabled --overwrite
    

    如果您是使用受管理 Istiod 控制平面的現有使用者: 建議您使用預設注入,但系統也支援以修訂版本為準的注入。請按照下列指示操作:

    1. 執行下列指令,找出可用的發布管道:

      kubectl -n istio-system get controlplanerevision
      

      輸出結果會與下列內容相似:

      NAME                AGE
      asm-managed-rapid   6d7h
      

      注意:如果上述清單中出現兩個控制層修訂版本,請移除其中一個。叢集不支援多個控制層通道。

      在輸出內容中,「NAME」欄下方的值是與 Cloud Service Mesh 版本可用發布管道對應的修訂版本標籤。

    2. 將修訂版本標籤套用至命名空間:

      kubectl label namespace NAMESPACE \
          istio-injection- istio.io/rev=REVISION_LABEL --overwrite
      

    叢集內

    建議:執行下列指令,將預設插入標籤套用至命名空間:

      kubectl label namespace NAMESPACE \
          istio.io/rev- istio-injection=enabled --overwrite
    

    建議您使用預設插入方式,但系統也支援以修訂版本為準的插入方式: 請按照下列操作說明進行:

    1. 使用下列指令在 istiod 上找出修訂版本標籤:

      kubectl get deploy -n istio-system -l app=istiod -o \
         jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'
      
    2. 將修訂版本標籤套用至命名空間。在下列指令中,REVISION_LABEL 是您在上一步記下的 istiod 修訂版本標籤值。

      kubectl label namespace NAMESPACE \
          istio-injection- istio.io/rev=REVISION_LABEL --overwrite
      
  2. 按照下一節的步驟,重新啟動受影響的 Pod。

  3. 請為 demo 命名空間新增下列註解:

    kubectl annotate --overwrite namespace NAMESPACE \
    mesh.cloud.google.com/proxy='{"managed":"true"}'
    

重新啟動 Pod,更新補充 Proxy

使用自動 Sidecar 插入功能時,您可以重新啟動 Pod,更新現有 Pod 的 Sidecar:

Pod 的重新啟動方式取決於 Pod 是否是部署的一部分。

  1. 如果您使用 Deployment,請重新啟動 Deployment,這會重新啟動所有含有 Sidecar 的 Pod:

    kubectl rollout restart deployment -n NAMESPACE

    如果未使用 Deployment,請刪除 Pod,系統會自動重新建立 Pod 並加入 Sidecar:

    kubectl delete pod -n NAMESPACE --all
  2. 確認命名空間中的所有 Pod 都已注入 Sidecar:

    kubectl get pod -n NAMESPACE

    在先前指令的下列範例輸出內容中,請注意 READY 欄表示每個工作負載都有兩個容器:主要容器和 Sidecar 代理程式的容器。

    NAME                    READY   STATUS    RESTARTS   AGE
    WORKLOAD           2/2     Running   0          20s
    ...