Вход k8s nginx принимает IP-адрес моего узла в качестве адреса

#kubernetes-ingress #nginx-ingress #metallb #bare-metal-server

#kubernetes-вход #вход nginx #metallb #голый металл-сервер

Вопрос:

У меня есть 3-узловой кластер k8s в моей виртуальной среде, который является VMware Fusion.

Сведения о моем кластере

При попытке создать базовый вход требуется мой один node_ip, который является запущенным nginx_controller.

Подробная информация о входе

Но порт 80 открыт не на всех узлах. Я имею в виду, что он не работает

 curl: (7) Failed to connect to 172.16.242.133 port 80: Connection refused
  

Чего мне не хватает?

  • Я установил контроллер входа Nginx
  • Я установил MetalLB и настроил его. Он работает, если я создаю сервис с типом: LoadBalancer. Он принимает IP-адрес ExernalIp, и я могу получить к нему доступ.
  • Я развертываю базовое приложение для тестирования.
  • Я создаю сервис для приложения. Я могу получить доступ к NodePort или CulesterIP. Я пробовал оба.
  • Я создаю базовый вход для управления хостами и персоналом маршрутизации. Но этот шаг я застрял.

Мои вопросы ;

1-) Обычно какой вход должен принимать Ip-адрес в качестве адреса? Один из моих узлов или внешний IP-адрес DHCP.

2-) Когда я создаю сервис с типом: LoadBalancer, он принимает externalIP. Я могу записать DNS на этот IP-адрес, и клиенты могут получить к нему доступ. Что в этом плохого?

Ответ №1:

Вход поддерживает два типа типа обслуживания: NodePort и LoadBalancer .

При использовании NodePort типа сервиса вы должны использовать nodeport номер вместо порта 80 по умолчанию. Объяснение этого поведения доступно в документации по входу nginx:

Однако из-за изоляции пространства имен контейнера клиент, расположенный за пределами кластерной сети (например, в общедоступном Интернете), не может получить доступ к хостам Ingress напрямую через порты 80 и 443. Вместо этого внешний клиент должен добавить порт узла, выделенный службе ingress-nginx, к HTTP-запросам.

Итак, ваш curl должен выглядеть так:

 curl 172.16.242.133:<node_port_number>
  

При использовании MetalLB with LoadBalancer service type он использует externalIPs конфигурацию, указанную вами при установке metallb в кластере.

Более подробная информация о взаимодействии контроллера входа nginx с metallb доступна в документации nginx.

Для MetalLB требуется пул IP-адресов, чтобы иметь возможность стать владельцем службы ingress-nginx. Этот пул может быть определен в конфигурационной карте с именем config, расположенной в том же пространстве имен, что и контроллер MetalLB. Этот пул IP-адресов должен быть выделен для использования MetalLB, вы не можете повторно использовать IP-адреса узла Kubernetes или IP-адреса, передаваемые сервером DHCP.

Ответ №2:

Моя проблема заключалась в том, что я думал, что Ingress принимает IP-адрес, и мы записываем DNS на этот IP. Но это не так. Почему у объекта Ingress есть поле адреса и порта, я не знаю. Я думаю, просто для информации, но это сбивает с толку новичков. Клиенты получают доступ к входному контроллеру, а не к входному.

На самом деле служба Ingress Controller управляет externalIP или NodePort. Поэтому мы должны это настроить.

В моем случае nginx

 kubectl edit service/ingress-nginx-controller -n ingress-nginx
  

Вы можете изменить тип на LoadBalancer, и вы получите externalIP после настройки MetalLB. И определите свои входные объекты, запишите записи DNS, тогда вы готовы.