#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, это следует более тщательно изучить, но, согласно приведенным примерам, довольно сложно понять, где (за сценой) проблема.