Как использовать шаблон Ambassador для динамической настройки служб на CoreOS

Вступление

Функция Docker Links включает метод динамической настройки сетевых соединений между контейнерами, известный как amb Ambassador pattern. Шаблон посла способствует переносимости сервиса между контейнерами provider и consumer. В CoreOS можно использовать + etcd + для реализации шаблона послов, распределенного по нескольким машинам в кластере.

В этом руководстве мы продемонстрируем развертывание HTTP-контейнера Apache, зарегистрированного с помощью + etcd +. Контейнер Apache будет представлять контейнер нашего провайдера, и мы будем использовать HAProxy в качестве нашего потребительского контейнера. Мы будем использовать образы Docker из this CoreOS посол демо для наших посольских контейнеров, и мы создадим наши собственные Apache и HAProxy Docker изображения с нуля.

Предпосылки

У вас должен быть кластер CoreOS на DigitalOcean, который состоит как минимум из трех машин. Вот учебник о том, как это настроить: How To Create и запустить службу в кластере CoreOS

Вы должны иметь базовые знания по использованию CoreOS, etcdctl, fleetctl, настройке служб и запуску контейнеров Docker. Эти темы описаны в Getting Started with CoreOS обучающей серии.

У вас должна быть учетная запись Docker Hub или личный реестр Docker. Это описано в Creating раздел Docker Container Как создать и запустить службу в учебнике CoreOS Cluster.

Для получения полной информации о том, как работает шаблон послов, ознакомьтесь со статьей Link via Ambassador Container из Docker. Также ознакомьтесь с этой статьей, размещенной в блоге CoreOS: Dynamic Docker ссылки с послом, работающим на etcd.

Наша цель

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

Машина А

На машине A будет запущен контейнер провайдера, т.е. Веб-сервер Apache и пара других контейнеров, которые будут его поддерживать.

  • * Веб-сервер Apache *: основной контейнер Apache, который мы создадим с нуля, аналогичный описанному в https://www.digitalocean.com/community/tutorials/how-to-create-and-run-a- Учебное пособие по созданию и запуску службы в кластере CoreOS. Это наш producer

  • * polvi / docker-register *: registration контейнер, который будет считывать IP-адрес и порт Apache через Docker API и записывать его в + etcd +

  • * polvi / simple-amb *: простой контейнер-посол, который будет перенаправлять трафик в указанное место. В этом случае мы перенаправим трафик в + etcd + и свяжем его с контейнером + docker-register +, чтобы предоставить этому контейнеру доступ к + etcd +. В CoreOS, поскольку расположение + etcd + статично, это можно было бы удалить, если + docker-register + был изменен для прямого доступа к + etcd +

Машина Б

Машина B - это машина CoreOS, которая будет запускать потребительский контейнер, т.е. HAProxy, и главный посол контейнер.

  • * HAProxy Reverse Proxy *: Базовый контейнер HAProxy, который мы создадим с нуля, который будет представлять нашего consumer. Это будет использоваться, чтобы продемонстрировать, что установка послов работает

  • * polvi / dynamic-etcd-amb *: Основной контейнер для посла. Динамический прокси, который отслеживает указанный ключ + etcd + для IP-адреса и порта контейнера провайдера и направляет весь трафик в контейнер провайдера. Значение ключа можно обновить, а прокси обновится сам

  • * polvi / simple-amb *: тот же контейнер, который использовался на другом компьютере, но использовался для связывания + dynamic-etcd-amb + с + etcd +

Создать образ Apache Docker

SSH к одному из ваших компьютеров с CoreOS и передайте агента SSH (замените его на общедоступный IP-адрес):

ssh -A core@

Затем войдите в Docker:

docker login

Введите ваш, пароль и адрес электронной почты, когда будет предложено.

Затем создайте новый каталог для записи вашего файла Apache Dockerfile в:

mkdir -p ambassador/apache

Теперь перейдите в каталог и откройте + Dockerfile + для редактирования:

cd ambassador/apache
vi Dockerfile

Основано на настройке контейнера Apache от https://www.digitalocean.com/community/tutorials/how-to-create-and-run-a-service-on-a-coreos-cluster#creating-the-docker-container [Как создать и запустить службу в кластере CoreOS], мы можем создать следующий Dockerfile (замените + user_name + своим собственным именем пользователя Docker):

FROM ubuntu:14.04
MAINTAINER

