#bash #shell #kubernetes #sh
#bash #оболочка #kubernetes #sh
Вопрос:
У меня есть скрипт, который проверяет модули в пространстве имен, и когда все модули становятся готовыми, он успешно завершается.
Что мне нужно сделать, так это изменить этот скрипт таким образом, чтобы при обнаружении и ошибке (например, ErrImagePull) в состоянии модуля он немедленно завершался сбоем.
Скрипт работает таким образом. scriptname.sh 120 2 — это означает, что скрипт выполняется в течение 120 секунд и проверяется каждые 2 секунды.
Если он обнаруживает состояние готовности до 120 секунд, он завершается, если нет, он остается на 120 секунд и завершается.
Это сценарий :
#!/usr/bin/env bash
# Copyright 2017, Z Lab Corporation. All rights reserved.
# Copyright 2017, Kubernetes scripts contributors
#
# For the full copyright and license information, please view the LICENSE
# file that was distributed with this source code.
set -e
function __is_pod_ready() {
[[ "$(kubectl get po "$1" -o 'jsonpath={.status.conditions[?(@.type=="Ready")].status}')" == 'True' ]]
}
function __pods_ready() {
local pod
[[ "$#" == 0 ]] amp;amp; return 0
for pod in $pods; do
__is_pod_ready "$pod" || return 1
done
return 0
}
function __wait-until-pods-ready() {
local period interval i pods
if [[ $# != 2 ]]; then
echo "Usage: wait-until-pods-ready PERIOD INTERVAL" >amp;2
echo "" >amp;2
echo "This script waits for all pods to be ready in the current namespace." >amp;2
return 1
fi
period="$1"
interval="$2"
for ((i=0; i<$period; i =$interval)); do
pods="$(kubectl get po -o 'jsonpath={.items[*].metadata.name}')"
if __pods_ready $pods; then
return 0
fi
echo "Waiting for pods to be ready..."
sleep "$interval"
done
echo "Waited for $period seconds, but all pods are not ready yet."
return 1
}
__wait-until-pods-ready $@
# vim: ft=sh :
Ответ №1:
kubectl get pods | awk 'NR > 1 amp;amp; $3 != "Running" { $3=="ImagePullBackOff"?err=2:err=1;exit err }'
Большая часть обработки для этого, скорее всего, может быть достигнута с помощью awk. Передайте вывод команды kubectl и проверьте наличие любых строк, отличных от заголовка (NR> 1), которые не равны «Running». В этих случаях проверьте наличие текста «ImagePullBackOff». Если он найден, завершите работу с кодом ошибки 2, иначе завершите работу с ошибкой 1. Во всех других случаях, то есть во всех запущенных модулях, awk завершится с 0.
Если вы хотите проверить наличие дополнительных ошибок, вы можете заменить? условный оператор с оператором if и так:
kubectl get pods | awk 'NR > 1 amp;amp; $3 != "Running" { if ($3=="ImagePullBackOff") { err=2 } if ($3 == "ErrImagePull") { err=2 } else { err=1 };exit err }'