Основы Juniper Contrail, и как его поставить себе в лабу

в 10:19, , рубрики: contrail, juniper, SDN, виртуализация, Облачные вычисления, Сетевые технологии

Неожиданно обнаружилось, что на Хабре нет практически никакой информации про Juniper Contrail (да-да, SDN) — и я решил своими силами восполнить упущение.

В этой статье хочу вкратце рассказать о том, что такое Contrail, в каких формах он доступен и как его поставить себе в лабу. Более конкретно, ставить будем Contrail Cloud 3.2.0.

image

Основы Contrail

Задача, которую решает Contrail — построение гибких и масштабируемых виртуальных сетей. Виртуальную сеть можно понимать как замену старым-добрым VLAN, в данном случае реализованную примерно как провайдерский L3VPN/EVPN. При этом с точки зрения подключенных клиентов все выглядит так, как будто все их виртуальные машины и физические сервера подключены через обычный коммутатор.

Проще всего описать Contrail как оверлейный SDN. Software-Defined Networking здесь понимается в смысле классического определения ONF — разделение forwarding plane и control plane, плюс централизация control plane в данном случае в Contrail-контроллере.

Слово «оверлейный» указывает на то, что есть на самом деле две сети:

  1. Физическая «фабрика», от которой требуется «только» обеспечить доступность по IP между подключенными физическими устройствами (серверами, роутерами-шлюзами), и
  2. Оверлей — сеть, составленная из туннелей, проложенных между серверами и роутерами-шлюзами. Туннели могут быть MPLS over UDP, MPLS over GRE или VXLAN (перечислено в порядке приоритета, установленного по умолчанию; хотя есть некоторые нюансы, в целом конкретный тип используемого туннеля является деталью реализации).

Contrail-контроллер занимается тем, чтобы управлять виртуализированной оверлейной сетью в ЦОДе или провайдерском облаке, и совершенно не лезет в работу фабрики. Отвечая на вопросы «зачем?» и «почему именно?», в качестве сильных сторон Contrail можно отметить:

  • Масштабируемость — система построена по тем же принципам, что проверенное временем решение BGP/MPLS VPN.
  • Гибкость — изменение конфигурации виртуальной сети не требует изменений в физической сети. Это естественное следствие оверлейности и использования принципа «smart edge — simple core».
  • Программируемость — приложения могут управлять сетью как системой через Contrail API.
  • NFV (виртуализация сетевых функций) aka service chains (цепочки сервисов) — очень важный аспект, позволяет прогонять трафик через заданные виртуализированные сетевые сервисы (виртуальный фаервол, кэш, и пр.). При этом абсолютно равноправны как VNF от Juniper (vSRX, vMX) так и любые продукты других вендоров.
  • Мощная аналитика и визуализация результатов, включая «Underlay Overlay Mapping» — это когда Contrail показывает вам, как трафик между виртуальными сетями идет «на самом деле» по физической сети.
  • Open Source — все исходные коды открыты, плюс для взаимодействия частей используются только стандартные протоколы. Сайт проекта — www.opencontrail.org.
  • Простая интеграция с существующими MPLS VPNs.

Вот картинка из Contrail Architecture whitepaper, показывающая как система устроена в целом:

Основы Juniper Contrail, и как его поставить себе в лабу - 2

На верхнем уровне работает инфраструктурный оркестратор — чаще всего это будет OpenStack (есть варианты интеграции Contrail с vCenter и Kubernetes). В нем сеть настраивается через высокоуровневые команды (Neutron API) — при этом детали реализации остаются заботой SDN-контроллера.

Сам SDN-контроллер состоит из четырех основных типов нодов:

  • Конфигурационные ноды — отвечают за предоставление REST API оркестратору и другим приложениям. «Компилирует» инструкции, приходящие «сверху», в конфигурации, применимые в конкретной сети на низком уровне.
  • Контрольные ноды — принимают конфигурацию от конфигурационных нодов и программируют vRouter-ы (см. далее) и физические роутеры.
  • Аналитика — ноды, собирающие статистику потоков, логи, и прочее.
  • База данных (не показана на картинке) — БД Cassandra, в которой хранится конфигурация и собранная аналитикой информация.

