Есть ли способ, которым этот скрипт обнаруживает ошибку (например, ErrImagePull) с модулем, и когда это происходит, происходит сбой?

#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 }'