天天看點

在Kubernetes上使用RDMA

RDMA

RDMA(全稱RemoteDirect Memory Access) 它為了解決網絡傳輸中伺服器端資料處理的延遲而産生。

它的原理是将待傳輸的資料從一台計算機的記憶體,直接傳輸到另一台計算機的記憶體,整個傳輸過程無需作業系統和協定棧的介入。由于旁路了作業系統協定棧,通訊過程極大的降低了CPU的使用率,減少了核心的記憶體複制,以及使用者态與核心态的上下文切換。

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

在Kubernetes上使用RDMA

阿裡雲支援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
      nodeSelector:
        aliyun.accelerator/rdma: "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, 執行腳本。 最終添加成功有如下顯示:
在Kubernetes上使用RDMA
  • 在節點 -> 标簽管理中,給rdma節點增加标簽 aliyun.accelerator/rdma: true
在Kubernetes上使用RDMA
  • 增加标簽後能夠看到節點上的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

在Kubernetes上使用RDMA

另一個容器中執行

ib\_read\_bw -q 30 <上一個容器的 ip>

在Kubernetes上使用RDMA

出現測試結果,說明兩個容器之間可以通過RDM完成資料傳輸。 帶寬為5500Mb/S, 約44Gbit/s。

tips: RDMA通訊建連過程普遍分為 TCP 和 RDMA_CM 兩種實作,如果應用程式使用RDMA_CM 的建連的方式,vpc網絡插件中配置設定的pod ip 無法作為RDMA_CM 位址, 容器需要設定HostNetwork。并将bond0 ip 設定為CM的通訊位址。

繼續閱讀