RUN apt-get update && \
   DEBIAN_FRONTEND=noninteractive apt-get -y install apache2 && \
   echo "<h1>Running from Docker on CoreOS</h1>" > /var/www/html/index.html

EXPOSE 80

ENTRYPOINT ["/usr/sbin/apache2ctl"]
CMD ["-D", "FOREGROUND"]

Сохранить и выйти.

Теперь, когда у нас есть Dockerfile, который устанавливает Apache и заменяет index.html базовым сообщением, создайте свой образ Docker и назовите его «apache» с помощью следующей команды (подставьте свое собственное имя пользователя):

docker build --tag="/apache" .

Теперь, чтобы сделать образ доступным для других компьютеров с CoreOS, + push + его в реестр Docker с помощью следующей команды:

docker push /apache

Теперь ваш образ Apache готов к использованию. Давайте перейдем к созданию образа HAProxy.

Создать образ HAProxy Docker

Мы создадим образ HAProxy Docker на основе HAproxy Dockerfile для надежных автоматических сборок Docker. Мы немного изменим предоставленные файлы + haproxy.cfg + и + start.bash +.

В каталоге + ambassador + используйте + git + для клонирования репозитория HAProxy:

cd ~/ambassador
git clone https://github.com/dockerfile/haproxy.git

Это создаст каталог + haproxy + с файлами + Dockerfile +, + haproxy.cfg + и + start.bash +.

Dockerfile в основном устанавливает HAProxy и предоставляет порты 80 и 443, поэтому мы можем оставить все как есть.

Мы изменим файл + haproxy.cfg + для добавления + frontend + и + backend +. Откройте + haproxy.cfg + для редактирования:

cd haproxy
vi haproxy.cfg

Теперь найдите и удалите следующие строки:

listen stats :80
 stats enable
 stats uri /

Затем добавьте следующие строки в конец файла:

frontend www-http
       bind :80
       default_backend www-backend

backend www-backend
       server apache :80 check

Это настраивает HAProxy для прослушивания порта 80 и пересылки входящего трафика на + www-backend, который состоит из одного сервера. Мы будем использовать скрипт + start.bash для замены` + private_ipv4 + `частным IP-адресом машины CoreOS, на которой будет работать этот контейнер, при запуске контейнера HAProxy. Наш динамический контейнер-посол, через который HAProxy будет пересылать трафик в контейнер Apache, будет работать на той же машине.

Откройте файл + start.bash + для редактирования:

vi start.bash

Внизу файла вы найдете строку, которая запустит процесс HAProxy в этом контейнере. Это выглядит так:

haproxy -f /etc/haproxy/haproxy.cfg -p "$PIDFILE"

Непосредственно над этой строкой вставьте следующие строки:

# Set backend IP address to machine's private IP address
PRIVATE_IPV4=$(curl -sw "\n" http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address)
sed -i -e "s/server apache private_ipv4:80 check/server apache ${PRIVATE_IPV4}:80 check/g" $HAPROXY/$CONFIG

Сохранить и выйти. Команда + curl + извлечет частный IP-адрес компьютера, на котором будет работать контейнер, через службу метаданных DigitalOcean. Команда + sed + заменяет строку + private_ipv4 + в + haproxy.cfg + фактическим IP-адресом, полученным из метаданных. Этот скрипт запускается из контейнера HAProxy, поэтому частный IP-адрес будет настроен во время выполнения.

Теперь мы готовы создать образ докера HAProxy. Создайте свой образ Docker и назовите его «haproxy» с помощью следующей команды (подставьте свое имя пользователя):

docker build --tag="/haproxy" .

Теперь, чтобы сделать образ доступным для других компьютеров с CoreOS, + push + его в реестр Docker с помощью следующей команды:

docker push /haproxy

Ваше изображение HAProxy готово к использованию. Мы готовы написать файлы нашего сервисного подразделения!

Файлы сервисного подразделения флота

Теперь, когда все необходимые образы Docker доступны для нашего кластера CoreOS, давайте приступим к работе с файлами, необходимыми для развертывания наших контейнеров. Поскольку мы используем кластер CoreOS, мы можем создавать и планировать все файлы нашего сервисного подразделения флота с одного компьютера с CoreOS.

Мы создадим все служебные файлы в каталоге + ~ / ambassador +, который мы создали ранее, поэтому перейдем в этот каталог сейчас:

cd ~/ambassador

apache.service

Модуль + apache.service + будет работать на Host A.

