全部產品
Search
文件中心

Alibaba Cloud Service Mesh:佈建服務發現範圍提升網格配置的推送效率

更新時間:Jan 13, 2025

當遇到配置更新推送耗時較長、控制平面負載過高、資源配置不夠精確等問題時,您可以佈建服務發現範圍來提升控制平面向資料平面Sidecar代理的推送效率。通過限定ASM控制平面僅處理和發現指定命名空間下的應用,可以有效減少無效通訊,加速配置同步進程,確保Service Mesh的穩定運行並提升營運管理效率。

前提條件

背景資訊

說明

本文的Sidecar代理配置或Sidecar配置均指Sidecar代理從控制平面接收到的網格配置資訊。

預設情況下,資料平面的Sidecar代理中儲存資料平面叢集中任意命名空間內所有服務的相關資訊(即使該命名空間內的工作負載並未注入Sidecar代理),同時,控制平面也會監視網格中來自所有命名空間內的服務,任何與服務相關的變更都會引起控制平面向所有Sidecar代理推送相關配置。

您可以使用服務發現範圍配置功能,根據資料平面叢集內命名空間的標籤來制定若干標籤選取器。標籤選取器保證ASM控制平面只需要發現和處理指定命名空間下的應用服務。Sidecar代理配置內將僅保留被選中命名空間內的服務資訊,未被選中的命名空間內的服務發生改變,將不會引起Sidecar代理的配置推送。

服務發現範圍配置功能的標籤選取器支援以下兩種規則:

  • 標籤精確匹配規則:您需要指定一個標籤名和一個標籤值,只有命名空間上的標籤完全符合給定的標籤名和標籤值才能夠匹配成功。

  • 標籤運算式匹配規則:您可以指定一個標籤名、一個運算式操作符、以及一系欄標籤值來匹配資料平面中的命名空間標籤,操作符含義如下:

    • In:資料一般命名空間的標籤必須包含給定標籤名的標籤,且其標籤值必須位於給定的一系欄標籤值中。

    • NotIn:資料一般命名空間的標籤必須包含給定標籤名的標籤,且其標籤值必須不在給定的一系欄標籤值中。

    • Exists:資料一般命名空間的標籤必須包含給定標籤名的標籤,在操作符為Exists時,無需給出任何標籤值。

    • DoesNotExist:資料一般命名空間的標籤必須不能包含給定標籤名的標籤,在操作符為DoesNotExist時,無需給出任何標籤值。

步驟一:在ASM中建立兩個命名空間

  1. 建立ns-in-mesh和ns-not-in-mesh兩個命名空間。具體操作,請參見建立命名空間

  2. 為ns-in-mesh命名空間啟用Sidecar網格代理自動注入。具體操作,請參見啟用自動注入

步驟二:在ACK叢集中部署樣本應用

  1. 執行以下命令,在ACK叢集中為ns-in-mesh命名空間添加asm-discovery=enabled標籤。

    kubectl label namespace ns-in-mesh asm-discovery=enabled
  2. 使用以下內容,建立httpbin.yaml檔案。

    展開查看httpbin.yaml

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: httpbin
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: httpbin
      labels:
        app: httpbin
        service: httpbin
    spec:
      ports:
      - name: http
        port: 8000
        targetPort: 80
      selector:
        app: httpbin
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: httpbin
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: httpbin
          version: v1
      template:
        metadata:
          labels:
            app: httpbin
            version: v1
        spec:
          serviceAccountName: httpbin
          containers:
          - image: docker.io/kennethreitz/httpbin
            imagePullPolicy: IfNotPresent
            name: httpbin
            ports:
            - containerPort: 80
  3. 執行以下命令,分別在ns-in-mesh和ns-not-in-mesh命名空間中建立httpbin樣本應用。

    kubectl apply -f httpbin.yaml -n ns-in-mesh
    kubectl apply -f httpbin.yaml -n ns-not-in-mesh

