Rancher на Centos 7.4 + iptables: установка и настройка

Если вы уже переросли docker-compose, но ещё не доросли до Kubernetes, то Rancher станет хорошим выбором в качестве системы оркестрации контейнеров. Rancher поставляется в комплекте с функциональным web-ui и подойдёт в качестве оркестратора контейнеров для новичков. В его основе лежит собственный движок Cattle, который поддерживает с некоторыми ограничениями работу поверх Swarm, Kubernetes, Mesos.

Rancher — простой, но функциональный оркестратор для docker-контейнеров

В основе Rancher лежат стэки, которые содержат внутри себя сервисы. Очень похоже на Swarm и docker-compose. Если вам нужно быстро запустить и посмотреть на оркестрацию в работе, то смело используйте Rancher. Но главное преимущество этого оркестратора в том, что его можно развернуть на одном сервере без танцев с бубнами.

Например, для установки Kubernetes на одном сервере потребовалось бы устанавливать VirtualBox, создавать несколько виртуальных машин и уже внутри них устанавливать docker и Кубернетис. Для продакшена такой вариант абсолютно не годится! Разве что для тестовых и девелоперских стендов. Если вам нужен самый простой веб-интерфейс для docker, обратите внимание на Portainer.

Отличия Rancher от Docker Swarm, Kubernetes и Mesos

Наиболее простой вариант для тех, кто уже знаком с docker-контейнерами это запустить Swarm и создавать сервисы из docker-compose файла. Зато в Rancher можно через веб-интерфейс сконфигурировать работу кластера серверов, что понравится тем, кто с докером ещё не знаком.

По-умолчанию Rancher использует Convoy для работы с дисками, который имеет поддержку Device Mapper, VFS\NFS и Amazon EBS, а также интеграцию с flocker. Ещё одно достоинством данной системы оркестрации — наличие предустановленных шаблонов приложений.

С помощью Rancher можно установить одним кликом мышки Redmine, Gitlab, Jenkins CI server, TeamCity, Zookeeper и Kafka от Apache, Confluence и Bitbucker от Atlassian, Datadog, Elasticsearch + Logstash + Kibana, Etcd, RethinkDB, Selenium и многое другое в готовых и настроенных докер-контейнерах!

Какой оркестратор выбрать для docker-контейнеров?

Если термин stateless про ваши приложения, то лучше смотреть в сторону Docker Swarm или Nomad. В Nomad хорошая и понятная документация, а также продуманный механизм для работы с гео-распределёнными серверами. Из плюсов Swarm — встроенные оверлейные сети и простое создание сервисов.

Kubernetes подойдёт как для stateless, так и statefull сервисов. А так же позволяет выполнять лямбды на мощностях вашего кластера. Высокий порог входа и запутанная документация — потребуют достаточно большого количества времени для начал использования кубера.

Если ваши приложения активно используют сеть, то сразу смотрите на Nomad или Apache Mesos. А если вы работаете с BigData, то скорее всего вы уже используете Mesos. Если в ваших сервисах много legacy и enterprise, которые требуют множества специфических окружений, то Mesos с его кастомизируемыми плагинами подойдёт лучше всего.

Подготовка к установке Rancher

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

docker -v

Если ваша версия не входит в список поддерживаемых, то придётся делать даунгрейд, например, на версию 17.12.0

yum downgrade docker-ce-17.12.0.ce

Если же docker ещё не установлен, то выполните команду:

yum install docker-ce-17.12.0.ce

Если вы используете container-selinux ниже версии 2.14

Действия из этого параграфа выполнять не обязательно, однако, если что-то не заработало, то стоит обратить на него внимание.

Проверить установленную версию можно с помощью команды:

rpm -q container-selinux

Если версия оказалась недостаточно свежей, то нужно выполнить ещё некоторые действия из этого руководства:

yum install selinux-policy-devel

Затем создайте файл с именем virtpatch.te и содержимым:

