Установка и настройка кластера DC/OS 1.11 в CentOS 7

Ранее мы уже писали о DC/OS – унифицированной распределённой платформе для оркестрации приложений. Она позволяет за минуты развернуть из каталога готовых решений (DC/OS Universe) такие системы как Apache Spark, Apache Kafka, Apache Cassandra, HDFS, Elasticsearch, NGINX, OpenVPN и другие. Ключевым элементом системы является кластерный менеджер Mesos. В качестве фреймворка для оркестрации поставляется Marathon. После того, как система стала доступной как open-source, интерес к ней значительно возрос.

В статье мы рассмотрим процедуру установки и настройки кластера DC/OS 1.11 (Open Source Edition) в операционной системе CentOS 7. Познакомимся с системными требованиями к аппаратному и программному обеспечению для развертывания кластера, требованиями и рекомендациями по установке Docker в CentOS 7.

Содержание данной статьи включает в себя следующие разделы:

  • общие системные требования к аппаратному и программному обеспечению;
  • установка Docker в CentOS;
  • эксплуатационная установка кластера DC/OS.

Общие системные требования к аппаратному и программному обеспечению

Требования к аппаратному обеспечению

Требования к аппаратному обеспечению включают в себя наличие одного узла bootstrap и узлов кластера: master узлов и узлов-агентов.

Узел Bootstrap

Установка DC/OS производится на узле bootstrap со следующими характеристиками – два ядра, 16 GB RAM и 60 GB HDD. Узел bootstrap используется только в процессе установки и обновления кластера, поэтому особых рекомендаций к высокопроизводительной системе хранения или отдельным точкам монтирования нет.

Узел bootstrap не должен быть одним из узлов кластера.

Узлы кластера

Узлами кластера являются узлы ролей master, slave и slave_public. На странице официальной документации можно узнать, какие ОС и среды поддерживаются для развертывания на них кластера DC/OS. В этой статье мы будем выполнять установку в ОС CentOS 7 – рекомендуемую среду для DC/OS.

DC/OS устанавливается на кластерных узлах в каталог /opt/mesosphere. Важно, чтобы это был пустой каталог или он являлся ссылкой на пустой каталог. DC/OS можно установить на отдельном томе, создав на нем пустой каталог, затем создав ссылку с именем /opt/mesosphere на этот пустой каталог, после чего установив DC/OS.

Узлы Master

В таблице ниже представлены требования к аппаратному обеспечению узлов master:

|                        |Минимальные     |Рекомендуемые    |
|------------------------|----------------|-----------------|
|Узлы                    |1               |3, 5             |
|Процессор               |4 ядра          |4 ядра           |
|Память                  |32 GB RAM       |32 GB RAM        |
|Жесткий диск            |120 GB          |120 GB           |

Если Вы планируете обеспечить отказоустойчивость, требуется 3, 5 узлов роли master. Больше информации о требованиях по обеспечению высокой доступности можно найти в официальной документации.

Если Вы устанавливаете DC/OS для тестов и не для продуктовой среды, экспериментально проверено, что master можно нормально запустить на узле с 2 ядрами, 8 GB RAM и 32 GB дискового пространства. В этой статье же приведены рекомендуемые поставщиком параметры.

На узлах master выполняются управляющие службы. Некоторые из которых могут генерировать большое количество операций ввода-вывода. Для оптимальной производительности рекомендуется использовать накопители SSD.

Пример. Такой сервис как Zookeeper никогда не должен эксплуатироваться в перегруженной среде, поскольку это будет приводить к нестабильной работы системы распределенных блокировок, а значит и зависимых приложений, например, Apache Kafka.

Данные сервисов, которым требуются высокопроизводительные дисковые устройства, размещаются в каталоге /var/lib/dcos. Рассмотрите вариант выноса этого каталога на отдельные высокопроизводительные устройства.

Для кластера, который будет состоять из тысяч узлов, возможно дальнейшее дробление данного каталога на подкаталоги на отдельных устройствах:

|Путь каталога                |Описание    
|-----------------------------|---------------------------------
|/var/lib/dcos/mesos/master   |каталоги логов
|/var/lib/dcos/navstar        |используется для базы данных Mnesia 
|/var/lib/dcos/exhibitor      |база данных Zookeeper

Впрочем, если вы используете современные SSD накопители, которые обеспечивают до 500К IOPS, не стоит заниматься лишней сверхоптимизацией.

