Дополнение D. Как создать контейнер Docker с ускорением RDMA приложений поверх сетевой среды 100Gb InfiniBand

Данный раздел содержит перевод блога Knowledge Article Mellanox How to Create a Docker Container with RDMA Accelerated Applications Over 100Gb InfiniBand Network в редакции от 03 декабря 2018.

{Прим. пер.: Надеемся, что данный блог может оказаться полезным в плане повышения производительности ваших приложений.}

Содержание

Дополнение D. Как создать контейнер Docker с ускорением RDMA приложений поверх сетевой среды 100Gb InfiniBand
Ссылки
Обзор установки
Оборудование
Логическая архитектура сервера
Обвязка сервера
Настройка сетевой среды
Руководство по развёртыванию
Предварительные требования
Обновление программных пакетов Ubuntu
Включение диспетчера подсетей в коммутаторе IB
Установка Mellanox OFED для Ubuntu в качестве хоста
Выгрузка Mellanox OFED
Установка Mellanox OFED
Установка и настройка Docker
Деинсталяция старых версий
Установка Docker CE
Установка с применением репозитория
Настройка самого репозитория
Установка Docker CE
Персонализация моста docker0
Настройка взаимодействия с внешним миром
Добавление маршрута IP с определённой подсетью
Быстрая проверка
Создание или вытаскивание пула базового образа и запуск контейнера
Вариант 1
Вариант 2
Вариант 3
Эталонное тестирование

В этом документе мы продемонстрируем некую процедуру развёртывания ускоряемых RDMA приложений, запускаемых в контейнерах Docker и сквозном решении Mellanox Infiniband (IB) 100Gb/s.

Данный документ описывает процесс сборки Docker CE из исходного кода для Ubuntu 16.04.2 LTS и Docker 17.12 в физических серверах.

Мы покажем как обновить и установить соответствующее программное обеспечение Mellanox и аппаратные компоненты в хосте и контейнере Docker.

Обзор установки

  Оборудование

 

Рисунок 1



  Логическая архитектура сервера

 

Рисунок 2



  Обвязка сервера

В своей справке мы будем вставлять 1й порт в коммутатор Infiniband и не будем применять 2й порт.

 

Рисунок 3



  Настройка сетевой среды

В нашей установке мы будем применять два сервера.

Каждый сервер будет подключён к коммутатору SB7700 медным кабелем 100Gb IB. Порты коммутатора в нашем случае обвязываются так:

  • 1й и 2й порты - соединены с хостами серверов

Названия серверов и настройки сетевой среды таковы:

Таблица D-1. Сетевая среда примера
Тип сервера Название сервера IP NICs
внутренняя сеть внешняя сеть

Server 01

clx-mld-41

ib0: 12.12.12.41

eno1: из DHCP (зарезервировано)

Server 02

clx-mld-42

ib0: 12.12.12.42

eno1: из DHCP (зарезервировано)

Руководство по развёртыванию

  Предварительные требования

 

Обновление программных пакетов Ubuntu

Для обновления/ модернизации пакетов программного обеспечения Ubuntu выполните приведённые ниже команды.


    $ sudo apt-get update # Опросить список доступных обновлений
    $ sudo apt-get upgrade -y # Обновление текущих пакетов в строгом соответствии

		
 

Включение диспетчера подсетей в коммутаторе IB

Для знакомства с программным обеспечением коммутатора обратитесь к Руководству пользователя MLNX-OS. Прежде чем применять свой коммутатор Mellanox, мы рекомендуем вам обновить этот коммутатор до самой последней версии MLNX-OS. Существует три варианта для выбора наилучшего места для расположения SM (диспетчера подсетей, Subnet Manager):

  1. Включить SM в одном из ваших управляемых коммутаторов. Это очень удобный и быстрый вид работы, к тому же он упрощает ‘plug & play’ Infiniband.

  2. Запустить /etc/init.d/opensmd в одном или более серверов. В случае когда у вас имеется 648 или более узлов рекомендуется запускать SM в неком сервере.

  3. Воспользоваться выделенным сервером Unified Fabric Management (UFM®). UFM предлагает много дополнительной функциональности помимо SM. UFM требует больше вычислительной мощности чем в наличии у имеющегося коммутатора, но при этом не требует дорогостоящего сервера. Это представляет дополнительную стоимость выделенного сервера.