На одном физическом (или даже виртуальном) сервере может быть запущено несколько ролей, в лабе можно даже делать контроллер все-в-одном (плюс вычислительные ноды отдельно).

Теперь немного про форвардинг. Весь трафик между виртуальными машинами или контейнерами в системе бегает по туннелям, терминируемым на vRouter, физическом роутере или OVSDB-свиче (этот вариант я тут не рассматриваю). vRouter является софтверной компонентой (модуль ядра Linux по умолчанию, user space если используется DPDK), второй важной частью решения Contrail (первой является собственно контроллер). vRouter-ы устанавливаются и запускаются на вычислительных нодах кластера (Virtualized Server на картинке) — там же, где запускаются машины/контейнеры.

Еще раз, основной задачей vRouter-а является терминирование оверлейного туннеля. vRouter по функциям соответствует PE (provider edge) роутеру в MPLS VPN.

Какой бывает Contrail

Опции использования Contrail у нас следующие (при этом фичи и код везде одни и те же и различаются только опции поддержки):

  • OpenContrail — вариант, доступный бесплатно. Установка описана в Quick Start Guide.
  • Contrail Networking — коммерческий вариант, поддерживаемый Juniper TAC.
  • Contrail Cloud — опять же коммерческий вариант, причем включающий в себя как сам Contrail, так и Canonical/Ubuntu OpenStack — оба поддерживаемые Juniper TAC.

Кроме того, есть вариант с поддержкой OpenContrail от Mirantis.

Я в этой статье пойду по пути наименьшего сопротивления и покажу, как установить Contrail Cloud.

Установка Contrail Cloud

Ставить будем Contrail Cloud 3.2.0 — последнюю версию, на момент написания статьи. Для установки я использовал один ESXi 6.0 сервер с 4-ядерным hyper-threading CPU и 32GB RAM. Этого оказывается достаточно для тестов, даже с запасом (можно еще запустить пару vMX).

Схема виртуальной лаборатории будет выглядеть вот так:

image

Обратите внимание, что Compute-ноды (как и ноды контроллера) у нас в лабе виртуализированные, то есть виртуалки будут запускаться внутри других виртуалок. Следует пойти в настройки гипервизора и там поставить флажок у опции «Expose hardware assisted virtualization to the guest OS» для каждого Compute-нода. Как видно из testbed.py, первые два у нас собственно для виртуальных машин, и используют KVM, а третий — для контейнеров Docker.

Разворачиваем все 5 виртуалок с параметрами как указано на схеме. При этом для compute-нодов параметры на самом деле определяются тем, сколько и каких машин/контейнеров вы собираетесь запускать, а вот для контроллера параметры указаны близкие к минимально допустимым.

Ставим на все машины минимальную Ubuntu 14.04.4 (ubuntu-14.04.4-server-i386.iso). Строго эту версию, как указано в документации Contrail 3.2.0 — это очень важно! Иначе очень легко можно нарваться на несовместимость пакетов. И именно минимальную, по той же причине. Голый минимум плюс только OpenSSH Server. Почему-то многие люди серьезно не относятся к таким простым инструкциям и потом у них не работает :)

Далее прописываем адреса в /etc/network/interfaces, а в /etc/hosts задаем, чтобы не заморачиваться с DNS,

10.10.10.230 openstack
10.10.10.231 control
10.10.10.233 compute-1
10.10.10.234 compute-2
10.10.10.235 compute-3

Устанавливать Contrail будем с помощью Fabric-скриптов. Этот вариант для лабы наиболее простой, для продакшена есть еще Server Manager (с Puppet под капотом), но это как-нибудь в другой раз. Для Fabric нам понадобится разрешить root login для SSH, например так

echo -e "contrailncontrail" | sudo passwd root
sudo sed -i.bak 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config
sudo service ssh restart

Еще желательно включить ntp на всех нодах:

sudo apt-get install ntp

Далее, на первом ноде, копируем пакет contrail-install-packages_3.2.0.0-19-ubuntu-14-04mitaka_all.deb в /tmp и устанавливаем его:

