Готовность-Зонд другой Сервис по загрузке Pod
На моей установке Kubernetes у меня есть 2 службы - A и B.
Сервис B зависит от того, полностью ли запущен Сервис A. Теперь я хотел бы установить датчик готовности TCP в модулях службы B, чтобы они проверяли, работает ли какая-либо часть службы A в полном объеме.
Раздел ReadinessProbe развертывания в Сервисе B выглядит следующим образом:
readinessProbe:
tcpSocket:
host: serviceA.mynamespace.svc.cluster.local
port: 1101 # same port of Service A Readiness Check
Я могу применить эти изменения, но проверка готовности не работает с:
Readiness probe failed: dial tcp: lookup serviceB.mynamespace.svc.cluster.local: no such host
Я использую то же имя хоста в других местах (например, я передаю его как ENV в контейнер), и он работает и решается.
У кого-нибудь есть идея заставить готовность работать для другого сервиса или сделать какой-то другой вид проверки зависимостей между сервисами? Спасибо:)
2 ответа
В связи с тем, что зонды готовности и живучести полностью управляются kubelet
Агент узла и Kubelet наследуют службу обнаружения DNS от конкретной конфигурации узла, вы не можете разрешить записи DNS внутреннего сервера имен K8s:
Для зонда Kubelet устанавливает соединение зонда на узле, а не в модуле, что означает, что вы не можете использовать имя службы в параметре хоста, так как Kubelet не может его разрешить.
Вы можете рассмотреть сценарий, когда ваш исходный Pod A потребляет IP-адрес узла, распространяя hostNetwork: true
параметр, таким образом kubelet
может достигать и успешно проверять готовность из Pod B, как описано в официальной документации k8s:
tcpSocket:
host: Node Hostname or IP address where Pod A residing
port: 1101
Тем не менее, я нашел стековую ветку, где вы можете получить более эффективное решение для достижения того же результата с помощью Init Containers.
В дополнение к ответу Nick_Kh другим обходным путем является использование probe by command, которая выполняется в контейнере.
Чтобы выполнить зонд, kubelet выполняет команду cat /tmp/healthy в целевом контейнере. В случае успеха команда возвращает 0, и kubelet считает контейнер живым и работоспособным.
Пример:
readinessProbe:
exec:
command:
- sh
- -c
- wget -T2 -O- http://service