Come costringo Kubernetes a ritirare un'immagine?


161

Ho il seguente controller di replica in Kubernetes su GKE:

apiVersion: v1
kind: ReplicationController
metadata:
  name: myapp
  labels:
    app: myapp
spec:
  replicas: 2
  selector:
    app: myapp
    deployment: initial
  template:
    metadata:
      labels:
        app: myapp
        deployment: initial
    spec:
      containers:
      - name: myapp
        image: myregistry.com/myapp:5c3dda6b
        ports:
        - containerPort: 80
      imagePullPolicy: Always
      imagePullSecrets:
        - name: myregistry.com-registry-key

Ora, se lo dico

kubectl rolling-update myapp --image=us.gcr.io/project-107012/myapp:5c3dda6b

viene eseguito l'aggiornamento progressivo, ma non è necessario ripetere l'operazione. Perché?


12
Ho dato un'immagine diversa, solo con lo stesso tag. Se è necessario assegnare un tag diverso, beh, non vedo alcun punto nel imagePullPolicycampo.
Torsten Bronger,

4
Voglio usare un tag specifico, ma la sua versione più recente.
Torsten Bronger,

3
@TorstenBronger Penso che questo sia un cambiamento radicale nella teoria di Kubernetes / Docker. L'idea che potresti estrarre l'immagine: tag (diverso dall'ultimo) in due momenti diversi e ottenere due immagini diverse sarebbe problematica. Un tag è simile a un numero di versione. Sarebbe meglio cambiare sempre il tag quando l'immagine cambia.
duct_tape_coder

2
Dipende. Esiste un software con un'API molto stabile ma aggiornamenti di sicurezza. Quindi, voglio l'ultima versione senza doverlo dire esplicitamente.
Torsten Bronger,

1
@TorstenBronger Per quanto riguarda l'utilizzo latest, non farlo. L'ultimo tirerà l'immagine, beh, più recente con l'ultimo tag. Quello che vuoi è una gamma SemVer. ~ 1.2.3 per esempio. questo tirerà le immagini con tag nell'intervallo> = 1.2.3 e <1.3.0. Fintanto che il fornitore di immagini segue SemVer, lo sapete (e questa è la parte importante) non sono state aggiunte modifiche all'indietro (di proposito) e non sono state aggiunte nuove funzionalità (possibili problemi di sicurezza). Per favore, non usare mai latestnei sistemi di produzione.
David J Eddy,

Risposte:


141

Kubernetes tirerà su Creazione pod se uno dei due (vedi documento di aggiornamento delle immagini ):

  • Utilizzando le immagini taggate :latest
  • imagePullPolicy: Always è specificato

Questo è fantastico se vuoi sempre tirare. Ma cosa succede se si desidera farlo su richiesta : ad esempio, se si desidera utilizzare some-public-image:latestma si desidera estrarre manualmente una versione più recente solo quando viene richiesta. Al momento puoi:

  • Set imagePullPolicyper IfNotPresento Nevere pre-pull : le immagini manualmente tirare ogni nodo del cluster in modo che il più recente viene memorizzato nella cache, poi fare una kubectl rolling-updateo simile per riavviare Pods (brutto hack facilmente rotto!)
  • Cambia temporaneamenteimagePullPolicy , fai un kubectl apply, riavvia il pod (ad es. kubectl rolling-update), Ripristina imagePullPolicy, ripeti un kubectl apply(brutto!)
  • Tirare e spingere some-public-image:latest nel proprio repository privato e fare un kubectl rolling-update(pesante!)

Nessuna buona soluzione per pull on demand. Se ciò cambia, si prega di commentare; Aggiornerò questa risposta.


Dici che kubernetes tirerà su la creazione di Pod quando usi :latest- che ne dici di patching? estrae sempre anche l'immagine più recente / più recente? Sembra non funzionare per me :(
pkyeck,

Dipende se la patch impone o meno la ricostruzione di un pod. Molto probabilmente no, quindi non tirerà di nuovo. Puoi uccidere il Pod manualmente o tag con qualcosa di unico e patch con quel tag aggiornato.
Wernight,

Questa è una risposta a una domanda diversa. Ho chiesto di forzare un re-pull.
Torsten Bronger,

Questo mi ha permesso di forzare un nuovo pull da GCR. Avevo un :latesttag che indicava una nuova immagine e ho kubectl rolling-updatelavorato per aggiornare i pod.
Randy L

Grazie. Sono andato per l'approccio Pull & Push. Automatizzato il più possibile con script bash ma concordato, è pesante :)
arcseldon

77

Uno deve raggruppare imagePullPolicyall'interno dei dati del contenitore anziché all'interno dei dati delle specifiche. Tuttavia, ho presentato un problema a riguardo perché lo trovo strano. Inoltre, non vi è alcun messaggio di errore.

Quindi, questo frammento di specifica funziona:

spec:
  containers:
  - name: myapp
    image: myregistry.com/myapp:5c3dda6b
    ports:
    - containerPort: 80
    imagePullPolicy: Always
  imagePullSecrets:
    - name: myregistry.com-registry-key

3
imagePullPolicy(o tagging :latest) è buono se vuoi sempre tirare, ma non risolve la questione di tirare su demande.
Wernight,

1
Sì, voglio sempre tirare, come indicato nella domanda.
Torsten Bronger,

1
Usando imagePullPolicy: Alwaysall'interno della definizione del contenitore verranno kubernetestaggate le immagini con cui taggare :latestogni volta che una versione più recente di esse viene inviata al registro?
pkaramol,

1
@pkaramol No. imagePullPolicy: Alwaysdice semplicemente a Kubernetes di estrarre sempre l'immagine dal registro. Quale immagine sarà configurata per imageattributo. Se lo configuri su image: your-image:latest, tirerà sempre l' your-imageimmagine con il latesttag.
Gajus,

26

Il mio hack durante lo sviluppo è quello di cambiare il mio manifest Deployment per aggiungere l'ultimo tag e tirare sempre così

image: etoews/my-image:latest
imagePullPolicy: Always

Quindi cancello manualmente il pod

kubectl delete pod my-app-3498980157-2zxhd

Poiché è una distribuzione, Kubernetes ricrea automaticamente il pod e estrae l'immagine più recente.


Mi piace sfruttare le premesse "stato desiderato" dell'oggetto "spiegamento" ... grazie per il suggerimento!
Marcello de Sales,

2
Vale la pena notare che la strategia è praticabile solo se gli errori nel servizio e i tempi di inattività sono tollerabili. Per lo sviluppo sembra ragionevole, ma non porterei mai questa strategia per una distribuzione di produzione.
digitaldreamer,

Modifica la distribuzione, cambiando imagePullPolicy in sempre ed eliminando il pod è stato sufficiente per me, come ha suggerito Everett. Questo è un ambiente di sviluppo però. kubernetes.io/docs/concepts/containers/images
Jos Roberto Almaraz,

17

Una soluzione popolare è correggere la distribuzione con un'annotazione fittizia (o etichetta):

kubectl patch deployment <name> -p \
  "{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"date\":\"`date +'%s'`\"}}}}}"

Supponendo che la tua distribuzione soddisfi questi requisiti , ciò farà sì che i K8 estraggano qualsiasi nuova immagine e ridistribuiscano.


2
Sì, uso un'annotazione per questo.
Torsten Bronger,

quale annotazione?
Jeryl Cook,

1
Un'altra soluzione sofisticata sarebbe una combinazione di entrambi. aggiunta di un'annotazione e impostazione ImagePullPolicycome sempre . le annotazioni gradiscono deployment.kubernetes.io/revision: "v-someversion"e kubernetes.io/change-cause: the reasonpossono essere molto utili e si dirigono verso implementazioni immutabili.
chandan,


7

Apparentemente ora quando si esegue un aggiornamento continuo con l' --imageargomento uguale all'immagine contenitore esistente, è necessario specificare anche un --image-pull-policy. Il comando seguente dovrebbe forzare un pull dell'immagine quando è uguale all'immagine del contenitore:

kubectl rolling-update myapp --image=us.gcr.io/project-107012/myapp:5c3dda6b --image-pull-policy Always


6
# Linux

kubectl patch deployment <name> -p "{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"date\":\"`date +'%s'`\"}}}}}"

# windows

kubectl patch deployment <name> -p (-join("{\""spec\"":{\""template\"":{\""metadata\"":{\""annotations\"":{\""date\"":\""" , $(Get-Date -Format o).replace(':','-').replace('+','_') , "\""}}}}}"))

3

Ora, il comando kubectl rollout restart deploy YOUR-DEPLOYMENTcombinato con una imagePullPolicy: Alwayspolitica ti permetterà di riavviare tutti i tuoi pod con una versione più recente della tua immagine.


3

Il comando di aggiornamento progressivo, quando viene fornito un argomento di immagine, presuppone che l'immagine sia diversa da quella attualmente presente nel controller di replica.


Questo significa che il tag immagine (aka nome) deve essere diverso?
Torsten Bronger,

Sì, il nome dell'immagine deve essere diverso se si passa la --imagebandiera.
Robert Bailey,

1
Come dice la mia risposta, funziona anche se il nome dell'immagine è lo stesso. Semplicemente, imagePullPolicy era nel posto sbagliato. A mio avviso, i documenti di k8s 1.0 sono errati in questo aspetto.
Torsten Bronger,

Devi amare quando i documenti non sono sincronizzati con il comportamento. : /
Robert Bailey,

1
Anche quell'URL è obsoleto.
Dan Tenenbaum,

2

È possibile definire imagePullPolicy: Alwaysnel file di distribuzione.


0

La politica di pull delle immagini aiuterà sempre effettivamente a estrarre l'immagine ogni volta che viene creato un nuovo pod (questo può essere in ogni caso come ridimensionare le repliche o il pod muore e viene creato un nuovo pod)

Ma se desideri aggiornare l'immagine del pod corrente, la distribuzione è il modo migliore. Ti lascia un aggiornamento impeccabile senza alcun problema (principalmente quando hai un volume persistente collegato al pod) :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.