全部產品
Search
文件中心

Alibaba Cloud Service Mesh:基於eRDMA加速服務網格Pod間的網路效能

更新時間:Mar 26, 2025

Alibaba Cloud Linux 3提供的共用記憶體通訊(Shared Memory Communication)是一種相容socket層、使用遠程記憶體直接存取(RDMA)技術的高效能核心網路通訊協定棧,能夠透明最佳化TCP應用網路通訊效能。然而,在原生ECS環境中使用SMC技術最佳化網路效能時,使用者需要謹慎維護SMC白名單以及容器網路命名空間中的配置,以防止SMC非預期降級到TCP。ASM為使用者提供了可控的網路環境(叢集內)SMC最佳化能力,能夠自動最佳化服務網格Pod間的流量,使用者無需關心具體的SMC配置。

前提條件

已添加叢集到ASM執行個體

使用限制

操作步驟

步驟一:節點環境初始化

SMC利用eRDMA網卡加速網路效能,在啟用之前需要對節點進行相應的初始化準備。

  1. Alibaba Cloud Linux 3系統核心為5.10.134-17.3及以上,升級方式可參見更換核心版本

  2. 為節點安裝 erdma-controller 組件,並開啟 SMC-R 透明加速,詳情參見使用eRDMA加速容器網路

步驟二:部署測試應用

  1. 為測試使用的default命名空間啟用自動注入,具體請參見啟用自動注入

  2. 使用以下內容,建立fortioserver.yaml檔案。

    展開查看fortioserver.yaml

    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: fortioserver
    spec:
      ports:
      - name: http-echo
        port: 8080
        protocol: TCP
      - name: tcp-echoa
        port: 8078
        protocol: TCP
      - name: grpc-ping
        port: 8079
        protocol: TCP
      selector:
        app: fortioserver
      type: ClusterIP
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: fortioserver
      name: fortioserver
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: fortioserver
      template:
        metadata:
          labels:
            app: fortioserver
          annotations:
            sidecar.istio.io/inject: "true"
            sidecar.istio.io/proxyCPULimit: 2000m
            proxy.istio.io/config: |
              concurrency: 2 
        spec:
          shareProcessNamespace: true
          containers:
          - name: captured
            image: fortio/fortio:latest_release
            ports:
            - containerPort: 8080
              protocol: TCP
            - containerPort: 8078
              protocol: TCP
            - containerPort: 8079
              protocol: TCP
          - name: anolis
            securityContext:
              runAsUser: 0
            image: openanolis/anolisos:latest
            args:
            - /bin/sleep
            - 3650d
    ---
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-switch: "off"
      name: fortioclient
    spec:
      ports:
      - name: http-report
        port: 8080
        protocol: TCP
      selector:
        app: fortioclient
      type: LoadBalancer
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: fortioclient
      name: fortioclient
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: fortioclient
      template:
        metadata:
          annotations:
            sidecar.istio.io/inject: "true"
            sidecar.istio.io/proxyCPULimit: 4000m
            proxy.istio.io/config: |
               concurrency: 4
          labels:
            app: fortioclient
        spec:
          shareProcessNamespace: true
          affinity:
            podAntiAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
              - labelSelector:
                  matchExpressions:
                  - key: app
                    operator: In
                    values:
                    - fortioserver
                topologyKey: "kubernetes.io/hostname"
          containers:
          - name: captured
            volumeMounts:
            - name: shared-data
              mountPath: /var/lib/fortio
            image: fortio/fortio:latest_release
            ports:
            - containerPort: 8080
              protocol: TCP
          - name: anolis
            securityContext:
              runAsUser: 0
            image: openanolis/anolisos:latest
            args:
            - /bin/sleep
            - 3650d
          volumes:
          - name: shared-data
            emptyDir: {}
    
  3. 使用ACK叢集的KubeConfig,執行以下命令,部署測試應用。

    kubectl apply -f fortioserver.yaml
  4. 執行以下命令,查看測試應用的狀態。

    kubectl get pods | grep fortio

    預期輸出:

    NAME                            READY   STATUS    RESTARTS      
    fortioclient-8569b98544-9qqbj   3/3     Running   0
    fortioserver-7cd5c46c49-mwbtq   3/3     Running   0

    預期輸出表明兩個應用均正常啟動。

步驟三:在基礎環境運行測試,查看基準測試結果

