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}"