Первый файл службы, который мы создадим, предназначен для контейнера веб-сервера Apache, + user_name / apache +. Откройте файл с именем + apache.service + для редактирования:

vi apache.service

Добавьте следующие строки (замените ваше имя пользователя Docker в обоих местах):

[Unit]
Description=Apache web server service

[Service]
EnvironmentFile=/etc/environment
ExecStartPre=-/usr/bin/docker kill %n
ExecStartPre=-/usr/bin/docker rm %n
ExecStartPre=/usr/bin/docker pull /apache
ExecStart=/usr/bin/docker run --rm --name %n -p ${COREOS_PRIVATE_IPV4}::80 /apache
ExecStop=/usr/bin/docker stop -t 3 %n
Сохранить и выйти. Это довольно простой сервисный файл, который запускает Apache в режиме переднего плана. Особо следует отметить, что мы связываем порт 80 внутри контейнера с динамическим портом в интерфейсе частной сети (`+ -p $ {COREOS_PRIVATE_IPV4}

80 +`).

etcd-AMB-apache.service

Модуль + etcd-amb-apache.service + будет работать на Host A.

Далее мы захотим создать сервисный файл для нашего простого контейнера-посла (+ simple-amb +), который позволит регистрационному контейнеру Apache получить доступ к + etcd +. Откройте файл с именем + etcd-amb-apache.service + сейчас:

vi etcd-amb-apache.service

Добавьте следующие строки:

[Unit]
Description=Simple Apache ambassador
After=apache.service
BindsTo=apache.service

[Service]
ExecStartPre=-/usr/bin/docker kill %n
ExecStartPre=-/usr/bin/docker rm %n
ExecStart=/usr/bin/docker run --rm --name %n polvi/simple-amb 172.17.42.1:4001
ExecStop=/usr/bin/docker stop -t 3 %n

[X-Fleet]
X-ConditionMachineOf=apache.service

Сохранить и выйти.

Контейнер + simple-amb + перенаправляет весь трафик, который он получает через порт 10000, в аргумент, указанный при его запуске, т.е. +172.17.42.1: 4001 +, который является стандартным расположением + etcd + в CoreOS.