Узлы-агенты

В таблице ниже представлены требования к аппаратному обеспечению узлов slave, slave_public:

|                        |Минимальные     |Рекомендуемые    |
|------------------------|----------------|-----------------|
|Узлы                    |1               |6 и более        |      
|Процессор               |2 ядра          |2 ядра           |
|Память                  |16 GB RAM       |16 GB RAM        |
|Жесткий диск            |60 GB           |60 GB            |

С практической точки зрения лучше использовать меньше “толстых” узлов, чем больше “мелких”. Это обусловлено тем фактом, что, при использовании множества небольших узлов, значительная доля ядер CPU будет зарезервирована DC/OS для обеспечения работоспособности системных сервисов, так на каждый узел около 0.6 ядра резервируется для системных задач и недоступно для пользовательских приложений.

На узлах-агентах в каталоге /var должно быть доступно от 20 GB свободного пространства. Данный каталог используется в качестве песочницы для запуска контейнеров Docker и стандартных приложений DC/OS. Для использования стандартных приложений DC/OS должен быть доступен публичный репозиторий Docker.

Необходимо остановить и отключить firewalld:

sudo systemctl stop firewalld && \
sudo systemctl disable firewalld

Необходимость отключения firewalld связана с известной проблемой взаимодействия firewalld с Docker в CentOS 7. Подробнее смотрите официальную документацию Docker CentOS;

Информация о состоянии кластера хранится в каталоге /var/lib/mesos, не рекомендуется подключать данный каталог и каталог хранения данных Docker (по умолчанию /var/lib/docker) с удаленного сервера. Не монтируйте каталог /tmp с флагом noexec, т.к. это мешает корректной работе сервисов Exhibitor и ZooKeeper.

Если планируется развертывание кластера с множеством узлов, или частые запуски/остановки/удаления задач, рекомендуется перенести каталог /var/lib/mesos на отдельный SSD накопитель.

Требования к настройке портов и протоколов

С точки зрения сетевой доступности необходимо обеспечить:

  • SSH доступ ко всем узлам;
  • ICMP по-умолчанию на всех узлах;
  • сетевой доступ без ограничений с каждого узла к узлу bootstrap;
  • свободное соединение без ограничений каждого узла со всеми узлами кластера;
  • открытый порт UDP/53 для входящих соединений на узлах master – сервис dcos-mesos-slave, развернутый на узлах-агентах, использует этот порт, чтобы найти сервис leader.mesos.

Приведенные выше рекомендации – рекомендации поставщика DC/OS. Мы успешно устанавливали DC/OS в средах с большим количеством ограничений, в которых не были доступны даже базовые публичные услуги, такие как NTP, DNS. При формулировании данных рекомендаций поставщик исходит из идеи, что вариаций среды слишком много, чтобы заниматься анализом того, почему система не установилась, поэтому вводятся ограничения среды, которые исключают влияние сторонних факторов.

Доступ к высокоскоростному интернету

Для работы DC/OS рекомендуется наличие доступа к высокоскоростному интернету. Для сервисов DC/OS необходима минимальная скорость 10 MBit в сек. Установка некоторых сервисов DC/OS будет завершаться с ошибкой, если время загрузки артефакта превышает значение параметра MESOS_EXECUTOR_REGISTRATION_TIMEOUT, который задается в файле /opt/mesosphere/etc/mesos-slave-common. По умолчанию данный параметр установлен в 10 минут.

Сам установочный архив DC/OS занимает более 800 MB, соответственно на его скачивание по каналу 10 MBit/s уйдет не менее 800 минут, что весьма долго. Рекомендуем иметь канал 100 Mbit/s и шире, если вы будете использовать DC/OS для разработки и будете производить частое развертывание. Такой большой размер установочного архива обуславливается тем, что он содержит все компоненты DC/OS и не требует подключения к интернет для установки компонентов DC/OS.

Установка базовых зависимостей программного обеспечения

Для установки в CentOS 7 необходимых базовых зависимостей, можно использовать скрипт install_prereqs.sh, приведенный в официальной документации. Далее будет описана установка всех компонентов вручную.

Для синхронизации времени на всех узлах необходимо настроить синхронизацию времени по протоколу NTP. Если время на узлах, не синхронизировано, то в процессе установки DC/OS возникнет ошибка.

