Tcp-Соединение Заблокировано Во Время Завершения Работы Pod В Kubernetes

  • Автор темы In2tion
  • Обновлено
  • 22, Oct 2024
  • #1

У меня есть кластер, работающий на AWS EKS, v1.20.7-eks-d88609.

У меня есть модуль и служба NodePort, чтобы открыть его для внешнего мира.

Некоторые клиенты будут подключаться к нему через TCP-соединение, которое будет поддерживаться в рабочем состоянии.

Однако я пытался настроить плавное завершение соединения при завершении работы модуля, перехватив SIGTERM и отправив последнее сообщение в TCP-соединение, сообщающее клиентам отключиться.

Проблема в том, что эти последние TCP-пакеты (отправленные после обнаружения SIGTERM) никогда не доходят до места назначения.

Я запустил tcpdump внутри модуля и подтвердил, что пакет отправляется правильно: https://imgur.com/Bhy6fL1

Но он не доходит до места назначения (где у меня был еще один tcpdump, чтобы это проверить)

TCP даже пытается повторно передать пакет, поскольку подтверждение на него не получено, но ни один из них не может достичь пункта назначения.

Мне не удалось воспроизвести это в локальном кластере Minikube с той же версией Kubernetes (1.20.7). В этом локальном кластере дела шли хорошо.

Я не уверен, что это лучший способ отладки в кластере AWS EKS. Похоже, это какая-то проблема, вызванная чем-то внутри Kubernetes, поскольку приложение пытается отправить пакет.

#кубернетес

In2tion


Рег
08 Jun, 2014

Тем
70

Постов
201

Баллов
581
  • 25, Oct 2024
  • #2

Через некоторое время я нашел проблему, добавлю сюда ответ, если кто-то обнаружит это в будущем.

По сути, моя проблема была именно такой, как описано в https://github.com/aws/amazon-vpc-cni-k8s/issues/1531

В моем кластере был установлен Calico, и я использовал версию с ошибкой, которая блокировала работу сети Pod на этапе завершения.

Этому руководству я следовал при установке Calico: https://docs.aws.amazon.com/eks/latest/userguide/calico.html

Все, что мне нужно было сделать, чтобы решить проблему, — это удалить Calico и установить его снова, используя более новую версию (снова следуя этому же руководству).


Дополнительный совет:

Одна из вещей, которая помогла мне отладить эту проблему, заключалась в том, чтобы убедиться, что мои приложения не виноваты в таком поведении.

Я сделал это, запустив tcpdump в модуле и перенаправив его выходные данные в локальный Wireshark для визуализации. Посмотрите это: https://downey.io/blog/kubernetes-ephemeral-debug-container-tcpdump/

После того, как я узнал, что мои приложения отправляют трафик правильно, я понял, что проблема заключается в чем-то внутри Kubernetes, и начал искать возможных виновников.

 

Иван Н.


Рег
03 Aug, 2006

Тем
78

Постов
208

Баллов
598
Похожие темы Дата
Похожие темы
Веб-Сервисы Amazon. Какова Политика Вашей Компании В Отношении Надежности Данных S3?
Веб-Сервисы Amazon. Можно Ли Развернуть Rds В Нескольких Регионах В Aws С Репликой Для Чтения И Записи?
Kubernetes — Автосинхронизация Argocd На Основе Тега `Latest` Docker Image
Где Сказано, Что Я Могу Безопасно Использовать Один И Тот Же Локальный Том Для Нескольких Контейнеров Докеров?
Какие Есть Готовые Варианты Создания Микросервиса, Который Обращается К Интерфейсу Rest И Показывает Результат В Виде Графика?
Аудит. Почему `Docker Diff` Не Видит Некоторые Изменения Файлов?
Kubernetes — Микрометр, Раскрывающий Метрики Привода, Метрики Kube-State-Metrics И Метрики-Сервер Для Установки Запросов/Ограничений Модуля
Есть Ли Плагин Jenkins Для Загрузки Исходного Кода?
Веб-Сервисы Amazon — Как Автоматизировать Процесс Исправления Экземпляров Jenkins Slave В Aws
Сеть. Как Перейти От «Создания Docker-Machine»?
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно