Готовность-Зонд другой Сервис по загрузке 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
Другие вопросы по тегам