fortio應用啟動後,會暴露8080連接埠監聽,訪問該連接埠將開啟fortio應用的控制台頁面。為了產生測試流量,可以將fortioclient的連接埠映射到當前所用機器,在當前所用機器上開啟fortio的控制台頁面。

  1. 使用ACK叢集的KubeConfig,執行以下命令,將fortio用戶端的Service監聽的8080連接埠映射到本地的8080連接埠。

    kubectl port-forward service/fortioclient 8080:8080
  2. 在瀏覽器中輸入http://localhost:8080/fortio地址,訪問fortio用戶端控制台,並修改相關配置。

    image

    請按照下表修改頁面上的參數。

    參數

    樣本值

    URL

    http://fortioserver:8080/echo

    QPS

    100000

    Duration

    30s

    Threads/Simultaneous connections

    64

    Payload

    填寫以下字串(128 Byte):

    xhsyL4ELNoUUbC3WEyvaz0qoHcNYUh0j2YHJTpltJueyXlSgf7xkGqc5RcSJBtqUENNjVHNnGXmoMyILWsrZL1O2uordH6nLE7fY6h5TfTJCZtff3Wib8YgzASha8T8g

  3. 配置完成後,在頁面下方,單擊Start開始測試,等待進度條結束,測試完畢。

    image

    測試回合完畢後,頁面將給出本次測試的結果。下圖僅供參考,測試結果請以實際環境為準。

    image

    頁面輸出的測試結果橫座標為請求的Latency,觀察直條圖在橫座標上的分布可以得出請求延遲的分布情況,紫色曲線為在不同回應時間範圍內完成的請求數量。縱座標為完成的請求數。同時,圖表頂部給出了P50/P75/P90/P99/P99.9的請求Latency資料。得到基礎環境資料後,需要為應用啟用SMC,準備進行SMC加速後的效能驗證。

步驟四:為ASM執行個體和工作負載啟用SMC加速

  1. 使用服務網格的KubeConfig編輯網格配置,添加"smcEnabled: true",以啟用SMC加速功能。

    $ kubectl edit asmmeshconfig
    
    apiVersion: istio.alibabacloud.com/v1beta1
    kind: ASMMeshConfig
    metadata:
      name: default
    spec:
      ambientConfiguration:
        redirectMode: ""
        waypoint: {}
        ztunnel: {}
      cniConfiguration:
        enabled: true
        repair: {}
      smcEnabled: true
  2. 使用ACK叢集的KubeConfig,執行以下命令,修改fortioserver和fortioclient的Deployment,為Pod添加Annotation。

    為網格執行個體啟用加速後,還需要進一步為工作負載啟用加速,通過為Pod添加Key為smc.asm.alibabacloud.com/enabled,值設定為true的Annotation,可以為工作負載啟用SMC加速,您需要同時為需要最佳化的兩端工作負載均啟用加速

    1. 編輯fortioclient的Deployment定義。

      $ kubectl edit deployment fortioclient
      
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        ......
        name: fortioclient
      spec:
        ......
        template:
          metadata:
            ......
            annotations:
              smc.asm.alibabacloud.com/enabled: "true"
              
    2. 編輯fortioserver的Deployment定義。

      $ kubectl edit deployment fortioserver
      
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        ......
        name: fortioserver
      spec:
        ......
        template:
          metadata:
            ......
            annotations:
              smc.asm.alibabacloud.com/enabled: "true"
              

步驟五:加速後環境運行測試,查看啟用最佳化後的測試結果

由於修改Deployment將使工作負載重啟,因此您需要參考步驟三重新進行fortioclient連接埠映射,再次發起測試,等待測試結束查看結果。

image

與加速前的結果對比,可以看到啟用ASM SMC加速後,延遲下降,QPS明顯提升。

FAQ

  1. 為什麼啟用SMC後訪問某些資料庫服務卡住,無法完成串連建立?

    這是因為訪問資料庫服務大多經過負載平衡網元,而部分網元實現沒有嚴格遵守TCP option標準,錯誤識別SMC協議規範中的254類型TCP option,導致網路連接建立失敗,無法訪問服務。

    您可以通過如下方式確認此問題:

    1. 在節點上安裝aliyun-smc-extensions工具包:

      sudo yum install -y aliyun-smc-extensions
    2. 使用aliyunsmc-check對目標URL進行通訊鏈路檢查:

      aliyunsmc-check syn_check --url <url>

      aliyunsmc-check會檢查目標URL訪問路徑上的TCP option重放,衝突以及超長問題。輸出結果樣本如下:

      image

    若檢查探索服務訪問路徑上確實存在對TCP option的非標處理,建議在訪問此服務的POD中關閉SMC加速。