policy_module(virtpatch, 1.0)
gen_require(`
 type svirt_lxc_net_t;
')
allow svirt_lxc_net_t self:netlink_xfrm_socket create_netlink_socket_perms;

Затем выполните:

make -f /usr/share/selinux/devel/Makefile

Затем загрузите модуль:

semodule -i virtpatch.pp

И убедитесь что он присутствует в списке активных модулей:

semodule -l

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

Для начала нужно установить сервер Rancher, который поставляется в виде docker-контейнера. В него входит веб-интерфейс и движок Cattle.

docker run -d --restart=unless-stopped --name=rancher-server -p 8080:8080 rancher/server:stable

Процесс установки и запуска этого контейнера достаточно долгий и может занимать до 5 минут. За ходом установки можно следить с помощью команды:

docker logs --tail=20 -f rancher-server

Как только откроется веб-интерфейс, можно приступать к установке агента Rancher. Подробную инструкцию по работе с Rancher web-ui можно найти в этой статье. Осторожно, много букв и картинок! Если вкратце, то перейдите в меню Infrastrucnure 〉 Hosts, затем жмите кнопку Add Host. Выбираете тип Custom. Обратите внимание на пункт #2:

Make sure any security groups or firewalls allow traffic:
From and To all other hosts on UDP ports 500 and 4500 (for IPsec networking)

Если вы устанавливаете rancher-agent на том же сервере, что и rancher-server, то в пункте #4 нужно указать IP адрес вашего сервера.

Затем копируете и исполняете в консоли команду из пункта #5, например:

docker run -e CATTLE_AGENT_IP="1.2.3.4" --rm --privileged -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/rancher:/var/lib/rancher rancher/agent:v1.2.9 http://1.2.3.4:8080/v1/scripts/C21EC123D3479B2419F:1546718400000:V7ikAXHL0PvnanKYtIl3XwOh1Wg

Вы увидите похожее сообщение:

INFO: Running Agent Registration Process, CATTLE_URL=http://1.2.3.4:8080/v1
INFO: Attempting to connect to: http://1.2.3.4:8080/v1
INFO: http://1.2.3.4:8080/v1 is accessible
INFO: Inspecting host capabilities
INFO: Boot2Docker: false
INFO: Host writable: true
INFO: Token: xxxxxxxx
INFO: Running registration
INFO: Printing Environment
INFO: ENV: CATTLE_ACCESS_KEY=BBDC1943DC174062CBAE
INFO: ENV: CATTLE_AGENT_IP=1.2.3.4
INFO: ENV: CATTLE_HOME=/var/lib/cattle
INFO: ENV: CATTLE_REGISTRATION_ACCESS_KEY=registrationToken
INFO: ENV: CATTLE_REGISTRATION_SECRET_KEY=xxxxxxx
INFO: ENV: CATTLE_SECRET_KEY=xxxxxxx
INFO: ENV: CATTLE_URL=http://1.2.3.4:8080/v1
INFO: ENV: DETECTED_CATTLE_AGENT_IP=172.17.0.1
INFO: ENV: RANCHER_AGENT_IMAGE=rancher/agent:v1.2.9
INFO: Deleting container rancher-agent
INFO: Launched Rancher Agent: 853bf010f823913387b6428caca265c99eb5ed439d5d1efe53f7b4837ec9f11c

После чего в веб-интерфейсе Rancher должен появиться Сервер. Если же этого не произошло в течении минуты, вероятно вы используете container-selinux ниже версии 2.14, смотрите один из предыдущих параграфов. Либо не сделали указание из пункта #4 при добавлении сервера.

Посмотрите логи rancher агента и сервера с помощью команд:

docker logs --tail=200 -f rancher-agent
docker logs --tail=200 -f rancher-server

Например, могут быть такие ошибки:

2018-03-05 17:28:46,890 ERROR [62db6f98-ca40-4745-9b54-9c0423819de1:210] [agent:1] [agent.activate->(MetadataProcessHandler)] [] [ecutorService-1] [i.c.p.p.m.MetadataProcessHandler ] Failed to find account id for registeredAgent:1
2018-03-05 17:29:12,296 ERROR [:] [] [] [] [TaskScheduler-1] [i.c.p.a.s.ping.impl.PingMonitorImpl ] Failed to get ping from agent [1] count [3]
2018-03-05 17:29:27,302 ERROR [:] [] [] [] [TaskScheduler-1] [i.c.p.a.s.ping.impl.PingMonitorImpl ] Scheduling reconnect for [1]

Настройка iptables на CentOs для работы Rancher и Docker

Вероятной проблемой может быть блокировка соединений в фаерволле или в iptables. Если есть возможность, попробуйте их отключить. Если же такой возможности нет, то посмотрите лог фаервола какие именно соединения были заблокированы и добавьте исключения для Rancher.

Для iptables логгирование reject соединений можно настроить так:

iptables -A INPUT -j LOG --log-prefix "iptables blocked input: "
iptables -A OUTPUT -j LOG --log-prefix "iptables blocked output : "

А затем посмотреть сообщения из журнала:

tail -F /var/log/messages | grep 'iptables blocked'

Проанализировав лог, нужно сформировать и добавить правила. При необходимости повторить. Если же вашей квалификации для этого не достаточно, попробуйте примерно такие правила:

iptables -A OUTPUT -p tcp -j ACCEPT
iptables -A INPUT -p tcp -j ACCEPT

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

iptables -L --line-numbers
Chain INPUT (policy DROP)
num target prot opt source destination
1 ACCEPT all -- anywhere anywhere
2 ACCEPT udp -- anywhere anywhere udp dpt:isakmp
3 ACCEPT udp -- anywhere anywhere udp dpt:ipsec-nat-t
4 ACCEPT tcp -- anywhere anywhere tcp dpt:ipsec-nat-t
5 ACCEPT all -- anywhere anywhere
6 ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
7 ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
8 ACCEPT icmp -- anywhere anywhere
9 ACCEPT tcp -- anywhere anywhere tcp dpt:intermapper
10 ACCEPT all -- 172.17.0.0/16 anywhere
11 ACCEPT all -- 10.0.0.0/8 anywhere
12 LOG all -- anywhere anywhere LOG level warning prefix "iptables blocked input: "
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- anywhere anywhere state NEW,RELATED,ESTABLISHED
2 LOG all -- anywhere anywhere LOG level warning prefix "iptables blocked output: "
3 ACCEPT tcp -- anywhere anywhere tcp dpt:webcache
4 ACCEPT tcp -- anywhere anywhere

И удалить правила со значением LOG в колонке target, в моём случае это:

iptables -D OUTPUT 2
iptables -D INPUT 12
Опубликовано
В рубрике Docker