Как настроить DNS и ингресс-контроллеры для общедоступного веб-приложения? - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь понять понятия входных и входных контроллеров в kubernetes. Но я не совсем уверен, как должен выглядеть конечный продукт. Вот что я не совсем правильно понял:

Учитывая, что у меня где-то работает кластер Kubernetes с главным узлом, который управляет плоскостью управления и базой данных etcd. Кроме того, у меня примерно 3 рабочих узла - каждый из рабочих узлов имеет публичный IPv4-адрес с соответствующей записью DNS A (worker{1,2,3}.domain.tld), и я полностью контролирую свой DNS-сервер. Я хочу, чтобы мои пользователи обращались к моему веб-приложению через www.domain.tld. Поэтому я указываю www CNAME на один из рабочих узлов (я увидел, что мой входной контроллер, т. Е. Назначен на рабочий1, поэтому я указываю на worker1.domain.tld).

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

  1. Разве запускать контроллер входа только на одном рабочем узле бессмысленно для внутренней балансировки нагрузки двух двух интерфейсных модулей через его службу? Рекомендуется ли запускать входной контроллер на каждом рабочем узле в кластере?

  2. По какой-то причине рабочий, который управляет входным контроллером, умирает, и он переносится на другого работника. Таким образом, точка входа будет на другом IPv4-адресе, верно? С точки зрения пользователя, который пытается получить доступ к интерфейсу через www.domain.tld, эта запись DNS должна быть обновлена, верно? Как так? Нужно ли где-нибудь запускать определенный DNS-сервер с поддержкой kubernetes? Я не понимаю связь между DNS-сервером и кластером kubernetes.

Дополнительный вопрос: если я запускаю больше реплик входных контроллеров (распределенных по нескольким работникам), то я делаю здесь подход на основе циклического перебора DNS с несколькими IPv4-адресами, привязанными к одной записи DNS? Или какое лучшее решение для достижения HA. Я скорее не хочу использовать IP-адреса с балансировкой нагрузки, когда рабочий использует один и тот же IP-адрес.

Ответы [ 3 ]

0 голосов
/ 10 мая 2018

Не является ли использование входного контроллера только на одном рабочем узле бессмысленным для внутренней балансировки нагрузки двух двух модулей интерфейса через его службу? Рекомендуется ли запускать входной контроллер на каждом рабочем узле в кластере?

Количество копий входа не повлияет на качество балансировки нагрузки. Но для HA вы можете запустить более 1 реплики контроллера.

По какой-то причине рабочий, который управляет входным контроллером, умирает, и он переносится на другого работника. Таким образом, точка входа будет на другом IPv4-адресе, верно? С точки зрения пользователя, который пытается получить доступ к веб-интерфейсу через www.domain.tld, эта запись DNS должна быть обновлена, верно? Как так? Нужно ли где-нибудь запускать определенный DNS-сервер с поддержкой kubernetes? Я не понимаю связь между DNS-сервером и кластером kubernetes.

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

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

Я запускаю больше реплик входных контроллеров (распределенных по нескольким работникам), я делаю здесь подход, основанный на циклическом переборе DNS, с несколькими IPv4-адресами, привязанными к одной записи DNS? Или какое лучшее решение для достижения HA.

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

Решения для HA, предоставляемые @jjo, - это не худший способ достичь того, чего вы хотите, если вы можете подготовить для этого среду. Если нет, вам следует выбрать что-то другое, но лучше всего использовать балансировщик нагрузки, предоставляемый инфраструктурой. Будет ли это основано на нескольких выделенных серверах, или IP-адресах с балансировкой нагрузки, или чем-то еще - это не имеет значения.

0 голосов
/ 16 октября 2018

Учитывая, что у меня где-то работает кластер Kubernetes с главным узлом, который управляет плоскостью управления и базой данных etcd.Кроме того, у меня как 3 рабочих узла - каждый из рабочих узлов имеет публичный IPv4-адрес с соответствующей записью DNS A (worker {1,2,3} .domain.tld), и я полностью контролирую свой DNSсервер.Я хочу, чтобы мои пользователи имели доступ к моему веб-приложению через www.domain.tld.Таким образом, я указываю www CNAME на один из рабочих узлов (я увидел, что мой входной контроллер, т. Е. Назначен на рабочий1, поэтому я указываю его на worker1.domain.tld).

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

  1. Не бессмысленно ли запускать входной контроллер только на одном рабочем узле для внутренней балансировки нагрузки двух двух модулей интерфейса через его службу?Лучше ли запускать входной контроллер на каждом рабочем узле кластера?

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

