在Kubernets上使用RDMA

RDMA

RDMA(全稱RemoteDirect Memory Access) 它爲了解決網絡傳輸中服務器端數據處理的延遲而產生。json

它的原理是將待傳輸的數據從一臺計算機的內存,直接傳輸到另外一臺計算機的內存,整個傳輸過程無需操做系統和協議棧的介入。因爲旁路了操做系統協議棧,通信過程極大的下降了CPU的使用率,減小了內核的內存複製,以及用戶態與內核態的上下文切換。centos

常見的RDMA實現有三種,基於以太網的Roce網絡(RDMA over Converged Ethernet), InfiniBand, iWARP。api

阿里雲支持RDMA

阿里雲支持超級計算集羣SCC,同時支持RoCE網絡和VPC網絡,其中RoCE網絡專用於RDMA通訊。SCC 主要用於高性能計算和人工智能/機器學習、科學/工程計算、數據分析、音視頻處理等應用場景。 
RoCE(RDMA over Convergent Ethernet)網絡速度達到InfiniBand網絡的性能,且能支持更普遍的基於Ethernet的應用。
介紹: https://www.alibabacloud.com/help/zh/doc-detail/60576.htm
能夠在ECS控制檯直接購買包年包月的SCC機型虛擬機。 https://www.alibabacloud.com/help/zh/doc-detail/61978.htm安全

容器支持RDMA

容器服務目前已支持RDMA,您能夠將SCC機型的ECS添加到容器集羣中,並經過RDMA的Device plugin 在調度層面支持 RDMA。
經過聲明 resourcesLimit  rdma/hca: 1 ,能夠指定將容器調度到RDMA的ecs上。服務器

建立容器集羣

進入容器服務控制檯, 選擇建立Kubernetes集羣。因爲SCC目前僅在上海地域支持,容器集羣的地域請選擇 華東2(上海) 。 配置完其餘參數後,點擊集羣建立,等待集羣建立成功。網絡

部署RDMA Device plugin

在容器服務控制檯中,選擇使用模板部署。 部署支持RDMA的Device plugin, 選擇對應的集羣和命名空間,模板以下:機器學習

apiVersion: v1
kind: ConfigMap
metadata:
  name: rdma-devices
  namespace: kube-system
data:
  config.json: |
    {
        "mode" : "hca"
    }

--- 
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: rdma-device-plugin
  namespace: kube-system
spec:
  template:
    metadata:
      annotations:
        scheduler.alpha.kubernetes.io/critical-pod: ""
      labels:
        name: rdma-sriov-dp-ds
    spec:
      hostNetwork: true
      tolerations:
      - key: CriticalAddonsOnly
        operator: Exists
      containers:
      - image: registry.cn-shanghai.aliyuncs.com/acs/rdma-device-plugin
        name: k8s-rdma-device-plugin
        imagePullPolicy: IfNotPresent
        securityContext:
          privileged: true
        volumeMounts:
          - name: device-plugin
            mountPath: /var/lib/kubelet/device-plugins
          - name: config
            mountPath: /k8s-rdma-sriov-dev-plugin
      volumes:
        - name: device-plugin
          hostPath:
            path: /var/lib/kubelet/device-plugins
        - name: config
          configMap:
            name: rdma-devices
            items:
            - key: config.json
              path: config.json
經過手動添加的方式將SCC的ECS加入集羣中
  • 建立SCC的ECS, 而且和容器集羣在同一個VPC下。而且加入相同安全組
  • 在容器服務控制檯上操做 集羣-> 更多 -> 添加已有ECS。 使用手動添加, 並選擇建立的RDMA機器。獲取添加腳本。
  • 登陸上ECS, 執行腳本。 最終添加成功有以下顯示:

  • 在節點 -> 標籤管理中,給rdma節點增長標籤 aliyun.accelerator/rdma: true

  • 增長標籤後可以看到節點上的RDMA的device plugin pod被成功分配到SCC的節點上
部署兩個測試鏡像
apiVersion: v1
kind: Pod
metadata:
  name: rdma-test-pod
spec:
  restartPolicy: OnFailure
  containers:
  - image: mellanox/centos_7_4_mofed_4_2_1_2_0_0_60
    name: mofed-test-ctr
    securityContext:
      capabilities:
        add: [ "IPC_LOCK" ]
    resources:
      limits:
        rdma/hca: 1
    command:
    - sh
    - -c
    - |
      ls -l /dev/infiniband /sys/class/net
      sleep 1000000
---

apiVersion: v1
kind: Pod
metadata:
  name: rdma-test-pod-1
spec:
  restartPolicy: OnFailure
  containers:
  - image: mellanox/centos_7_4_mofed_4_2_1_2_0_0_60
    name: mofed-test-ctr
    securityContext:
      capabilities:
        add: [ "IPC_LOCK" ]
    resources:
      limits:
        rdma/hca: 1
    command:
    - sh
    - -c
    - |
      ls -l /dev/infiniband /sys/class/net
      sleep 1000000

在一個容器中執行 ib\_read\_bw -q 30性能

另外一個容器中執行 ib\_read\_bw -q 30 <上一個容器的 ip>學習

image.png | left | 747x189

出現測試結果,說明兩個容器之間能夠經過RDM完成數據傳輸。 帶寬爲5500Mb/S, 約44Gbit/s。測試

tips: RDMA通信建連過程廣泛分爲 TCP 和 RDMA_CM 兩種實現,若是應用程序使用RDMA_CM 的建連的方式,vpc網絡插件中分配的pod ip 沒法做爲RDMA_CM 地址, 容器須要設置HostNetwork。並將bond0 ip 設置爲CM的通信地址。

雲服務器99元拼團購!拉新還可贏現金紅包!300萬等你瓜分!
立刻一鍵開團贏紅包: http://click.aliyun.com/m/100...



本文做者:蕭元 

閱讀原文

本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索