Мы будем давать пояснения только для вариантов 1 и 2.

Вариант 1: Настройка SM в коммутаторе MLNX-OS® любых систем коммутации Mellanox

Для включения SM выполните следующие шаги:

  1. Зарегистрируйтесь в коммутаторе и войдите в режим настроек:

    
         Mellanox MLNX-OS Switch Management
    
        switch login: admin
        Password:
        Last login: Wed Aug 12 23:39:01 on ttyS0
    
        Mellanox Switch
    
        switch [standalone: master] > enable
        switch [standalone: master] # conf t
        switch [standalone: master] (config)# 
     	   
  2. Выполните следующие команды:

    
        switch [standalone: master] (config)#ib sm
        switch [standalone: master] (config)# 
     	   
  3. Проверьте запуск SM, выполните:

    
        switch [standalone: master] (config)#show ib sm
        enable
        switch [standalone: master] (config)# 
     	   

Для сохранения настроек (на постоянной основе) выполните:


    switch (config) # configuration write
 	   

Вариант 2: Настройка SM в сервере (пропустите эту процедуру если вы настроили SM в коммутаторе)

Для запуска OpenSM в некотором сервере просто исполните opensm в командной строке в своём узле управления выполнив:


    # opensm
 	   

Или: запускайте OpenSM автоматически на своём головном узле изменив свой файл /etc/opensm/opensm.conf. Создайте такой файл настроек выполнив:


    # opensm –config /etc/opensm/opensm.conf
 	   

Замените в файле /etc/opensm/opensm.conf следующую строку:


    onboot=yes
 	   

В процессе начальной установки OpenSM конфигурируется и запускается с алгоритмом маршрутизации по умолчанию. При исполнении кластера толстого дерева со множеством уровней рекомендуется изменить следующие параметры чтобы создать наиболее действенный алгоритм маршрутизации, доставляющий наивысшую производительность:


    –routing_engine=updn
 	   

Для ознакомления со всеми подробностями того как настраивать атрибуты OpenSM ознакомьтесь с главой OpenSM – Subnet Manager Руководства пользователя Mellanox OFED для Linux.

 

Установка Mellanox OFED для Ubuntu в качестве хоста

Данная глава описывает как установить и проверить пакет Mellanox OFED для Linux в некой отдельной машине хоста с установленной картой адаптера Mellanox ConnectX®-5. Для получения дополнительных сведений отсылаем вас к Mellanox OFED for Linux User Manual.

 

Выгрузка Mellanox OFED

  1. Убедитесь что ваша система имеет установленным сетевой адаптер Mellanox (HCA/NIC):

    
    	# lspci -v | grep Mellanox
     	   

    Приведённый ниже пример показывает некую систему с установленным HCA:

     

    Рисунок 4



  2. Вугрузите необходимый образ ISO в соответствии с ОС своего хоста. Название такого образа имеет формат MLNX_OFED_LINUX-<ver>-<OS label><CPUarch>.iso. Вы можете получить его с http://www.mellanox.com > Products > Software > InfiniBand/VPI Drivers > Mellanox OFED Linux (MLNX_OFED) > Download.

     

    Рисунок 5



  3. Для того чтобы убедиться в целостности выгруженного файла проверьте его MD5SUM. Выполните приводимую ниже команду и сравните полученный результат со значением на странице выгрузки.

    
    	# md5sum MLNX_OFED_LINUX-<ver>-<OS label>.tgz
     	   
 

Установка Mellanox OFED

MLNX_OFED устанавливается путём запуска сценария mlnxofedinstall. Этот сценарий исполнения выполняет следующее:

  • Исследует установленное в настоящий момент ядро

  • Выполняет деинсталляцию всех стеков программного обеспечения, которые составляют часть самого дистрибутива операционной системы или стека иного коммерческого производителя

  • Устанавливает двоичные RPM MLNX_OFED_LINUX (если они доступны для вашего текущего ядра)

  • Выявляет установленные в настоящий момент сетевые адаптеры InfiniBand и Ethernet, а также автоматически обновляет их встроенное программное обеспечение

