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