как создать несколько IP-адресов балансировщика нагрузки на одном контроллере входящего трафика в Azure AKS

Я пытаюсь настроить несколько служб в одном кластере k8s с одним контроллером Ingress впереди, который выполняет завершение tls для всех служб. Это хороший пример: https://github.com/kubernetes/contrib/blob/master/ingress/controllers/nginx/examples/multi-tls/multi-tls.yaml

Сначала я последовал этому примеру: https://github.com/brunoterkaly/ingress, а затем расширил его. иметь несколько служб TLS.

Открывая мой контроллер репликации nginx, AKS в Azure автоматически создает балансировщик нагрузки и общедоступный IP-адрес, к которому я могу применить запись A: kubectl expose rc nginx-ingress-rc --port="80,443" --type="LoadBalancer"

Однако мне также нужна вторая запись A, которая указывает на тот же IP-адрес (я думаю?), Чтобы я мог получить доступ к своему входному контроллеру из разных доменов. Я не могу понять, как позволить AKS создать для этой цели вторую?


person Nicolas Mommaerts    schedule 02.03.2018    source источник


Ответы (2)


Возможно, это слишком поздно и не совсем то, о чем просил исходный пост. Неофициально вы можете создать несколько сервисов для вашего входящего контроллера и, таким образом, также сопоставить несколько IP-адресов. Единственное ограничение одной службы k8s типа LoadBalancer состоит в том, что она может ссылаться только на один IP-адрес.

В моем случае у меня есть кластер AKS с множеством пространств имен и различными приложениями, доступными по разным URL-адресам. Каждый URL-адрес имеет свой общедоступный IP-адрес по историческим причинам:

Пример:

first.example.com -> 1.2.3.4
second.example.com -> 5.6.7.8
...we could go on, IPs are just made up!

Я хотел установить вход nginx в AKS, который будет обрабатывать маршрутизацию для всех пространств имен вместо обработки каждого приложения с помощью выделенной пары LoadBalancer и обратного прокси. Для этого я выполнил шаги, описанные здесь, и предоставил только один из IP-адресов как controller.service.loadBalancerIP=”1.2.3.4” во время входящего развертывания (с использованием helm).

После этих шагов я мог увидеть эти службы:

PS C:\> kubectl get service -n ingress-nginx
NAME                                   TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)                      AGE
ingress-nginx-controller               LoadBalancer   10.0.141.84    1.2.3.4         80:30065/TCP,443:31444/TCP   14h
ingress-nginx-controller-admission     ClusterIP      10.0.168.127   <none>          443/TCP                      14h

После этого я вручную создал другую службу ingress-nginx-controller-second с точно такими же метками селектора и следующим loadBalancerIP: 5.6.7.8.

После этих шагов я мог видеть эти службы:

PS C:\> kubectl get service -n ingress-nginx
NAME                                   TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)                      AGE
ingress-nginx-controller               LoadBalancer   10.0.141.84    1.2.3.4         80:30065/TCP,443:31444/TCP   14h
ingress-nginx-controller-admission     ClusterIP      10.0.168.127   <none>          443/TCP                      14h
ingress-nginx-controller-second        LoadBalancer   10.0.204.118   5.6.7.8         80:31275/TCP,443:32751/TCP   10m

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

PS C:\Users\sk1u04h9> kubectl get ingress -A
NAMESPACE   NAME             CLASS    HOSTS                ADDRESS   PORTS     AGE
first       first-ingress    <none>   first.example.com    1.2.3.4   80, 443   14h
second      second-ingress   <none>   second.example.com   1.2.3.4   80, 443   5m

Я надеюсь, что это поможет кому-то, кто пытается перейти на nginx ingress без необходимости заранее указывать все URL-адреса, указывающие на один общедоступный IP-адрес. Вы можете запросить, чтобы все URL-адреса указывали только на один IP-адрес, если это необходимо, после этого шага миграции, а затем вы, конечно, можете удалить все ingress-nginx-controller-* службы, которые больше не понадобятся.

person petermicuch    schedule 04.12.2020

Между тем я немного лучше понимаю Ingress. Для входящего контроллера создается только один IP-адрес, который может поддерживать маршрутизацию на основе пути и хоста. См. https://docs.microsoft.com/en-us/azure/aks/ingress для примера. Мне просто нужно настроить свой DNS с различными записями CNAME для записи A, связанной с общедоступным IP-адресом Azure. Если я хочу использовать несколько * .cloudapp.azure.com fqdn для своих служб, чего я пытался достичь вначале, мне придется использовать Azure DNS.

person Nicolas Mommaerts    schedule 07.03.2018
comment
Я пытаюсь сделать то же самое, но теряюсь. Не могли бы вы подробнее рассказать, как использовать 2 записи DNS на 1 контроллере nginx-ingress с помощью AKS. Спасибо заранее - person Eduardo Portal Geroy; 31.05.2018
comment
Nginx-ingress-controller получает одну DNS-запись, я просто использую cloudapp.azure.com. Затем для всех своих служб я создаю записи CNAME, указывающие на входящее DNS-имя. Например: service1.costco.com - ›costco-ingress.cloudapp.azure.com service2.costco.com -› costco-ingress.cloudapp.azure.com Затем в вашем контроллере входящего трафика вы можете определить маршрут для имени хоста (service1. costco.com и service2.costco.com) и направляют их в различные службы k8s. Вы также можете выполнять маршрутизацию на основе пути или смешивать их (например, service1.costco.com/api переходит к службе api, а service1.costco.com/ui переходит к пользовательскому интерфейсу). - person Nicolas Mommaerts; 31.05.2018