+ X-ConditionMachineOf = apache.service + указывает флоту планировать это на той же машине, что и контейнер Apache, что очень важно, так как он используется контейнером + docker-register + для регистрации IP-адреса и порта, которым является Apache используя `+ etcd +.

апач-докер-reg.service

Модуль + apache-docker-reg.service + будет работать на Host A.

Давайте создадим служебный файл для нашего контейнера, который будет регистрировать IP-адрес и порт Apache в + etcd +, + docker-register +. Откройте файл с именем + apache-docker-reg.service + сейчас:

vi apache-docker-reg.service

Вставьте следующие строки:

[Unit]
Description=Register Apache
After=etcd-amb-apache.service
BindsTo=etcd-amb-apache.service

[Service]
ExecStartPre=-/usr/bin/docker kill %n
ExecStartPre=-/usr/bin/docker rm %n
ExecStart=/usr/bin/docker run --link etcd-amb-apache.service:etcd -v /var/run/docker.sock:/var/run/docker.sock --rm polvi/docker-register apache.service 80 apache-A

[X-Fleet]
X-ConditionMachineOf=etcd-amb-apache.service

Сохранить и выйти. Вот разбивка заметных частей команды + docker run +:

  • + - ссылка etcd-amb-apache.service: etcd + связывает этот контейнер с простым послом, который будет использоваться для передачи информации о соединении Apache в + etcd +

  • + -v /var/run/docker.sock: / var / run / docker.sock + позволяет этому контейнеру определять динамический порт, к которому привязывается Apache через API Docker компьютера, на котором он будет работать.

  • + apache.service 80 apache-A + передает эти аргументы в контейнер. Первые два аргумента задают имя и порт контейнера докера, который нужно найти, а третий аргумент задает имя ключа + etcd + для записи. После запуска этого контейнера он запишет динамический порт и IP-адрес + apache.service + в ключ + / services / apache-A / apache.service +.

+ X-ConditionMachineOf = etcd-amb-apache.service + указывает флоту планировать это на той же машине, что и простой контейнер послов, что очень важно, поскольку они связаны со ссылкой Docker, чтобы предоставить контейнеру регистрации способ найти ` + etcd + `.

etcd-AMB-apache2.service

Модуль + etcd-amb-apache2.service + будет работать на Host B.

Создайте служебный файл для нашего второго простого контейнера-посла (+ simple-amb +), который позволит контейнеру динамического посла получить доступ к + etcd +. Откройте файл с именем + etcd-amb-apache2.service + сейчас:

vi etcd-amb-apache2.service

Добавьте следующие строки:

[Unit]
Description=Simple Apache ambassador 2

[Service]
ExecStartPre=-/usr/bin/docker kill %n
ExecStartPre=-/usr/bin/docker rm %n
ExecStart=/usr/bin/docker run --rm --name %n polvi/simple-amb 172.17.42.1:4001
ExecStop=/usr/bin/docker stop -t 3 %n

[X-Fleet]
X-Conflicts=apache.service

Сохранить и выйти.

Это почти тот же файл службы, что и + etcd-amb-apache.service +, за исключением того, что + X-Conflicts = apache.service + указывает флоту планировать его на другом компьютере, чем контейнер Apache, и он будет использоваться для связать динамического посла с + etcd +.

апач-дин-amb.service

Модуль + apache-dyn-amb.service + будет работать на Host B.

Создайте служебный файл для нашего контейнера динамического посла (+ dynamic-etd-amb +), который позволит контейнеру динамического посла получить доступ к + etcd +. Откройте файл с именем + apache-dyn-amd.service сейчас:

vi apache-dyn-amb.service

Добавьте следующие строки:

[Unit]
Description=Dynamic ambassador for Apache
After=etcd-amb-apache2.service
BindsTo=etcd-amb-apache2.service

[Service]
EnvironmentFile=/etc/environment
ExecStartPre=-/usr/bin/docker kill %n
ExecStartPre=-/usr/bin/docker rm %n
ExecStartPre=/usr/bin/docker pull polvi/dynamic-etcd-amb
ExecStart=/usr/bin/docker run --link etcd-amb-apache2.service:etcd --rm --name %n -p ${COREOS_PRIVATE_IPV4}:80:80 polvi/dynamic-etcd-amb apache-A 80
ExecStop=/usr/bin/docker stop -t 3 %n

[X-Fleet]
X-ConditionMachineOf=etcd-amb-apache2.service

Сохранить и выйти. Вот разбивка заметных частей команды + docker run +:

  • + - link etcd-amb-apache2.service: etcd + связывает этот контейнер со вторым простым послом, который будет использоваться для получения информации о соединении Apache из + etcd +

  • + -p $ {COREOS_PRIVATE_IPV4}: 80: 80 + предоставляет порт 80 для контейнера и интерфейс частной сети компьютера

  • + apache-A 80 + - это два аргумента, которые определяют трафик порта 80 (т.е. порт 80 на интерфейсе частной сети) должен быть проксирован к службе, зарегистрированной как + apache-A + в + etcd +

+ X-ConditionMachineOf = etcd-amb-apache2.service + указывает флоту планировать это на той же машине, что и второй простой контейнер-посол, что очень важно, поскольку они связаны со ссылкой Docker, чтобы предоставить контейнеру динамического посла способ найти + etcd +.

haproxy.service

Модуль + haproxy.service будет работать на _ Хосте B_.

Создайте файл сервиса для нашего контейнера HAProxy (+ haproxy +), который будет использоваться для подключения к контейнеру Apache через контейнер динамического посла. Откройте файл с именем + haproxy.service + сейчас:

vi haproxy.service

Добавьте следующие строки (замените ваше имя пользователя Docker в обоих местах):

[Unit]
Description=HAProxy consumer

[Service]
EnvironmentFile=/etc/environment
ExecStartPre=-/usr/bin/docker kill %n
ExecStartPre=-/usr/bin/docker rm %n
ExecStartPre=/usr/bin/docker pull /haproxy
ExecStart=/usr/bin/docker run --name %n -p ${COREOS_PUBLIC_IPV4}:80:80 /haproxy
ExecStop=/usr/bin/docker stop -t 3 %n

[X-Fleet]
X-ConditionMachineOf=apache-dyn-amb.service

Сохранить и выйти. Это простой сервисный файл, который запускает HAProxy и предоставляет порт 80 на общедоступном IP-адресе хост-машины. Помните, что внутренний сервер будет настроен на частный IP-адрес хост-компьютера через порт 80, который, как правило, находится там, где динамический посол прослушивает трафик на прокси-сервер для службы Apache.

+ X-ConditionMachineOf = apache-dyn-amb.service + указывает флоту планировать это на той же машине, что и контейнер динамического посла, что важно, потому что динамический посол предоставляет контейнеру HAProxy маршрут для доступа к контейнеру Apache.

Развернуть с флотом

Теперь, когда у нас есть все необходимые сервисные файлы, мы наконец-то можем развернуть нашу установку послов. В каталоге, который содержит все ваши служебные файлы, выполните следующие команды:

fleetctl start apache.service
fleetctl start etcd-amb-apache.service
fleetctl start apache-docker-reg.service
fleetctl start etcd-amb-apache2.service
fleetctl start apache-dyn-amb.service
fleetctl start haproxy.service

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

fleetctl list-units

Вы должны увидеть вывод, похожий на следующий:

UNIT                       MACHINE                      ACTIVE   SUB
apache-docker-reg.service  ceb3ead2.../10.132.233.107   active   running
apache-dyn-amb.service     3ce87ca7.../10.132.233.106   active   running
apache.service             ceb3ead2.../10.132.233.107   active   running
etcd-amb-apache.service    ceb3ead2.../10.132.233.107   active   running
etcd-amb-apache2.service   3ce87ca7.../10.132.233.106   active   running
haproxy.service            3ce87ca7.../10.132.233.106   active   running

Все статуи должны быть + active и` + running`. Следует также отметить, что блоки «Machine A» должны быть на одной машине, а блоки «Machine B» должны быть на другой машине - просто посмотрите на IP-адреса каждого блока, чтобы подтвердить это.

Тестирование вашей установки

Убедитесь, что HAProxy может достичь Apache

Поскольку мы не указали, что контейнер HAProxy должен работать на конкретной машине, нам нужно найти, где он работает. Самый простой способ сделать это - использовать команду + fleetctl ssh +:

fleetctl ssh haproxy.service

Это соединит вас с машиной, на которой запущен контейнер + haproxy.service +. Теперь вы можете получить файл + / etc / environment + для получения общедоступного IP-адреса компьютера с ОС CoreOS, на котором выполняется HAProxy:

. /etc/environment
echo $COREOS_PUBLIC_IPV4

Возьмите полученный IP-адрес и перейдите на него с помощью веб-браузера. Вы увидите следующее изображение:

изображение: https: //assets.digitalocean.com/articles/coreos_basic/web_page.png [Запуск из Docker в CoreOS]

Обратите внимание, что вы получаете доступ к HAProxy, а HAProxy обращается к Apache через прокси-сервер динамического посла.

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

exit

Тест отказоустойчивости

Теперь, когда вы подтвердили, что установка послов работает, давайте посмотрим, что происходит, когда служба провайдера (+ apache.service +) меняет свой IP-адрес и порт.

Используйте + fleetctl для подключения к машине, на которой работает` + apache.service ie`:

fleetctl ssh apache.service

Теперь перезагрузите машину, на которой работает Apache:

sudo reboot
  • Примечание: * Если + apache.service был запущен на машине, к которой вы изначально подключались через SSH, вы будете отключены. Если это так, просто подключитесь по SSH к другому компьютеру в том же кластере CoreOS.

Теперь подождите минуту и ​​проверьте, какие устройства работают:

fleetctl list-units

В зависимости от того, как долго вы ждали, вы можете увидеть, что три блока связаны с «Хостом A» (+ apache.service +, + etcd-amb-apache.service + и + apache-docker-reg.service + ) перезагружаются или активны. В конце концов, они все должны вернуться в состояние active. Как только они это сделают, обратите внимание, что теперь они работают на другой машине, чем раньше.

Теперь вернитесь в веб-браузер, который подключался к HAProxy, и нажмите «Обновить». Вы должны увидеть ту же тестовую страницу, что и раньше, указывая, что HAProxy по-прежнему может подключаться к Apache через динамический посол!

Заключение

Теперь, когда вы настроили свой собственный шаблон посла, вы сможете адаптировать концепции, представленные в этом руководстве, к вашим собственным услугам. Это уникальный способ настройки пользовательских служб во время выполнения, который позволяет легко перемещать службы внутреннего поставщика между компьютерами. В более реалистичной настройке вы, вероятно, заменили бы службу Apache одним или несколькими контейнерами приложений, и вы могли бы настроить HAProxy с несколькими внутренними серверами (или использовать совершенно другую потребительскую службу).

Related