步驟三:查看Sidecar代理配置的推送狀態

  1. 查看Sidecar代理配置。

    1. 執行以下命令,擷取ns-in-mesh命名空間下httpbin Pod名稱。

      kubectl get pods -n ns-in-mesh

      預期輸出:

      NAME                       READY   STATUS    RESTARTS   AGE
      httpbin-6fcb98998c-46qhr   2/2     Running   0          22m
    2. 執行以下命令,匯出Sidecar代理配置。

      命令中httpbin-6fcb98998c-46qhr請替換為上一步擷取的httpbin Pod名稱。

      kubectl exec -it httpbin-6fcb98998c-46qhr -c istio-proxy -n ns-in-mesh -- curl -s localhost:15000/config_dump > config_dump.json
    3. 開啟下載到本地的config_dump.json檔案,搜尋httpbin.ns-not-in-mesh

      可以搜尋到httpbin.ns-not-in-mesh,說明即使ns-not-in-mesh命名空間沒有啟用Sidecar網格代理自動注入,Sidecar代理配置資訊中仍然儲存著ns-not-in-mesh命名空間中的服務資訊。

  2. 查看控制平面日誌。

    1. 啟用控制平面日誌採集。

    2. 在ACK叢集的ns-not-in-mesh命名空間中部署sleep應用。

      1. 使用以下內容,建立sleep.yaml檔案。

        展開查看sleep.yaml

        ##################################################################################################
        # Sleep service
        ##################################################################################################
        apiVersion: v1
        kind: Service
        metadata:
          name: sleep
          labels:
            app: sleep
        spec:
          ports:
          - port: 80
            name: http
          selector:
            app: sleep
        ---
        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: sleep
        spec:
          replicas: 1
          selector:
            matchLabels:
              app: sleep
          template:
            metadata:
              labels:
                app: sleep
            spec:
              containers:
              - name: sleep
                image: pstauffer/curl
                command: ["/bin/sleep", "3650d"]
                imagePullPolicy: IfNotPresent
        ---
      2. 執行以下命令,在ns-not-in-mesh命名空間部署應用。

        kubectl apply -f sleep.yaml -n ns-not-in-mesh
    3. 查看日誌。

      ASM執行個體版本為1.17.2.35以下

      1. 登入ASM控制台,在左側導覽列,選擇服務網格 > 網格管理

      2. 網格管理頁面,找到待配置的執行個體,單擊執行個體的名稱或在操作列中單擊管理

      3. 在網格詳情頁面,選擇網格執行個體 > 基本資料

      4. 基本資料頁面,單擊控制面日誌採集右側的查看日誌

        在Project頁面右上方,設定時間為5分鐘,縮小日誌查看範圍。在原始日誌頁簽下,可以看到建立sleep應用的日誌。說明ns-not-in-mesh命名空間沒有啟用Sidecar代理自動注入,在ns-not-in-mesh中部署應用仍然導致了控制平面向資料平面中Sidecar代理推送配置資訊。

        {"content":"2024-01-04T10:27:00.056248Z\tinfo\tads\tPush debounce stable[16] 1 for config ServiceEntry/ns-not-in-mesh/sleep.ns-not-in-mesh.svc.cluster.local: 100.183738ms since last change, 100.183497ms since last push, full=true","_time_":"2024-01-04T18:27:00.056310074+08:00","_source_":"stdout","_container_name_":"discovery","__pack_meta__":"1|MTcwNDM2MjU0MjUyMjE4OTYxMA==|10|4","__topic__":"asm_istiod_discovery","__source__":"log_service","__time__":"1704364020"}
        {"content":"2024-01-04T10:26:59.956023Z\tinfo\tads\tFull push, new service ns-not-in-mesh/sleep.ns-not-in-mesh.svc.cluster.local","_time_":"2024-01-04T18:26:59.956087922+08:00","_source_":"stdout","_container_name_":"discovery","__pack_meta__":"1|MTcwNDM2MjU0MjUyMjE4OTYxMA==|10|3","__topic__":"asm_istiod_discovery","__source__":"log_service","__time__":"1704364020"}

      ASM執行個體版本為1.17.2.35及以上

      1. 登入ASM控制台,在左側導覽列,選擇服務網格 > 網格管理

      2. 網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇可觀測管理中心 > 日誌中心

      3. 日誌中心頁面,單擊控制平面日誌頁簽,設定時間為5分鐘,縮小日誌查看範圍。

        原始日誌頁簽下,可以看到建立sleep應用的日誌。說明ns-not-in-mesh命名空間沒有啟用Sidecar代理自動注入,在ns-not-in-mesh中部署應用仍然導致了控制平面向資料平面中Sidecar代理推送配置資訊。

        {"content":"2024-01-04T10:33:21.180016Z\tinfo\tads\tPush debounce stable[28] 2 for config Address//c847e048f73054cb192835f8a60ea5219//Pod/ns-not-in-mesh/sleep-fc5cdb9c5-pkfvr and 1 more configs: 100.488198ms since last change, 121.179298ms since last push, full=true","_time_":"2024-01-04T18:33:21.180104591+08:00","_source_":"stdout","_container_name_":"discovery","__pack_meta__":"0|MTcwNDM1NjA0OTcxOTcxNzAyMw==|11|9","__topic__":"asm_istiod_discovery","__source__":"log_service","__time__":"1704364401"}
        {"content":"2024-01-04T10:33:21.079470Z\tinfo\tmodel\tFull push, new service ns-not-in-mesh/sleep.ns-not-in-mesh.svc.cluster.local","_time_":"2024-01-04T18:33:21.07954976+08:00","_source_":"stdout","_container_name_":"discovery","__pack_meta__":"0|MTcwNDM1NjA0OTcxOTcxNzAyMw==|11|8","__topic__":"asm_istiod_discovery","__source__":"log_service","__time__":"1704364401"}

步驟四:在ASM中進行服務發現範圍配置

服務發現範圍配置功能可以使ASM控制平面只推送配置到帶有asm-discovery標籤的ns-in-mesh命名空間下的應用,其他命名空間下的應用將不會引起Sidecar的配置推送。您可以通過選擇命名空間或編輯標籤選取器兩種方式來進行服務發現範圍配置。

