K8s делает странные сетевые вещи, которые нарушают дизайн приложений

#kubernetes #iptables #connection-refused

#kubernetes #iptables #отказано в подключении

Вопрос:

Я обнаружил странное поведение в сети K8s, которое может полностью нарушить дизайн некоторых приложений.

У меня есть два модуля и один сервис

  • Модуль 1 — это глупый обратный прокси (я не знаю реализации)
  • Модуль 2 — это веб-сервер
  • Упомянутая служба принадлежит pod 2, веб-серверу

После первоначального запуска моего стека я обнаружил, что Pod 1 — обратный прокси-сервер по какой-то причине не может связаться с веб-сервером с первой попытки, ping работает нормально, а также curl. Теперь я попробовал wget mywebserver внутри модуля 1 — Обратный прокси и получил следующее:

  wget mywebserver
--2020-11-16 20:07:37--  http://mywebserver/
Resolving mywebserver (mywebserver)... 10.244.0.34, 10.244.0.152, 10.244.1.125, ...
Connecting to mywebserver (mywebserver)|10.244.0.34|:80... failed: Connection refused.
Connecting to mywebserver (mywebserver)|10.244.0.152|:80... failed: Connection refused.
Connecting to mywebserver (mywebserver)|10.244.1.125|:80... failed: Connection refused.
Connecting to mywebserver (mywebserver)|10.244.2.177|:80... connected.
  

Где 10.244.2.177 — это IP-адрес модуля веб-сервера.
Мне кажется, проблема в том, что обратный прокси-сервер не пытается инициировать попытку переслать пакет дважды, вместо этого он пытается только один раз, когда он терпит неудачу, как в wget cmd выше, и запрос отбрасывается, поскольку резервная копия недоступна из-за того, что кажется, что K8s IPtables…

Если я настрою обратный прокси-сервер так, чтобы он не использовал DNS-имя службы для отключения загрузки, а вместо этого использовал IP-адрес Pod (10.244.2.177), все работает нормально и, как и ожидалось.

Я уже пробовал это с различными поставщиками CNI, такими как: Flannel, Calico, Canal, Weave, а также Cilium, поскольку Kube-Proxy не используется с Cilium, но все они потерпели неудачу, и все они выполняют причудливую маршрутизацию, которую никто не понимает из коробки. Итак, мой вопрос в том, как я могу заставить маршрутизацию K8s работать немедленно на этом этапе? Я уже переопределил весь свой стек в docker-swarm, просто чтобы посмотреть, работает ли он, и он работает безупречно! Похоже, эта проблема связана со схемой маршрутизации K8s.

Просто чтобы исключить неправильную настройку с моей стороны, я также попробовал это с различными готовыми к использованию решениями K8s, такими как управляемые K8s от Digital-Ocean и / или автономные RKE. У всех одинаковое поведение.

Может быть, у кого-нибудь есть идея, в чем может быть проблема и как исправить это поведение K8s?

Мне также может быть очень полезно узнать, что на самом деле происходит по запросу wget, поскольку это остается для меня загадкой.

Заранее большое спасибо!

Комментарии:

1. Итак, что это за IP-адреса, которые не отвечают 10.244.0.34, 10.244.0.152, 10.244.1.125 ?

2. Вот в чем вопрос, я вообще понятия не имею! Но, по крайней мере, все они являются частью линейки K8 Pod CIDR

3. показать kubectl describe службу, к которой вы подключаетесь.

4. Кажется, что упомянутый IP-адрес, к которому wget пытается подключиться, поступает из службы, вывод kubectl: Конечные точки: 10.244.0.34:80,10.244.0.152:10.244.1.125:80 …

5. Я уже пытался предоставить сервису статический ClusterIP, но безуспешно из-за этой проблемы с маршрутизацией

Ответ №1:

Оказалось, что у меня было несколько неправильных настроек при развертывании K8s. Сначала я удалил ClusterIP: None, поскольку это приводит к поведению, которое wget показывает выше в моем вопросе. Кроме того, я установил app: и tier: неправильно при моем развертывании. В любом случае, теперь все работает нормально, и wget имеет правильное соединение.

Еще раз спасибо

Комментарии:

1. пожалуйста, следуйте этому руководству Подключите интерфейс к серверной части с помощью службы это довольно хороший пример того, как подключить интерфейс к серверной части с помощью служб k8s. Как указано в комментариях с точки зрения k8, это следует более тщательно изучить, но, согласно приведенным примерам, довольно сложно понять, где (за сценой) проблема.