В разборе на DZone Александр Фо описал сбой, при котором контейнеры Kubernetes раз за разом перезапускались, а в журнале оставалась только строка «Loading config…». Приложение при запуске пыталось подключиться к Kafka, системе для передачи потоков сообщений, и зависало в ожидании соединения.

По словам Фо, приложение обращалось к частному адресу сервера Kafka, недоступному с узлов, на которых работали контейнеры. Ответ на попытку TCP-подключения не приходил, а Kubernetes завершал контейнер, не дождавшись успешного запуска.

В тестовой среде переход на публичный адрес сервера остановил перезапуски. Для рабочей среды Фо советует исправить маршрутизацию, а в клиентских библиотеках явно задать короткий тайм-аут подключения.

Для диагностики он рекомендует смотреть сетевой трафик или системные вызовы процесса, когда журнал приложения больше ничего не показывает.

Проверка утверждений:

  • Александр Фо опубликовал разбор перезапусков контейнеров Kubernetes из-за зависшего TCP-подключения к серверу Kafka. (подтверждено самой публикацией: доказательство; «This is the story of chasing that silence to its root cause. TCP connection that was never going to succeed, and never going to fail either. At least not on any timescale a Kubernetes health check was willing to wait for.»)
  • В описанном сбое контейнеры раз за разом перезапускались, а в журнале оставалась только строка «Loading config…». (подтверждено самой публикацией: доказательство; «The change looked trivial: swap one connection string for another, restart the pods, watch them come up. Instead, every pod that touched Kafka went straight into a crash loop. The only clue was that single “Loading config” line. Repeated forever.»)
  • Приложение подключалось к Kafka при запуске, прежде чем сообщить об успешном запуске. (подтверждено самой публикацией: доказательство; «But the service’s startup path connected to Kafka before reporting itself healthy.»)
  • Частный адрес сервера Kafka был недоступен с группы узлов, на которых работали контейнеры. (подтверждено самой публикацией: доказательство; «In this case, the broker endpoint we’d configured was a private, VPC-internal address. It was reachable from some parts of the network, but not from the specific node group these pods landed on.»)
  • Ответ на попытку TCP-подключения не приходил. (подтверждено самой публикацией: доказательство; «A SYN packet went out toward the broker; no SYN-ACK ever came back, and critically, no RST came back either.»)
  • Kubernetes завершал контейнер, не дождавшись успешного запуска, и запускал его снова. (подтверждено самой публикацией: доказательство; «It just saw a container that hadn’t become healthy in time. So it did the only thing it can do here: kill it and try again.»)
  • В тестовой среде переход на публичный адрес сервера Kafka остановил перезапуски, а для рабочей среды Фо рекомендует исправить маршрутизацию. (подтверждено самой публикацией: доказательство; «The actual fix was almost anticlimactic: switch to the broker’s public endpoint. In a real production setup, you’d instead fix the VPC routing or peering. That makes the private endpoint reachable from every node group that needs it. Once the TCP path was real, the connection succeeded instantly, and the crash loop stopped.»)
  • Фо рекомендует явно задавать короткий тайм-аут подключения в клиентских библиотеках. (подтверждено самой публикацией: доказательство; «Set explicit, short connect timeouts in your client libraries . Don’t let a startup path inherit the OS’s default TCP connect timeout.»)
  • Когда журнал приложения не помогает, Фо рекомендует смотреть сетевой трафик или системные вызовы процесса. (подтверждено самой публикацией: доказательство; «Once “look at the application logs” stopped being useful, the next step was to get underneath the application entirely. Shelling into a node and watching the raw traffic ( tcpdump ) tells you what actually happened at the OS level. So does tracing the process’s syscalls with strace . Neither depends on whether the application ever got to log anything about it.»)

Первоисточники:

оценка 50,3 из 100 · тип: руководство