Под получает трафик, даже если проверка готовности Kubernetes завершилась неудачно

У меня есть одно приложение, которое серверы для запроса REST, а также слушает тему Kafka. Я развернул приложение в Kubernetes и настроил проверку готовности следующим образом

readinessProbe:
  exec:
    command:
    - cat
    - /tmp/healthy
  initialDelaySeconds: 5
  periodSeconds: 5

в основном следуя инструкциям из https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/

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

Readiness probe failed: cat: can't open '/tmp/healthy': No such file or directory

Это ожидается. Потом отправил в тему сообщение кафки. Я заметил, что

1) сообщение kafka было использовано моим приложением и сохранено в базе данных.
2) остальные api недоступны.

Я предположил, что если проверка готовности модуля завершится неудачно, приложение не сможет получить ни сообщение kafka, ни остальной запрос. Но почему в моем тесте запрос REST и сообщение Kafka обрабатываются по-разному.

Согласно документации Kubernete:

The kubelet uses readiness probes to know when a Container is ready to start accepting traffic

Но не совсем ясно, что это за трафик на самом деле. Кубернетес ограничивает HTTP-трафик на модуль только в случае сбоя проверки готовности, но не ограничивает трафик TCP (поскольку Kafka работает по протоколу TCP)?

Мое фактическое намерение состоит в том, чтобы мое служебное приложение (потребитель kafka) могло контролировать, когда получать сообщения kafka (а также запрос REST). Например, если будет тяжелая операция, моя служба удалит файл / tmp / Healthy и, таким образом, сделает модуль не готовым для получения сообщения kafka и запроса на отдых. Когда тяжелая операция завершена, приложение записывает исправный файл, чтобы подготовить модуль к приему сообщения.

Еще немного информации, в моем тесте версия kubernetes - v1.14.3, а брокер kafka работает в отдельной виртуальной машине за пределами kubernetes.

1 ответ

Решение

Это две очень разные вещи:

  • Получение запросов: внешняя служба отправляет запрос и ожидает ответа.
  • Отправка запросов: ваша служба отправляет запрос и ожидает ответа.

Готовность

При сбое ReadinessProbe новые запросы не будут перенаправляться на модуль.

Потребитель Kafka

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

Проверить наличие необходимого каталога

невозможно открыть '/tmp/ Healthy': нет такого файла или каталога

Если каталог /tmp/healthy необходим для правильной работы службы, служба должна проверять это при запуске и exit(1)(сбой с сообщением об ошибке), если требуемый каталог недоступен. Это нужно сделать перед подключением к Kafka. Если ваше приложение постоянно использует каталог, например, записывает в него, любые коды ошибок операций следует проверять и обрабатывать должным образом - регистрировать и аварийно завершать работу в зависимости от вашей ситуации.

Использование сообщений Kafka

Мое фактическое намерение состоит в том, чтобы мое служебное приложение (потребитель kafka) могло контролировать, когда получать сообщения kafka (а также запрос REST). Например, если будет тяжелая операция, моя служба удалит файл / tmp / Healthy и, таким образом, сделает модуль не готовым для получения сообщения kafka и запроса на отдых.

Потребители Kafka опрашивают Kafka, чтобы получить больше данных, когда захотят. Другими словами, потребитель Kafka запрашивает больше данных, когда он готов к большему количеству данных.

Пример потребительского кода:

 while (true) {
     ConsumerRecords<String, String> records = consumer.poll(100);
     for (ConsumerRecord<String, String> record : records) {
         // process your records
     }
 }

Запомни commitзаписи, которые вы обработали, чтобы сообщения не обрабатывались несколько раз, например, после сбоя.

Другие вопросы по тегам