Под получает трафик, даже если проверка готовности 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
записи, которые вы обработали, чтобы сообщения не обрабатывались несколько раз, например, после сбоя.