方式一:通過命名空間佈建服務發現範圍

  1. 登入ASM控制台,在左側導覽列,選擇服務網格 > 網格管理

  2. 網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇網路執行個體 > 服務發現範圍配置

  3. 服務發現範圍配置頁面,網格服務發現模式選擇自動探索資料面 Kubernetes 叢集中選定命名空間下的服務

  4. 選擇命名空間頁簽,選擇目的地組群,在下方列表中,找到所有ns-in-mesh以外的命名空間。在ns-in-mesh以外的命名空間右側,單擊取消選中,在頁面下方,單擊確定,在確認對話方塊,單擊確定

  5. 查看命名空間配置是否成功。

    1. 在網格詳情頁面左側導覽列,選擇網格執行個體 > 基本資料

    2. 基本資料頁面,查看網格的狀態

      狀態顯示為運行中,表示命名空間配置成功。

方式二:通過標籤選取器佈建服務發現範圍

  1. 登入ASM控制台,在左側導覽列,選擇服務網格 > 網格管理

  2. 網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇網路執行個體 > 服務發現範圍配置

  3. 服務發現範圍配置頁面,網格服務發現模式選擇自動探索資料面 Kubernetes 叢集中選定命名空間下的服務,然後單擊編輯標籤選取器頁簽。

  4. 配置標籤名asm-discovery操作符Exists,然後在頁面下方,單擊確定,在確認對話方塊,單擊確定

  5. 查看標籤選取器配置是否成功。

    1. 在網格詳情頁面左側導覽列,選擇網格執行個體 > 基本資料

    2. 基本資料頁面,查看網格的狀態

      狀態顯示為運行中,表示標籤選取器配置成功。

步驟五:驗證使用服務發現範圍配置功能是否成功

  1. 查看Sidecar代理配置。

    1. 執行以下命令,重新匯出Sidecar代理配置。

      命令中httpbin-6fcb98998c-46qhr請替換為實際的httpbin Pod名稱。

      kubectl exec -it httpbin-6fcb98998c-46qhr -c istio-proxy -n ns-in-mesh -- curl -s localhost:15000/config_dump > config_dump.json
    2. 開啟下載到本地的config_dump.json檔案,搜尋httpbin.ns-not-in-mesh

      搜尋不到httpbin.ns-not-in-mesh,說明Sidecar代理配置資訊中沒有儲存ns-not-in-mesh命名空間中的服務資訊。

  2. 查看控制平面日誌。

    1. 執行以下命令,在ACK叢集的ns-not-in-mesh命名空間中刪除sleep應用。

      kubectl delete -f sleep.yaml -n ns-not-in-mesh
    2. 查看日誌。

      ASM執行個體版本為1.17.2.35以下

      1. 登入ASM控制台,在左側導覽列,選擇服務網格 > 網格管理

      2. 網格管理頁面,找到待配置的執行個體,單擊執行個體的名稱或在操作列中單擊管理

      3. 在網格詳情頁面,選擇網格執行個體 > 基本資料

      4. 基本資料頁面,單擊控制面日誌採集右側的查看日誌

        在Project頁面右上方,設定時間為15分鐘,縮小日誌查看範圍。此時無法查看到關於刪除的sleep應用的日誌。說明在服務發現之外的命名空間發生變更,並不會引起控制平面向Sidecar代理推送配置資訊。

      ASM執行個體版本為1.17.2.35及以上

      1. 登入ASM控制台,在左側導覽列,選擇服務網格 > 網格管理

      2. 網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇可觀測管理中心 > 日誌中心

      3. 日誌中心頁面,單擊控制平面日誌頁簽,設定時間為15分鐘,縮小日誌查看範圍。

        此時無法查看到關於刪除的sleep應用的日誌。說明在服務發現之外的命名空間發生變更,並不會引起控制平面向Sidecar代理推送配置資訊。

相關操作

在服務發現範圍中排除指定標籤的Pod

服務網格預設發現Kubernetes叢集中的所有服務和Pod,當一個Pod在服務發現範圍之外時,服務網格控制面將不會發現此Pod,任何被Sidecar代理的請求將不會發送到此Pod。在服務網格1.20及以上版本,您可以通過配置標籤選取器的方式,從服務發現範圍中排除滿足指定標籤的Pod。通過這種方式,可以快速轉移Pod接收的所有流量。

  1. 登入ASM控制台,在左側導覽列,選擇服務網格 > 網格管理

  2. 網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇網路執行個體 > 服務發現範圍配置

  3. 單擊展開進階選項,單擊排除指定標籤的Pod,填寫標籤名標籤值,以在服務發現範圍中排除指定標籤的Pod。同時,您也可以使用topology.kubernetes.io/region來排除指定地區的Pod,使用topology.kubernetes.io/zone來指定可用性區域的Pod。

  4. 在頁面下方,單擊確定。在彈出的對話方塊中,單擊確定