Учитывая, что у меня где-то работает кластер 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 службой для базы данных.Из того, что я понял сейчас, мне нужен входной контроллер, указывающий на интерфейсную службу, для достижения некоторой балансировки нагрузки.Здесь два вопроса:
- Не бессмысленно ли запускать входной контроллер только на одном рабочем узле для внутренней балансировки нагрузки двух двух модулей интерфейса через его службу?Лучше ли запускать входной контроллер на каждом рабочем узле кластера?
Да, это хорошая практика.Наличие нескольких модулей для балансировщика нагрузки важно для обеспечения высокой доступности.Например, если вы запускаете контроллер ingress-nginx , вам, вероятно, следует развернуть его на нескольких узлах.
По какой-то причине работник, управляющий входным контроллером, умирает, и он переносится на другого работника.Таким образом, точка входа будет на другом IPv4-адресе, верно?С точки зрения пользователя, который пытается получить доступ к веб-интерфейсу через www.domain.tld, эта запись DNS должна быть обновлена, верно?Как так?Нужно ли где-нибудь запускать определенный DNS-сервер с поддержкой kubernetes?Я не понимаю связь между DNS-сервером и кластером kubernetes.
Да, IP изменится.И да, это нужно обновить на вашем DNS-сервере.
Есть несколько способов справиться с этим:
, если клиенты будут иметь дело с перебоями.Вы можете перечислить все узлы балансировки нагрузки в циклическом цикле и предположить, что клиенты будут иметь запасной вариант.это работает с некоторыми протоколами, но в основном подразумевает тайм-ауты и проблемы и, как правило, не должно использоваться, тем более что вам все равно нужно обновлять записи вручную, когда k8s полагает, что это создаст / удалит записи LB
настроить внешний 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записи , которые могли бы решить эту проблему в Кубернетесе без внешних ресурсов.