По какой-то причине работник, управляющий входным контроллером, умирает, и он переносится на другого работника.Таким образом, точка входа будет на другом IPv4-адресе, верно?С точки зрения пользователя, который пытается получить доступ к веб-интерфейсу через www.domain.tld, эта запись DNS должна быть обновлена, верно?Как так?Нужно ли где-нибудь запускать определенный DNS-сервер с поддержкой kubernetes?Я не понимаю связь между DNS-сервером и кластером kubernetes.

Да, IP изменится.И да, это нужно обновить на вашем DNS-сервере.

Есть несколько способов справиться с этим:

  1. , если клиенты будут иметь дело с перебоями.Вы можете перечислить все узлы балансировки нагрузки в циклическом цикле и предположить, что клиенты будут иметь запасной вариант.это работает с некоторыми протоколами, но в основном подразумевает тайм-ауты и проблемы и, как правило, не должно использоваться, тем более что вам все равно нужно обновлять записи вручную, когда k8s полагает, что это создаст / удалит записи LB

  2. настроить внешний DNS-сервер автоматически.это можно сделать с помощью проекта external-dns , который может синхронизироваться с большинством популярных DNS-серверов, включая стандартные динамические обновления RFC2136, а также облачных провайдеров, таких как Amazon, Google, Azure и т. д.

Бонусный вопрос: если я запускаю больше реплик входных контроллеров (распределенных по нескольким работникам), я делаю здесь подход на основе циклического перебора DNS с несколькими IPv4-адресами, привязанными к одной записи DNS?Или какое лучшее решение для достижения HA.Я скорее не хочу использовать IP-адреса с балансировкой нагрузки, когда рабочий разделяет один и тот же IP-адрес.

Да, вы должны в основном выполнять циклический перебор DNS.Я бы предположил, что external-dns и здесь будет делать то же самое.

Другая альтернатива - сделать что-то вроде ECMP .Это может быть достигнуто за счет того, что оба балансировщика нагрузки «объявляют» одно и то же пространство IP.Однако это расширенная конфигурация, которая может не потребоваться.Существуют интересные компромиссы между обновлениями BGP / ECMP и DNS, см. этот пост разработки Dropbox для более глубокого обсуждения этих вопросов.

Наконец, обратите внимание, что CoreDNS рассматривает реализацию общедоступного DNSзаписи , которые могли бы решить эту проблему в Кубернетесе без внешних ресурсов.

0 голосов
/ 09 мая 2018

Поведение, которое вы описываете, на самом деле представляет собой LoadBalancer (Service с type=LoadBalancer в Kubernetes), которое "естественно" предоставляется, когда вы запускаете Kubernetes поверх облачного провайдера.

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

  • Развертывание https://github.com/google/metallb

    • именно здесь ваш внешний IP будет «жить» (HA'd) через speaker-xxx модулей, развернутых как DaemonSet на каждом рабочем узле
    • в зависимости от вашей настройки extn L2 / L3, вам нужно будет выбрать между L3 (BGP) или L2 (ARP)
    • fyi Я успешно использовал L2 mode + простой проксикарт на граничном маршрутизаторе
  • Развертывание nginx-ingress контроллера с Service как type=LoadBalancer

    • это заставит metallb "приземлиться" (фактически: L3 или L2 "рекламируют" ...) назначенный IP узлам
    • fyi Я успешно проверил это вместе с kube-router, используя --advertise-loadbalancer-ip в качестве CNI, эффект будет таким, например. <LB_IP>:80 будет перенаправлен на ingress-nginx Service NodePort
  • Укажите свой DNS на IP-адрес ingress-nginx LB, то есть на что указывает: kubectl get svc --namespace=ingress-nginx ingress-nginx -ojsonpath='{.status.loadBalancer.ingress[].ip}{"\n"}'

    • fyi, вы также можете быстро протестировать его, используя fake DNSing с http://A.B.C.D.xip.io/ (A.B.C.D - ваш публичный IP-адрес)
...