Если вы уже переросли docker-compose, но ещё не доросли до Kubernetes, то Rancher станет хорошим выбором в качестве системы оркестрации контейнеров. Rancher поставляется в комплекте с функциональным web-ui и подойдёт в качестве оркестратора контейнеров для новичков. В его основе лежит собственный движок Cattle, который поддерживает с некоторыми ограничениями работу поверх Swarm, Kubernetes, Mesos.
В основе 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 onUDP
ports500
and4500
(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