2016-05-25 12 views
7

The status of a deployment indica che si può guardare a implementazioni observedGeneration vs generation e quando observedGeneration >= generation poi la distribuzione è riuscita. Va bene, ma sono interessato a sapere quando il nuovo contenitore è in esecuzione in tutti i dei miei pod, in modo che se colpisco un servizio so per certo che sto colpendo un server che rappresenta l'ultimo contenitore distribuito.Garantire kubernetes distribuzione è stata completata e tutti i baccelli vengono aggiornati e disponibili

Un altro suggerimento da un membro di Slack K8S:

kubectl get deployments | grep <deployment-name> | sed 's/ /,/g' | cut -d ' ' -f 4 

ho schierato una cattiva immagine, con conseguente ErrImagePull, ma il dispiegamento ancora riferito il numero corretto di 8 up-date-Data repliche (disponibili repliche era 7).

risposta

11

Aggiornamento # 2: kubernetes 1.5 sarà disponibile con una versione molto migliore di kubectl rollout status e migliorare ancora di più nel 1.6, eventualmente sostituendo mia abitudine soluzione/script disposti sotto.

Update # 1: ho girato la mia risposta in un script hosted on Github che ha ricevuto un numero limitato di PR miglioramento ormai.

risposta originale:

Prima di tutto, credo che il comando kubectl che hai non è corretto: Sostituisce tutti gli spazi bianchi da virgole, ma poi cerca di ottenere il 4 ° campo dopo la separazione da spazi bianchi.

Per verificare che una distribuzione (o il suo aggiornamento) sia stata eseguita su tutti i pod, penso che dovresti controllare se il numero di repliche disponibili corrisponde al numero di repliche desiderate. Ovvero, se le colonne AVAILABLE e DESIRED nell'output kubectl sono uguali. Mentre si potrebbe ottenere il numero di repliche disponibili (il 5 ° colonna) attraverso

kubectl get deployment nginx | tail -n +2 | awk '{print $5}'

e il numero di repliche desiderato (2 ° colonna) attraverso

kubectl get deployment nginx | tail -n +2 | awk '{print $2}'

un modo più pulito è quello di utilizzare L'output di jsonpath di kubectl, specialmente se si desidera prendere in considerazione i requisiti di generazione che la documentazione ufficiale menziona.

Ecco uno script di bash rapido che ho scritto che si aspetta venga assegnato il nome di implementazione sulla riga di comando, attende che la generazione osservata diventi quella specificata, quindi attende che le repliche disponibili raggiungano il numero di quelle specificate :

#!/bin/bash 
set -o errexit 
set -o pipefail 
set -o nounset 

deployment= 

get_generation() { 
    get_deployment_jsonpath '{.metadata.generation}' 
} 

get_observed_generation() { 
    get_deployment_jsonpath '{.status.observedGeneration}' 
} 

get_replicas() { 
    get_deployment_jsonpath '{.spec.replicas}' 
} 

get_available_replicas() { 
    get_deployment_jsonpath '{.status.availableReplicas}' 
} 

get_deployment_jsonpath() { 
    local readonly _jsonpath="$1" 

    kubectl get deployment "${deployment}" -o "jsonpath=${_jsonpath}" 
} 

if [[ $# != 1 ]]; then 
    echo "usage: $(basename $0) <deployment>" >&2 
    exit 1 
fi 

readonly deployment="$1" 

readonly generation=$(get_generation) 
echo "waiting for specified generation ${generation} to be observed" 
while [[ $(get_observed_generation) -lt ${generation} ]]; do 
    sleep .5 
done 
echo "specified generation observed." 

readonly replicas="$(get_replicas)" 
echo "specified replicas: ${replicas}" 

available=-1 
while [[ ${available} -ne ${replicas} ]]; do 
    sleep .5 
    available=$(get_available_replicas) 
    echo "available replicas: ${available}" 
done 

echo "deployment complete." 
+1

Ottima risposta. Grazie! – devth

+2

Aggiornato dalla risposta con un riferimento al molto migliorato 'stato di lancio di kubectl' in 1.5/1.6. –

+0

Eccellente, grazie per l'aggiornamento! – devth

Problemi correlati