Неожиданно обнаружилось, что на Хабре нет практически никакой информации про Juniper Contrail (да-да, SDN) — и я решил своими силами восполнить упущение.
В этой статье хочу вкратце рассказать о том, что такое Contrail, в каких формах он доступен и как его поставить себе в лабу. Более конкретно, ставить будем Contrail Cloud 3.2.0.
Основы Contrail
Задача, которую решает Contrail — построение гибких и масштабируемых виртуальных сетей. Виртуальную сеть можно понимать как замену старым-добрым VLAN, в данном случае реализованную примерно как провайдерский L3VPN/EVPN. При этом с точки зрения подключенных клиентов все выглядит так, как будто все их виртуальные машины и физические сервера подключены через обычный коммутатор.
Проще всего описать Contrail как оверлейный SDN. Software-Defined Networking здесь понимается в смысле классического определения ONF — разделение forwarding plane и control plane, плюс централизация control plane в данном случае в Contrail-контроллере.
Слово «оверлейный» указывает на то, что есть на самом деле две сети:
- Физическая «фабрика», от которой требуется «только» обеспечить доступность по IP между подключенными физическими устройствами (серверами, роутерами-шлюзами), и
- Оверлей — сеть, составленная из туннелей, проложенных между серверами и роутерами-шлюзами. Туннели могут быть 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, показывающая как система устроена в целом:
На верхнем уровне работает инфраструктурный оркестратор — чаще всего это будет 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).
Схема виртуальной лаборатории будет выглядеть вот так:
Обратите внимание, что 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.
Выводы
Надеюсь, что эта статья поможет заинтересованным людям начать разбираться и работать с Contrail 3.2. Полная документация по продукту есть на сайте Juniper. Некоторые примеры того, как дергать Contrail через API, я стараюсь собирать вот здесь.
Всем успехов в работе и хорошего настроения!
Автор: pk1