Данный сценарий установки удаляет все установленные ранее пакеты OFED Mellanox и повторно выполняет установку с нуля. Вы можете получить запрос на подтверждение удаления всех старых пакетов.

  1. Зарегистрируйтесь в машине установки от имени root.

  2. Скопируйте выгруженный tgz в /tmp:

    
        # cd /tmp
        # tar -xzvf MLNX_OFED_LINUX-4.2-1.0.0.0-ubuntu16.04-x86_64.tgz
        # cd MLNX_OFED_LINUX-4.2-1.0.0.0-ubuntu16.04-x86_64/ 
     	   
  3. Исполните сам сценарий установки:

    
    	# ./mlnxofedinstall
     	   
  4. После успешного выполнения установки осуществите перезагрузку:

    
        # /etc/init.d/openibd restart
        # reboot
     	   

    По умолчанию оба порта ConnectX®-5 VPI инициализируются в качестве портов Infiniband.

  5. (Необязательно) отключите не используемый второй порт в своём устройстве. Определите PCI ID своих портов PCI:

    
        # lspci | grep Mellanox
        05:00.0 Infiniband controller: Mellanox Technologies Device 1019
        05:00.1 Infiniband controller: Mellanox Technologies Device 1019
     	   

    Отключаем 2й порт:

    
    	# echo 0000:05:00.1 > /sys/bus/pci/drivers/mlx5_core/unbind
     	   
  6. Убедитесь что режимом соответствующего порта является Infiniband:

    
    	# ibv_devinfo
     	   
     

    Рисунок 6



  7. Если вы обнаружите то что представлено ниже, вам следует изменить значение порта интерфейсов на Infiniband.

     

    Рисунок 7



    Измените режим портов своих интерфейсов на Infiniband. Порты ConnectX®-5 могут индивидуально настраиваться на работу в качестве портов Infiniband или Ethernet. Вам следует изменить режим на Infiniband. После загрузки соответствующего драйвера воспользуйтесь сценарием mlxconfig.

    
    * LINK_TYPE_P1=1 is a Infiniband mode
     	   
    1. Запустите mst и просмотрите названия портов

      
      	# mst start
      	# mst status
       	   
    2. Измените значение режима для обоих портов на Infiniband:

      
      	# mlxconfig -d /dev/mst/mt4121_pciconf0 s LINK_TYPE_P1=1
      	#Port 1 set to IB mode
      	# reboot
      	 

      После каждой перезагрузки вам следует отключать второй порт.

    3. Опросите устройства Infiniband и выведите на печать информацию о них, которая доступна к применению из пространства пользователя.

      
      	# ibv_devinfo
       	   
  8. Запустите утилиту ibdev2netdev чтобы увидеть все имеющиеся ассоциации между вашими устройствами Ethernet и соответствующими устройствами/ портами IB:

    
        # ibdev2netdev
        # ifconfig ib0 12.12.12.41 netmask 255.255.255.0
     	   
  9. Вставьте в свой файл /etc/network/interfaces приводимые далее строки после таких строк:

    
        # vim /etc/network/interfaces
        auto eno1
        iface eno1 inet dhcp
     	   

    а именно, следующие строки:

    
        auto ib0
        iface ib0 inet static
    	address 12.12.12.41
        netmask 255.255.255.0 
     	   

    Например:

    
        # vim /etc/network/interfaces
    
        auto eno1
        iface eno1 inet dhcp
    
        auto ib0
        iface ib0 inet static
        address 12.12.12.41
        netmask 255.255.255.0 
     	   
  10. Убедитесь что ваши сетевые настройки установлены корректно:

    
    	# ifconfig -a
     	   

  Установка и настройка Docker

 

Деинсталяция старых версий

Для выполнения деинсталляции старых верссий мы рекомендуем применить такую команду:


	$ sudo apt-get remove docker docker-engine docker.io
 	   

В случае успеха apt-get выдаст отчёт что никакие из этих пакетов не установлены.

Само содержимое /var/lib/docker/, включая образы, контейнеры, тома и сетевые среды сохраняются.

 

Установка Docker CE

