在Kubernetes上使用RDMA

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: ### RDMA RDMA(全称RemoteDirect Memory Access) 它为了解决网络传输中服务器端数据处理的延迟而产生。 它的原理是将待传输的数据从一台计算机的内存,直接传输到另一台计算机的内存,整个传输过程无需操作系统和协议栈的介入。

RDMA

RDMA(全称RemoteDirect Memory Access) 它为了解决网络传输中服务器端数据处理的延迟而产生。

它的原理是将待传输的数据从一台计算机的内存,直接传输到另一台计算机的内存,整个传输过程无需操作系统和协议栈的介入。由于旁路了操作系统协议栈,通讯过程极大的降低了CPU的使用率,减少了内核的内存复制,以及用户态与内核态的上下文切换。

常见的RDMA实现有三种,基于以太网的Roce网络(RDMA over Converged Ethernet), InfiniBand, iWARP。

image.png | left | 450x422

阿里云支持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, 执行脚本。 最终添加成功有如下显示:

image.png | left | 480x126

  • 在节点 -> 标签管理中,给rdma节点增加标签 aliyun.accelerator/rdma: true

image.png | left | 425x159

  • 增加标签后能够看到节点上的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

image.png | left | 607x357

另一个容器中执行 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的通讯地址。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
2月前
|
Kubernetes 应用服务中间件 nginx
搭建Kubernetes v1.31.1服务器集群,采用Calico网络技术
在阿里云服务器上部署k8s集群,一、3台k8s服务器,1个Master节点,2个工作节点,采用Calico网络技术。二、部署nginx服务到k8s集群,并验证nginx服务运行状态。
966 1
|
7月前
|
弹性计算 Kubernetes Ubuntu
ack-kubernetes-elastic-workload,ECI这个能不能重新打个包支持下arm
ack-kubernetes-elastic-workload,ECI这个能不能重新打个包支持下arm
61 2
|
7月前
|
Kubernetes Cloud Native Linux
云原生|kubernetes|kubernetes的网络插件calico和flannel安装以及切换
云原生|kubernetes|kubernetes的网络插件calico和flannel安装以及切换
1479 0
|
Kubernetes 网络协议 API
10 分钟了解 Kubernetes 网络
10 分钟了解 Kubernetes 网络
104 0
|
存储 Kubernetes 负载均衡
【Kubernetes的Service Mesh发展历程及Istio架构、存储供应使用NFS flexvolume CSI接口】
【Kubernetes的Service Mesh发展历程及Istio架构、存储供应使用NFS flexvolume CSI接口】
229 0
|
Kubernetes 网络协议 Linux
Kubernetes网络解决方案的比较
Kubernetes网络解决方案的比较
|
Kubernetes Cloud Native 开发工具
云原生|kubernetes|kubernetes的网络插件calico和flannel安装以及切换(一)
云原生|kubernetes|kubernetes的网络插件calico和flannel安装以及切换
674 0
云原生|kubernetes|kubernetes的网络插件calico和flannel安装以及切换(一)
|
Kubernetes Cloud Native Ubuntu
云原生|kubernetes|kubernetes的网络插件calico和flannel安装以及切换(二)
云原生|kubernetes|kubernetes的网络插件calico和flannel安装以及切换
1946 0
|
Kubernetes 负载均衡 Cloud Native
Kubernetes 网络 | 学习笔记
快速学习 Kubernetes 网络
Kubernetes 网络 | 学习笔记
|
存储 JSON Kubernetes
Kubernetes-网络
在实际生产中,我们面临多种多样的业务场景,导致业务之间的调用关系更加复杂化,从而对网络提出更高的要求,对于Kubernetes来说主要解决以下四个问题: 1. Pod中容器与容器之间的通信问题; 2. Pod与Pod之间的网络通信问题; 3. Pod与Service之间的通信问题; 4. 集群内部与外部的通信问题;