Установка ПО на узле Bootstrap

Скачайте и сохраните SHAR-архив dcos_generate_config. Данный файл содержит все упакованные компоненты DC/OS, необходимые для установки, и занимает много места (800MB+):

curl -fsSL https://downloads.dcos.io/dcos/stable/dcos_generate_config.sh

Скачайте Docker-образ Nginx:

docker pull nginx

Установка ПО на узлах кластера

На всех узлах кластера необходимо выполнить все действия, описанные в данном разделе.

Базовые утилиты. Установите на узлы кластера необходимые утилиты:

yum install -y tar xz unzip curl ipset

Добавление групп и изменение политики безопасности SELinux. На каждом узле кластера выполните следующие команды:

sed -i s/SELINUX=enforcing/SELINUX=permissive/g /etc/selinux/config && \
groupadd nogroup && \
groupadd docker && \
reboot

Локализация. Установите для переменных окружения LC_ALL и LANG значение en_US.utf-8:

localectl set-locale LANG=en_US.utf8

Установка Docker

Остановимся подробнее на особенностях установки Docker в CentOS 7:

  • Управление сервисом Docker в CentOS осуществляется через systemd.
  • Для установки Docker в CentOS 7 используйте репозиторий yum.
  • Используйте драйвер хранилища OverlayFS. OverlayFS позволяет обойти известные проблемы, а также позволяет контейнерам использовать docker-in-docker, если это необходимо.
  • Используйте СentOS версии 7.2 и выше. В версии 7.2 улучшили поддержку OverlayFS и исправили ошибку с XFS.
  • В качестве файловой системы используйте XFS с опцией ftype=1. Для CentOS 7.2 “только XFS может использоваться в качестве файловой системы Docker самого нижнего уровня”.

Создать файловую систему с флагом ftype=1 можно с помощью следующей команды:

mkfs -t xfs -n ftype=1 /dev/sdc1

1. Обновите CentOS 7 до последней версии:

sudo yum upgrade --assumeyes --tolerant
sudo yum update --assumeyes

2. Убедитесь, что версия ядра Linux не ниже 3.10:

uname -r
3.10.0-327.10.1.el7.x86_64

3. Подключите OverlayFS:

sudo tee /etc/modules-load.d/overlay.conf <<-'EOF'
overlay
EOF

4. Активируйте модуль ядра и убедитесь, что он подключен:

cat /etc/modules-load.d/overlay.conf | xargs modprobe
lsmod | grep overlay

5. Добавьте в систему репозиторий Docker:

