Назад | Перейти на главную страницу

В кластере контейнеров, таком как Kubernetes или Docker 1.12 Swarm, как выполнить разрешение с помощью внешнего DNS на хороший контейнер на хорошем хосте?

Может быть, я тупой, может, просто не использую хороших слов, но я не могу найти ни одного ответа нигде на Stackexchange или во всем Интернете.

Я создал множество веб-сайтов, в основном на Wordpress, Drupal, ...
(А недавно я начал работать со Scala и Go, пытаясь создать веб-сайт, чтобы получить некоторые знания об этих языках.)
Мой DNS-провайдер в основном DNSMadeEasy.

Сначала я использовал только один большой выделенный серверв Debian, мои разные веб-сайты просто находятся в разных папках, а Nginx, PHP-FPM, ... обслуживает все мои веб-сайты. Традиционная установка.

Затем несколько лет назад я переключился на установку Docker, все еще на одном хосте., с одним контейнером Nginx, одним контейнером PHP-FPM, одним контейнером MySQL ... на веб-сайт.
И один контейнер обратного прокси nginx перед всем, чтобы перенаправить посетителя веб-сайта example.com в контейнеры example.com.

Либо с традиционной настройкой, либо с настройкой на основе Docker, я назначал IP-адрес моего хоста для записи A моих разных сайтов в DNSMadeEasy, и вуаля, все будет работать должным образом.

СЕЙЧАС я хотел бы переключиться с настройки с одним хостом на настройку с несколькими хостами, также известную как настройка кластера, используя Docker Swarm (1.12 Swarm) или Kubernetes, чтобы упростить масштабирование, поскольку в первую очередь это было целью перехода на Docker.
Таким образом, контейнеры для разных моих веб-сайтов будут распределены по разным хостам моего кластера.

Я планирую использовать европейское облако, работающее на OpenStack, так как я не могу (<> законы о конфиденциальности) и не хочу использовать (<> слишком дорого) американские облака, такие как Google Cloud Engine или AWS EC2 (<> Patriot Act <> Европейские данные), поэтому, пожалуйста, не говорите мне использовать эти облака. Я уже смог настроить кластер Kubernetes и кластер Docker Swarm в этом облаке Openstack.

МОЙ ВОПРОС: Я не могу понять, как вы ДИНАМИЧЕСКИ направляете свои веб-сайты на новые службы и модули, которые создаются автоматически?

Допустим, у меня четыре хоста (1 мастер и 3 рабочих).
Если я просто сделаю Циклическое разрешение DNS, помещая все четыре IP-адреса моих четырех хостов в A-запись моих веб-сайтов, чтобы он шел на любой из четырех, это будет страшный сон и полный беспорядок, с заголовками кеша и всем остальным. Более того, с DNSMadeEasy у них есть API для автоматического добавления и удаления записей, поэтому я полагаю, что должна быть возможность автоматически обновлять запись A или запись CNAME веб-сайтов, как этот плагин делает с AWS Route53: https://github.com/wearemolecule/route53-kubernetes? (Мы видим, что здесь используется внешний LoadBalancer, поэтому я полагаю, что мне также понадобится внешний фунт для моей настройки, если я должен следовать этому решению?)

Мне известно, что и Kubernetes, и Docker Swarm используют DNS для обнаружения сервисов, а etcd / consul - для регистрации и выборов.
Но насколько я понимаю, это используется как внутренняя система DNS, а не как внешняя, нет?

Или я должен указать NS на мои хосты и использовать мои хосты вместо DnsMadeEasy !! ??

Я что-то упускаю ? Я что делаю неправильно?

Пожалуйста, помогите мне, у меня начинаются огромные головные боли, пытаясь во всем разобраться :)

Y

Docker 1.12 с роевым режимом имеет встроенную балансировку нагрузки.

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

Скажем, например, вы бежали:

docker service create --name nginx -p 80:80 nginx

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

docker service scale nginx=2

Это делает настройку очень простой:

  1. Использовать DNSMadeEasy циклический перебор и добавьте записи A для всех IP-адресов хоста в вашем рое.
  2. Разверните свое приложение с помощью docker service create
  3. Прибыль

Судя по вашему вопросу, похоже, что вы хотите запустить несколько сайтов в своем рое, например. все несколько приложений прослушивают порт 80 и порт 443. Как указывает @Flippy, для этого в настоящее время вам нужно запустить балансировщик нагрузки уровня 7, такой как HAProxy или nginx, который проверяет заголовки хоста запросов и соответствующим образом перенаправляет запросы. Это также просто сделать с режимом Docker 1.12 Swarm, и это хорошее руководство по началу работы.

Встроенный DNS Kubernetes

Начиная с Kubernetes 1.3, DNS - это встроенная служба, запускаемая автоматически с помощью надстройки кластера диспетчера дополнений. Модуль и служба DNS будут запланированы в кластере, а кублеты будут настроены для указания отдельным контейнерам использовать IP-адрес службы DNS для разрешения имен DNS.

Каждой службе, определенной в кластере (включая сам DNS-сервер), будет назначено DNS-имя. По умолчанию список поиска DNS клиентского модуля будет включать собственное пространство имен модуля и домен кластера по умолчанию. Лучше всего это проиллюстрировать на примере:

Предположим, что служба с именем foo находится на панели пространства имен Kubernetes. Pod, запущенный в строке пространства имен, может найти эту службу, просто выполнив DNS-запрос для foo. Pod, работающий в пространстве имен quux, может найти эту службу, выполнив DNS-запрос для foo.bar.

Для получения дополнительной информации проверьте Документация Kubernetes.

Балансировка нагрузки NGINX

Конфигурации по умолчанию для балансировки нагрузки:

http {
    upstream myapp1 {
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://myapp1;
        }
    }
}

Для получения дополнительной информации проверьте Документация NGINX.

DNS REST API

Затем вы можете создать собственный сценарий для взаимодействия с API вашего поставщика DNS по мере необходимости.

Для получения дополнительной информации проверьте DNSMadeEasy Документация по REST API.