Для ясности я начну с модель OSI , которая говорит нам, что TCP - это протокол уровня 4 и HTTP / HTTPSпротокол уровня 7 . Так что, откровенно говоря, HTTP/HTTP
данные - это инкапсулированные данные в TCP
перед выполнением инкапсуляции остальных уровней для передачи пакета на другое сетевое устройство.
Если вы настроили Classic (TCP)LoadBalancer останавливает чтение пакетных данных после чтения TCP-части, чего достаточно, чтобы решить (в соответствии с конфигурацией LB), на какой IP address
и на IP port
этот пакет данных должен быть доставлен. После этого LB берет данные полезной нагрузки TCP, оборачивает их данными другого уровня TCP и отправляет их в точку назначения (что, в свою очередь, вызывает применение всех остальных уровней OSI).
Чтобы ваша конфигурация работала должным образом,необходимо выставить nginx-ingress-controller Pod, используя NodePort service . Затем Classic ELB можно настроить для доставки трафика на любой узел кластера на порт, выбранный для этой службы NodePort. Обычно это между 30000
и 32767
. Итак, ваш пул LB будет выглядеть следующим образом:
Давайте представим, что узлы кластера имеют IP-адреса 10.132.10.1...10
, а порт NodePort равен 30276
.
ELB Endpoint 1: 10.132.10.1:30276
ELB Endpoint 2: 10.132.10.2:30276
...
ELB Endpoint 10: 10.132.10.10:30276
Примечание. В случае AWS ELB, я полагаю, имена узлов должны использоваться вместо IP-адресов.
Таким образом, это должно вызвать следующую последовательность распределения трафика от клиента к модулю приложения Kubernetes:
- Клиент отправляет пакет TCP с HTTP / HTTPS-запросом в полезной нагрузке на ELB_IP:ELB_port (
a.b.c.d:80
). - ELB получает IP-пакет, анализирует его данные TCP, находит подходящую конечную точку из внутреннего пула (весь список узлов кластера Kubernetes) и создает другой пакет TCP с тем жеДанные HTTP / HTTPS внутри, а также заменяет IP-адрес назначения и TCP-порт назначения на кластерный IP-адрес узла и Сервисный NodePort TCP-порт (
l.m.n.k:30xxx
) и затем отправляет его в выбранное место назначения. - Узел Kubernetes получает пакет TCP и, используя правила iptables, снова меняет IP-адрес назначения и порт назначения пакета TCP, а затем пересылает пакет (в соответствии с конфигурацией службы Nodeport) в модуль назначения. В этом случае это будет модуль nginx-ingress-controller.
- Модуль Nginx-ingress-controller получает пакет TCP, и, в соответствии с данными TCP, он должен доставляться локально, извлекает из него данные HTTP / HTTP и отправляет данные (запрос HTTP / HTTPS) в Nginx. процесс внутри контейнера Nginx в модуле Pod
- процесс Nginx в контейнере получает запрос HTTP / HTTPS, расшифровывает его (в случае HTTPS) и анализирует все заголовки HTTP.
- В соответствии с настройками
nginx.conf
процесс Nginx изменяет HTTP-запрос и доставляет его в службу кластера, заданную для настроенного пути к хосту и URL-адресу. - Процесс Nginx отправляет измененный HTTP-запрос на серверную часть. application.
- Затем в HTTP-запрос добавляется заголовок TCP и отправляется в бэкэнд-службу
IP_address:TCP_port
. - Правила iptables, определенные для бэкэнда, доставляют пакет в одну из конечных точек сервиса. (прикладные модули).
Примечание : чтобы завершить SSL на входном контроллере, необходимо создать сертификаты SSL, которые включают ELB IP и ELB FQDN в разделе SAN.
Примечание : Если вы хотите завершить SSL в модуле приложения, чтобы иметь сквозное шифрование SSL, вы можете настроить nginx для обхода трафика SSL.
Итог: ELB, настроенный для доставки TCP-трафика в кластер Kubernetes, прекрасно работает с контроллером nginx-ingress, если вы настроите его правильно.
В GKE (Google Kubernetes Engine), если вы создаете Сервис с типом: LoadBalancer, он создает вам именно TCP LB, который перенаправляет трафик на Service NodePort, а затем Kubernetes отвечает за его доставку в Pod. EKS (Elastic Kubernetes Service) от AWS работает примерно так же.