Как Kubernetes NodePort предоставляет услуги с Service.spe c .externalTrafficPolicy = Локальный маршрутный трафик c? - PullRequest
1 голос
/ 05 февраля 2020

Похоже, есть два противоречивых объяснения того, как службы NodePort направляют трафик c. Службы могут направлять трафик c на один из двух, а не на оба:

  1. Узлы (через прокси-сервер kube) Согласно kubectl explain Service.spec.externalTrafficPolicy и этой статье , который добавляет больше деталей, пакеты, поступающие в сервисы NodePort с установленным Service.spec.externalTrafficPolicy=Local, направляются на kube-прокси, который затем направляет пакеты на соответствующие модули, которые он выполняет.
    • Эта сетевая документация по kube-proxy дополнительно поддерживает эту теорию, добавляя, что конечные точки добавляют правило в IPtable службы, которое перенаправляет трафик c на узлы через kube-proxy.
  2. Pods : сервисы обновляют свои IPtables с endpoints, которые содержат IP-адреса для pods , к которым они могут направлять. Кроме того, если вы удалите селекторы меток своей службы и отредактируете конечные точки , вы можете изменить место, куда направляется ваш трафик c.

Если одна из них верна, тогда я должен что-то недопонимание.

  • Если сервисы маршрутизируют на узлы , то почему я могу редактировать endpoints, не нарушая IPtables?
  • Если сервисы маршрутизируют на pods , то почему бы сервисам go из-за проблем с маршрутизацией к узлам, когда установлен Service.spec.externalTrafficPolicy?

1 Ответ

2 голосов
/ 05 февраля 2020

A Служба - это виртуальный адрес / порт, управляемый kube-proxy. Сервисы пересылают трафик c на связанные с ними конечные точки, которые обычно являются пакетами, но, как вы упомянули, могут быть установлены на любой IP-адрес / порт назначения.

A Служба NodePort не изменяет сторону конечной точки службы, NodePort разрешает внешний трафик c в Службу через порт на узле.

Разбивка услуги

kube-proxy может использовать 3 метода для реализации пересылки услуги из узла в пункт назначения.

  • пользовательский прокси
  • iptables
  • ipvs

Большинство кластеров используют iptables, что описано ниже. Я использую термин «пересылка» вместо «маршрут», потому что службы используют преобразование сетевых адресов (или прокси-сервер) для «пересылки» трафика c вместо стандартной сетевой маршрутизации.

Служба ClusterIP является виртуальным объектом, управляемым kube-proxy. Эта комбинация адрес / порт доступна на каждом узле в кластере и перенаправляет любой локальный (pod) трафик службы c на конечные точки IP и порт.

                                         / Pod (remote node)
Pod -- ClusterIP/Port -- KUBE-SVC-NAT  --  Pod
                                         \ Pod (remote node)

Служба с NodePort такая же, как указано выше, с добавлением способа пересылки внешних трафиков c в кластер через узел. kube-proxy управляет дополнительным правилом для отслеживания внешнего трафика c и передачи его в те же правила обслуживания.

Ext --     NodePort   \                / Pod (remote node)
                        KUBE-SVC-NAT --  Pod
Pod -- ClusterIP/Port /                \ Pod (remote node)

Параметр externalTrafficPolicy=Local позволяет службе NodePort использовать только локальный Pod для обслуживания входящего трафика c. Это исключает сетевой скачок, который устраняет необходимость перезаписывать источник пакета (через NAT). Это приводит к тому, что реальный сетевой IP-адрес поступает на модуль, обслуживающий соединение, а не на один из узлов кластера, являющийся исходным IP-адресом.

Ext --     NodePort   \                  Pod (remote node)
                        KUBE-SVC-NAT --  Pod (local)
Pod -- ClusterIP/Port /                  Pod (remote node)

iptables

Я рекомендую попытаться отследить соединение от источника к месту назначения для службы или порта узла на хосте. Требуется немного знаний iptables, но я думаю, что стоит

Чтобы перечислить все ip / порты служб, которые будут перенаправлены:

iptables -vnL -t nat KUBE-SERVICES

Чтобы перечислить все нодпорт, который будет переадресован:

iptables -vnL -t nat KUBE-NODEPORTS

Когда у вас есть правило, вы можете перепрыгнуть KUBE-SVC-XXX "целевых" правил в полном выводе.

iptables -vnL -t nat | less

...