dpkg -i /tmp/contrail-install-packages_3.2.0.0-19-ubuntu-14-04mitaka_all.deb 

Запускаем установочный скрипт:

cd /opt/contrail/contrail_packages
./setup.sh

Теперь важный момент. Нужно создать файл /opt/contrail/utils/fabfile/testbeds/testbed.py, который будет описывать наш кластер. Вот рабочий пример:

from fabric.api import env

# FOR LAB ONLY, DEFAULT IS 250
minimum_diskGB = 10

# MANAGEMENT USERNAME/IP ADDRESSES
host1 = 'root@10.10.10.230'
host2 = 'root@10.10.10.231'
host3 = 'root@10.10.10.233'
host4 = 'root@10.10.10.234'
host5 = 'root@10.10.10.235'

# EXTERNAL ROUTER DEFINITIONS
ext_routers = []

# AUTONOMOUS SYSTEM NUMBER
router_asn = 64512

# HOST FROM WHICH THE FAB COMMANDS ARE TRIGGERED
# TO INSTALL AND PROVISION
host_build = 'root@10.10.10.230'

# ROLE DEFINITIONS
env.roledefs = {
    'all': [host1, host2, host3, host4, host5],
    'cfgm': [host1],
    'openstack': [host1],
    'control': [host2],
    'compute': [host3, host4, host5],
    'collector': [host1],
    'webui': [host1],
    'database': [host1],
    'build': [host_build]
}

# DOCKER
env.hypervisor = {
    host5 : 'docker',
}

# NODE HOSTNAMES
env.hostnames = {
    'host1': ['openstack'],
    'host2': ['control'],
    'host3': ['compute-1'],
    'host4': ['compute-2'],
    'host5': ['compute-3'],
}

# OPENSTACK ADMIN PASSWORD
env.openstack_admin_password = 'contrail'

# NODE PASSWORDS
env.passwords = {
    host1: 'contrail',
    host2: 'contrail',
    host3: 'contrail',
    host4: 'contrail',
    host5: 'contrail',    
    host_build: 'contrail',
}

Значение разных разделов, думаю, должно быть понятно без дополнительных пояснений.

Еще всего несколько шагов. Установим пакеты на оставшиеся ноды:

cd /opt/contrail/utils/
fab install_pkg_all:/tmp/contrail-install-packages_3.2.0.0-19-ubuntu-14-04mitaka_all.deb

Поменяем ядро на рекомендуемое:

fab upgrade_kernel_all

(версия ядра изменится с 4.2.0-27-generic на 3.13.0-85-generic и ноды перезагрузятся).

Далее перезаходим на первый нод и:

cd /opt/contrail/utils/
fab install_contrail

И, наконец, последний шаг (самый длительный, занимает около часа в моем случае):

fab setup_all

В принципе, все. Но в таком виде при заданных параметрах виртуалок Contrail Cloud подтормаживает. Применим несколько трюков для его ускорения (использовать только для лабы):

echo 'export JAVA_OPTS="-Xms100m -Xmx500m"' > /etc/zookeeper/java.env

sed -i.bak 's/workers = 40/workers = 1/' /etc/nova/nova.conf

sed -i.bak 's/#MAX_HEAP_SIZE="4G"/MAX_HEAP_SIZE="1G"/' /etc/cassandra/cassandra-env.sh
sed -i.bak 's/#HEAP_NEWSIZE="800M"/HEAP_NEWSIZE="500M"/' /etc/cassandra/cassandra-env.sh

(после чего сервера надо перезагрузить).

Теперь можно зайти в веб-интерфейс. Openstack Horizon должен быть доступен на 10.10.10.230/horizon, а Contrail Web UI — на 10.10.10.230:8080. С нашими установками логин — admin, пароль — contrail.

image

Выводы

Надеюсь, что эта статья поможет заинтересованным людям начать разбираться и работать с Contrail 3.2. Полная документация по продукту есть на сайте Juniper. Некоторые примеры того, как дергать Contrail через API, я стараюсь собирать вот здесь.

Всем успехов в работе и хорошего настроения!

Автор: pk1

Источник

Поделиться

* - обязательные к заполнению поля