納入 Kubernetes 工作負載

本頁面說明如何透過 Cloud Service Mesh 導入 Kubernetes 工作負載。

部署 Kubernetes 服務

如要透過 Cloud Service Mesh 將 Kubernetes 服務部署至叢集,您必須執行下列操作:

  • 為所有容器建立 Kubernetes 服務。所有部署都應附加 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 的服務後,請務必插入附屬 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;
    

    如果您是現有的 Managed 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
    

    如果您是現有的 Managed 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

透過自動附加元件插入功能,您可以透過 Pod 重新啟動來更新現有 Pod 的附加元件:

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

  1. 如果您使用了 Deployment,請重新啟動 Deployment,這樣便可重新啟動所有具有附屬程式的 Pod:

    kubectl rollout restart deployment -n NAMESPACE

    如果您未使用部署作業,請刪除 Pod,系統會自動使用 sidecar 重新建立 Pod:

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

    kubectl get pod -n NAMESPACE

    在以下先前指令的範例輸出內容中,請注意 READY 欄表示每個工作負載都有兩個容器:主要容器和附屬 Proxy 的容器。

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