sudo tee /etc/yum.repos.d/docker.repo <<-'EOF'
[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=https://download.docker.com/linux/centos/7/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
EOF

7. Создайте элемент systemd для запуска Docker с поддержкой OverlayFS:

sudo mkdir -p /etc/systemd/system/docker.service.d && sudo tee /etc/systemd/system/docker.service.d/override.conf <<- EOF
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd --storage-driver=overlay
EOF

8. Установите Docker, запустите и включите его для автоматического запуска:

sudo yum install -y docker-engine-1.13.1 docker-engine-selinux-1.13.1
sudo systemctl start docker
sudo systemctl enable docker

Хотим обратить внимание, что для корректной работы DC/OS 1.11 в CentOS 7 рекомендуется устанавливать именно эту версию Docker (1.13.1).

После окончания установки появится следующее сообщение:

Complete!
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.

9. Убедитесь, что Docker успешно запущен:

sudo docker ps

Установка кластера DC/OS

Теперь подробно рассмотрим процесс установки кластера DC/OS. Нам понадобятся 4 узла – bootstrap, узел master, публичный и частный узлы-агенты. Больше информации о типах узлов кластера представлено в официальной документации.

Представленный сценарий используется для установки готового к эксплуатации кластера DC/OS Open Source с возможностью последующего обновления. Данный метод позволяет упаковать дистрибутив DC/OS и выполнить установку каждого дополнительного узла вручную с помощью запуска установочных команд.

Процесс установки включает в себя следующие шаги:

  • Настройка узла bootstrap,
  • Установка DC/OS на master-узле,
  • Установка DC/OS на узле-агенте.

Для данного сценария установки необходимо, чтобы узел bootstrap был доступен по сети с узлов кластера по протоколу HTTP, HTTPS.

В процессе установки DC/OS на узлах создаются следующие каталоги:

Каталог Описание
/opt/mesosphere Cодержит бинарные файлы DC/OS, библиотеки и конфигурации кластера. Не должен редактироваться после установки.
/etc/systemd/system/dcos.target.wants Содержит сервисы systemd, которые запускают компоненты systemd. Они должны располагаться вне папки /opt/mesosphere из-за ограничений systemd.
/etc/systemd/system/dcos. Содержит копии unit-файлов из /etc/systemd/system/dcos.target.wants. Они должны располагаться в верхнеуровневой папке в dcos.target.wants.
/var/lib/dcos/exhibitor/zookeeper Содержит данные Zookeeper
/var/lib/docker Содержит данные Docker
/var/lib/dcos Содержит данные DC/OS
/var/lib/mesos Содержит данные Mesos

Внесение изменений вручную в /opt/mesosphere не поддерживается, т.к. это может привести к непредсказуемому поведению кластера DC/OS и невозможности обновления системы.

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

Перед установкой DC/OS убедитесь, что ваш кластер отвечает требованиям к аппаратному и программному обеспечению.

Конфигурирование кластера

Создайте каталог с именем genconf на узле bootstrap и перейдите в него.

mkdir -p genconf && cd genconf

Создание сценария для определения IP

На этом шаге мы создадим сценарий для определения IP, который будет позволять каждому узлу кластера узнать, с каким IP-адресом он должен присоединяться к кластеру.

Примечание:

  • IP-адрес узла не должен меняться после установки DC/OS на узле, например, при переустановке узла или при обновлении DHCP; при изменении IP-адреса узел необходимо удалить и установить повторно;
  • сценарий должен возвращать тот же IP-адрес, что указан для узла в config.yaml. Например, при запуске сценария на узле master, для которого в config.yaml указан IP-адрес 10.2.30.4, он должен возвращать именно это значение.

Создайте сценарий для определения IP-адреса для вашего окружения и сохраните его в genconf/ip-detect. Этот сценарий должен использовать кодировку UTF-8 и содержать корректный путь к интерпретатору (#!). Далее приводятся сценарии для окружений AWS, GCE и для неуправляемых сетей.

AWS с использованием сервера метаданных

Данный метод позволяет получить IP-адрес, используя AWS Metadata Server:

#!/bin/sh
# Example ip-detect script using an external authority
# Uses the AWS Metadata Service to get the node's internal
# ipv4 address
curl -fsSL http://169.254.169.254/latest/meta-data/local-ipv4

GCE с использование сервера метаданных

Данный метод позволяет получить IP-адрес, используя GCE Metadata Server:

#!/bin/sh
# Example ip-detect script using an external authority
# Uses the GCE metadata server to get the node's internal
# ipv4 address

curl -fsSl -H "Metadata-Flavor: Google" http://169.254.169.254/computeMetadata/v1/instance/network-interfaces/0/ip

Неуправляемая сеть: использование IP адреса существующего интерфейса

Данный метод определяет IP-адрес для конкретного сетевого интерфейса узла. Если вы используете разные поколения “железа”, имена интерфейсов на разных хостах могут отличаться. Сценарий определения IP-адреса должен учитывать изменения имени интерфейса.

Пример возможного сценария ip-detect:

#!/usr/bin/env bash
set -o nounset -o errexit
export PATH=/usr/sbin:/usr/bin:$PATH
echo $(ip addr show eth0 | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | head -1)

Неуправляемая сеть: использование IP адреса шлюза по умолчанию

Данный метод определяет IP-адрес, соответствующий тому интерфейсу, который находится в сети шлюза по умолчанию (11.22.33.44):

#!/usr/bin/env bash
set -o nounset -o errexit -o pipefail
export PATH=/sbin:/usr/sbin:/bin:/usr/bin:$PATH
MASTER_IP=${MASTER_IP:-11.22.33.44}
INTERFACE_IP=$(ip r g ${MASTER_IP} | awk -v master_ip=${MASTER_IP} '
BEGIN { ec = 1 }
{
  if($1 == master_ip) {
    print $5
    ec = 0
  } else if($1 == "local") {
    print $6
    ec = 0
  }
  if (ec == 0) exit;
}
END { exit ec }
')

echo $INTERFACE_IP

Создание файла конфигурации

На данном шаге мы создадим файл YAML конфигурации для нашего окружения. DC/OS использует данный конфигурационный файл для генерации файлов установки кластера.

Используя шаблон, создайте файл конфигурации и сохраните его как genconf/config.yaml. В официальной документации можно найти подробную информацию о параметрах и примерах настроек.

В данном шаблоне для Open Source определяются три узла Mesos master, три экземпляра Zookeeper для Exhibitor, список IP-адресов узлов master для статического метода обнаружения master-узлов, тип хранилища Exhibitor, используемый proxy и разрешенный IP-адрес DNS.

bootstrap_url: http://<bootstrap_ip>:80
cluster_name: <cluster-name>
master_discovery: static
exhibitor_storage_backend: static
ip_detect_path: genconf/ip-detect
ip_detect_public_filename: genconf/ip-detect
master_discovery: static
master_list:
- <master-private-ip-1>
- <master-private-ip-2>
- <master-private-ip-3>
resolvers:
- 8.8.8.8
- 8.8.4.4
telemetry_enabled: false
oauth_enabled: false
platform: onprem

Установка DC/OS

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

Прежде, чем перейти к установке DC/OS, убедитесь, что сценарий определения IP адреса, службы DNS и NTP работают корректно. См. подробнее в официальной документации.

Процесс установки

Когда все предварительные условия выполнены, можно перейти к установке:

1. С узла bootstrap запустите сценарий установки DC/OS для создания файла сборки DC/OS. Файлы сборки создаются в каталоге ./genconf/serve/.

Для просмотра всех команд сценария автоматической установки используйте флаг dcos_generate_config.sh --help.

sudo bash dcos_generate_config.sh    

После выполнения данной команды структура каталога должна выглядеть как показано ниже:

    ├── dcos-genconf.<HASH>.tar
    ├── dcos_generate_config.sh
    ├── genconf
    │   ├── config.yaml
    │   ├── ip-detect

2. Запустите следующую команду из домашнего каталога, чтобы опубликовать установочные файлы DC/OS в Nginx:

sudo docker run -d -p <port>:80 -v $PWD/genconf/serve:/usr/share/nginx/html:ro nginx

3. На каждом узле master последовательно запустите следующие команды:

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

mkdir /tmp/dcos && cd /tmp/dcos

Скачайте файл установки DC/OS:

curl -O http://<bootstrap-ip>:<port>/dcos_install.sh

Установите DC/OS на узлах master: sudo bash dcos_install.sh master

DC/OS может показывать сообщения об ошибках, пока все узлы master не будут настроены.

4. На каждом узле-агенте последовательно запустите следующие команды:

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

mkdir /tmp/dcos && cd /tmp/dcos

Скачайте файл установки DC/OS:

curl -O http://<bootstrap-ip>:<port>/dcos_install.sh

Установите DC/OS на узлах-агентах:

  • Команда для приватных узлов-агентов: sudo bash dcos_install.sh slave
  • Команда для публичных узлов-агентов: sudo bash dcos_install.sh slave_public

При возникновении ошибок типа “Time is marked as bad”, “adjtimex” или “Time not in sync” в journald убедитесь, что на всех узлах включен NTP. Подробнее см. раздел.

5. Отслеживать установку можно через Exhibitor на странице http://<ip-узла-master>:8181/exhibitor/v1/ui/index.html. Весь процесс может занять до 10 минут. В интерфейсе Exhibitor можно наблюдать подключенность узлов master (они отмечены зеленой иконкой).

6. Запустите веб-интерфейс DC/OS по адресу http://<публичный-ip-узла-master>/.

Готово! Перед вами появится информационная панель UI.

Заключение

Мы рассмотрели процедуру установки и настройки кластера DC/OS 1.11 (Open Source Edition) в CentOS 7. Информация, которая послужила основой для данной статьи, взята из официальной документации DC/OS, которая является подробной и отлично подходит для детального изучения.

Для практического многократного развертывания DC/OS на GitHub есть IaS-пакеты для автоматизированного развертывания, например, для Ansible. После ознакомления с ручной установкой используйте их, поскольку при ошибке развертывания, документация DC/OS рекомендует выполнить чистую переустановку кластера перед попыткой повторной установкой. Автоматизированные сценарии защищают от человеческих ошибок и позволяют выполнить установку с предсказуемым результатом.

Если вам понравился этот пост, поделитесь им с друзьями.