Для Ubuntu 16.04 и последующих версий, само ядро Linuxсодержит поддержку для OverlayFS, а Docker CE по умолчанию будет применять драйвер хранилища overlay2.

 

Установка с применением репозитория

Прежде чем вам устанавливать Docker CE пв самый первый раз в новой машине хоста вам понадобится установить репозиторий Docker. Впоследствии вы можете устанавливать и обновлять Docker из этого репозитория.

 

Настройка самого репозитория

  1. Обновите индексацию пакета apt:

    
    $ sudo apt-get update
     	   
  2. Установите необходимые пакеты чтобы позволить apt применять репозиторий поверх HTTPS:

    
    $ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
     	   
  3. Добавьте официальный GPG ключ Docker:

    
    $ sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
     	   

    Убедитесь что значением отпечатка пальца для данного ключа является 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88:

    
        $ sudo apt-key fingerprint 0EBFCD88
        pub 4096R/0EBFCD88 2017-02-22
        Key fingerprint = 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
        uid Docker Release (CE deb) 
        sub 4096R/F273FCD8 2017-02-22 
     	   
 

Установка Docker CE

Установите самую последнюю версию Docker CE или перейдите к следующему шагу чтобы установить некую определённую версию. Заменяются все существующие установки Docker.


	$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
	$ sudo apt-get update
	$ sudo apt-get install docker-ce
 	   
 

Персонализация моста docker0

Рекомендуемым методом настройки самого демона Docker является применение его файла daemon.json, который расположен в /etc/docker/. Если такой файл не существует, создайте его. Вы можете определить одну или более следующих установок для настройки устанавливаемого по умолчанию сетевого моста:


	{
	"bip": "172.16.41.1/24",
	"fixed-cidr": "172.16.41.0/24",
	"mtu": 1500,
	"dns": ["8.8.8.8","8.8.4.4"]
	} 
 	   

Те же самые параметры представлены в виде флагов для dockerd с пояснениями для каждого:

  • --bip=CIDR: поддерживает конкретный адрес и сетевую маску для моста docker0 с применением стандартной нотации CIDR. Например: 172.16.41.1/16.

  • --fixed-cidr=CIDR: ограничивает соответствующий диапазон IP в устанавливаемой подсети docker0 при помощи стандартной нотации CIDR. Например: 172.16.41.0/16.

  • --mtu=BYTES: переопределяет значение максимальной длины пакета в docker0. Например: 1500.

  • --dns=[]: Подлежащие использованию серверы DNS. Например: --dns=8.8.8.8,8.8.4.4.

После внесения изменений в файл daemon.json перезапустите Docker/


	$ sudo /etc/init.d/docker restart
 	   

{Прим. пер.: при использовании docker-compose сетевые настройки моста по умолчанию хранятся в docker-compose.yml, подробнее в Compose file version 3 reference и далее, >ipv4_address, ipv6_address, или Docker compose example using default 'bridge' network.}

 

Настройка взаимодействия с внешним миром

Проверьте ip перенаправления в ядре:


    $ sysctl net.ipv4.conf.all.forwarding
    net.ipv4.conf.all.forwarding = 1
 	   

если он запрещён,


    $ sysctl net.ipv4.conf.all.forwarding
    net.ipv4.conf.all.forwarding = 0
 	   

будьте добры, разрешите его и проверьте снова:


	$ sysctl net.ipv4.conf.all.forwarding=1
 	   

По причинам безопасности Docker настраивает правила iptables чтобы предотвращать обмен контейнеров с внешним миром с самой хост машины в хостах Linux. Docker настраивает значения политики по умолчанию цепочки FORWARD в DROP.

Для перекрытия поведения значений по умолчанию вы можете вручную изменить значение политики по умолчанию:


	$ sudo iptables -P FORWARD ACCEPT
 	   
 

Добавление маршрута IP с определённой подсетью

Добавьте маршрутизацию для сетевой среды контейнеров во втором хосте:


	$ sudo ip route add 172.16.42.0/24 via 12.12.12.42 
 	   
 

Быстрая проверка

Предоставьте своей среде быструю проверку запуска чтобы убедиться в верности всех ваших настроек:


	$ docker run hello-world
 	   

  Создание или вытаскивание пула базового образа и запуск контейнера

 

