Bash-скрипт для проверки готовности подов openshift/kubernetes

Я пытаюсь создать сценарий оболочки, который проверяет готовность определенных модулей, проверяя заголовок ГОТОВ, показывающий 1/1. Я пробовал два способа.

1.

ready=$(oc get pods | awk '{print $2}' | tail -n +2) # prints 1/1 or 0/1 for each pod
until [[ ${ready} == "1/1" ]]
do
  echo "Waiting for pods to be ready."
  sleep 3
done

Вышеупомянутый сценарий просто продолжает говорить "Ожидание готовности модулей", даже когда модули готовы и отображают 1/1 в столбце ГОТОВ.

2.

while true ; do
  for i in 1 2 3; do
  ready=`oc get pods | awk '{print $2}' | tail -n +2 | head -n $i` 

  if [[ "${ready}" == "1/1" ]]; then
    echo "pods are up and running"
  else
    echo "waiting for pods to be ready"
  sleep 10
  break
  fi
  done
done

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

Любая помощь будет принята с благодарностью, я начинаю с Bash и не совсем уверен, что делать.

3 ответа

Я удивлен, что до сих пор никто не упомянул об экспериментальном, но официальном kubectl, подождите :
$ kubectl wait ([-f FILENAME] | resource.group/resource.name | resource.group [(-l label | --all)]) [--for=delete|--for condition=available]

Следующие решения работают для меня

while [ "$(kubectl get pods -l=app='activemq' -o jsonpath='{.items[*].status.containerStatuses[0].ready}')" != "true" ]; do
   sleep 5
   echo "Waiting for Broker to be ready."
done

Для статуса модуля единственный ответ (модуль может быть запущен, но еще не готов!):

kubectl get pod <pod_name> --output="jsonpath={.status.conditions[*].status}" | cut -d' ' -f2

4 статуса, которые это дает (без трубы):

  • "Инициализировано"
  • "Готово" (капсула готова)
  • "ContainersReady"
  • "PodScheduled"

Все они должны иметь значение True, чтобы модуль считался готовым, но статусы "Готов" и "ContainersReady" становятся истинными только тогда, когда они действительно готовы!

Для отдельных статусов контейнера (должно быть "true"):

kubectl get pod <pod_name> --output="jsonpath={.status.containerStatuses[*].ready}" | cut -d' ' -f2

Если вы хотите проверить статус нескольких модулей, вы можете использовать -l для фильтрации и просто префикса .items[*]:

kubectl get pods -l <key=val> --output="jsonpath={.items[*].status.conditions[*].status}"
Другие вопросы по тегам