Вариант 1

Вытаскивание необходимого образа из Docker Hub и запуск некого контейнера Docker в привилегированном режиме из удалённого репозитория при помощи:


	$ sudo docker run -it --privileged --name=mnlx-verbs-prvlg mellanox/mofed421_docker:latest bash
 	   
 

Вариант 2

Вытаскивание необходимого образа из Docker Hub и запуск некого контейнера Docker в не привилегированном режиме из удалённого репозитория при помощи:


	$ sudo docker run -it --cap-add=IPC_LOCK --device=/dev/infiniband/uverbs1 --name=mnlx-verbs-nonprvlg mellanox/mofed421_docker:latest bash
 	   
 

Вариант 3

Docker способен собирать образы автоматически считывая соответствующие инструкции из Dockerfile.

Некий Dockerfile является текстовым документом, который содержит все команды, которые пользователь может вызывать в своей командной строке для сборки некого образа {Прим. пер.: подробнее в Тонкая настройка нашего образа Rail}.

 

Dockerfile

  1. Создайте некий пустой каталог.

  2. Измените каталог (cd) на текущий, создайте некий файл с именем Dockerfile и скопируйте вставкой приводимое ниже содержимое, после чего сохраните этот файл. Обратите внимание на комментарии, которые поясняют каждый оператор в вашем новом Dockerfile.


    # В качестве родительского образа воспользуйтесь официальным Ubuntu 16.04
    FROM ubuntu:16.04
    MAINTAINER YOUR NAME <your@real.mail>
    # Установите каталог MOFED рабочим каталогом и каталогом образа
    ENV MOFED_DIR MLNX_OFED_LINUX-4.2-1.0.0.0-ubuntu16.04-x86_64
    ENV MOFED_SITE_PLACE MLNX_OFED-4.2-1.0.0.0
    ENV MOFED_IMAGE MLNX_OFED_LINUX-4.2-1.0.0.0-ubuntu16.04-x86_64.tgz
    WORKDIR /tmp/
    # Подхватите некие зависимости MOFED
    RUN apt-get update && apt-get install -y --no-install-recommends \
    wget \
    net-tools \
    ethtool \
    perl \
    lsb-release \
    iproute2 \
    pciutils \
    libnl-route-3-200 \
    kmod \
    libnuma1 \
    lsof \
    linux-headers-4.4.0-92-generic \
    python-libxml2 && \
    rm -rf /var/lib/apt/lists/*
    # Выгрузите и установите Mellanox OFED 4.2.1 для Ubuntu 16.04
    RUN wget http://content.mellanox.com/ofed/${MOFED_SITE_PLACE}/${MOFED_IMAGE} && \
    tar -xzvf ${MOFED_IMAGE} && \
    ${MOFED_DIR}/mlnxofedinstall --user-space-only --without-fw-update --all -q && \
    cd .. && \
    rm -rf ${MOFED_DIR} && \
    rm -rf *.tgz
 	   
 

Образ Docker и запуск контейнера

  1. Теперь выполните команду сборки. Она создаст некий образ Docker, который мы намерены пометить тегом -t с тем чтобы он имел дружественное название.

    
        $ docker build -t myofed421image . 
    		
  2. Где вы построили образ? Он находится в реестре образов Docker в вашей машине:

    
    	$ docker images
    		
  3. Запустите контейнер Docker в привилегированном/ не привилегированном режиме из имеющегося удалённого репозитория следующим образом:

    
    	$ docker run -it --privileged --name=mnlx-verbs-prvlg --name=my-verbs-nonprvlg myofed421image bash
    	OR
    	$ docker run -it --cap-add=IPC_LOCK --device=/dev/infiniband/uverbs1 --name=my-verbs-nonprvlg myofed421image bash
    		

  Эталонное тестирование

Проверьте перемещённую версию и uverbs:

Выполните стресс- тест пропускной способности поверх IB в контейнере:


	Сервер:
	ib_write_bw -a -d mlx5_1 &
	Клиент:
	ib_write_bw -a -F $server_IP -d mlx5_1 --report_gbits
		

Таким образом вы можете запустить нагрузочную проверку пропускной способности поверх IB между контейнерами.

И это всё.