Riavviare i pod quando la mappa di configurazione si aggiorna in Kubernetes?


121

Come faccio a riavviare automaticamente i pod Kubernetes e i pod associati alle distribuzioni quando la loro mappa di configurazione viene modificata / aggiornata?


So che si è parlato della possibilità di riavviare automaticamente i pod quando una mappa di configurazione cambia, ma per quanto ne so questo non è ancora disponibile in Kubernetes 1.2.

Quindi quello che (penso) vorrei fare è un "riavvio continuo" della risorsa di distribuzione associata ai pod che consumano la mappa di configurazione. È possibile, e in tal caso come, forzare un riavvio continuo di una distribuzione in Kubernetes senza modificare nulla nel modello effettivo? Questo è attualmente il modo migliore per farlo o esiste un'opzione migliore?


$ kubectl set env deployment my deployment --env="LAST_RESTART=$(date)" --namespace ...fai il lavoro per me
maciek

Risposte:


60

La segnalazione di un pod durante l'aggiornamento della mappa di configurazione è una funzionalità in lavorazione ( https://github.com/kubernetes/kubernetes/issues/22368 ).

Puoi sempre scrivere un pid1 personalizzato che noti che la mappa di configurazione è cambiata e riavvia la tua app.

Puoi anche, ad esempio: montare la stessa mappa di configurazione in 2 contenitori, esporre un controllo di integrità http nel secondo contenitore che fallisce se l'hash del contenuto della mappa di configurazione cambia e spingerlo come sonda di vivacità del primo contenitore (perché i contenitori in un pod condivide lo stesso spazio dei nomi di rete). Il kubelet riavvierà il tuo primo contenitore per te quando la sonda fallisce.

Ovviamente se non ti interessa su quali nodi si trovano i pod, puoi semplicemente eliminarli e il controller di replica li "riavvierà" per te.


Con "eliminazione pod" intendi: raccogliere tutti i nomi dei pod, eliminarne uno, attendere la sostituzione, eliminare il secondo, attendere fino alla sostituzione, ecc. Corretto?
Torsten Bronger

6
utilizzando una distribuzione, la scalerei verso il basso e poi verso l'alto. Avrai comunque quella piccola quantità di tempo morto. Puoi farlo in una riga per ridurlo ... kubectl scale deployment/update-demo --replicas=0; kubectl scale deployment/update-demo --replicas=4;
Nick H

Se non vuoi trovare tutti i pod e non ti interessano i tempi di inattività, rimuovi semplicemente l'RC e quindi ricrea l'RC.
Drew

1
Questo significa che il volume su cui è montato è aggiornato e devi solo rileggere il file sul pod senza riavviare l'intero pod?
Matt Williamson

@ NickH Veloce e sporco, fortunatamente il tempo di inattività era accettabile nel mio caso e ha funzionato benissimo, grazie!
ChocolateAndCheese

129

L'attuale migliore soluzione a questo problema (referenziato in profondità in https://github.com/kubernetes/kubernetes/issues/22368 collegato nella risposta del fratello) è utilizzare le distribuzioni e considerare le tue ConfigMaps immutabili.

Quando si desidera modificare la configurazione, creare una nuova ConfigMap con le modifiche che si desidera apportare e indirizzare la distribuzione alla nuova ConfigMap. Se la nuova configurazione non funziona, la distribuzione rifiuterà di ridimensionare il ReplicaSet funzionante. Se la nuova configurazione funziona, il tuo vecchio ReplicaSet verrà ridimensionato a 0 repliche ed eliminato e i nuovi pod verranno avviati con la nuova configurazione.

Non abbastanza veloce come modificare la ConfigMap in posizione, ma molto più sicuro.


2
Questo è l'approccio che abbiamo adottato anche noi
Johan

5
Vale la pena ricordare che il nuovo strumento sperimentale kustomizesupporta la creazione automatica di un hash della mappa di configurazione deterministico, il che significa che non è necessario creare manualmente una nuova mappa di configurazione: github.com/kubernetes-sigs/kustomize/blob/…
Simmetrico

Questo è ciò che Spinnaker fa dietro le quinte, quindi se lo usi, non dovresti preoccuparti di questo.
Gus

32

Il modo migliore che ho trovato per farlo è eseguire Reloader

Ti consente di definire mappe di configurazione o segreti per guardare, quando vengono aggiornati, viene eseguito un aggiornamento continuo della tua distribuzione. Ecco un esempio:

Hai una distribuzione fooe una ConfigMap chiamata foo-configmap. Vuoi eseguire il roll dei pod della distribuzione ogni volta che viene modificata la mappa di configurazione. Devi eseguire Reloader con:

kubectl apply -f https://raw.githubusercontent.com/stakater/Reloader/master/deployments/kubernetes/reloader.yaml

Quindi specifica questa annotazione nella tua distribuzione:

kind: Deployment
metadata:
  annotations:
    configmap.reloader.stakater.com/reload: "foo-configmap"
  name: foo
...

Reloader è compatibile con kubernetes> = 1.9
jacktrade il

31

https://github.com/kubernetes/helm/blob/master/docs/charts_tips_and_tricks.md#user-content-automatically-roll-deployments-when-configmaps-or-secrets-change

Spesso le mappe di configurazione o i segreti vengono iniettati come file di configurazione nei contenitori. A seconda dell'applicazione potrebbe essere necessario un riavvio nel caso in cui questi vengano aggiornati con un successivohelm upgrade , ma se la specifica di distribuzione stessa non è cambiata, l'applicazione continua a funzionare con la vecchia configurazione risultando in una distribuzione incoerente.

La sha256sumfunzione può essere utilizzata insieme alla includefunzione per garantire che una sezione del modello di distribuzioni venga aggiornata se un'altra specifica cambia:

kind: Deployment
spec:
  template:
    metadata:
      annotations:
        checksum/config: {{ include (print $.Template.BasePath "/secret.yaml") . | sha256sum }}
[...]

Nel mio caso, per alcuni motivi, $.Template.BasePathnon ha funzionato ma $.Chart.Namefunziona:

spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: admin-app
      annotations:
        checksum/config: {{ include (print $.Chart.Name "/templates/" $.Chart.Name "-configmap.yaml") . | sha256sum }}

8
Non applicabile all'utilizzo generale di Kubernetes, applicabile solo a Helm
Emii Khaos

2
La risposta è utile ma probabilmente non pertinente a questa domanda
Anand Singh Kunwar

helm3 è stato rilasciato di recente. Pertanto, il collegamento è obsoleto. Indica il masterramo. Il seguente URL porterà agli ultimi helm2 documenti (attualmente) : github.com/helm/helm/blob/release-2.16/docs/…
Marcel Hoyer

Ottima soluzione. Sono passato a sha1sum, poiché nel mio caso sha256sum aveva 65 caratteri che risultavano Deployment.apps "xxx" is invalid: metadata.labels: Invalid value: "xxx": must be no more than 63 characters. L'alternativa sarebbe | trunc 63, ma sha1sum dovrebbe essere "più unico".
iptizer

11

Puoi aggiornare un'etichetta di metadati che non è rilevante per la tua distribuzione. attiverà un aggiornamento continuo

per esempio:

metadata:
  labels:
    configmap-version: 1

Sto cercando documenti sui metadati: labels: configmap-version: 1
c4f4t0r

7
le modifiche alle etichette dei metadati non attivano il riavvio dei pod
dan carter

Questa risposta ha voti positivi, quindi devo chiedere. Se aggiorniamo i metadati, il cluster Kubernetes attiverà un aggiornamento continuo? @ maoz-zadok
titus

1
Credo che funzioni finché l'etichetta dei metadati è sottotemplate.spec
Saikiran Yerram

1

Aveva questo problema in cui la distribuzione era in un sottografico ei valori che la controllavano erano nel file dei valori del grafico principale. Questo è ciò che abbiamo usato per attivare il riavvio:

spec:
  template:
    metadata:
      annotations:
        checksum/config: {{ tpl (toYaml .Values) . | sha256sum }}

Ovviamente questo attiverà il riavvio su qualsiasi modifica di valore, ma funziona per la nostra situazione. Ciò che era originariamente nel grafico figlio avrebbe funzionato solo se il file config.yaml nel grafico figlio stesso fosse cambiato:

    checksum/config: {{ include (print $.Template.BasePath "/config.yaml") . | sha256sum }}

0

Faccio la soluzione dei quanti e funziona perfettamente. Ma quello che non capisco è che il pod in realtà non si riavvia ... Il pod è sempre lo stesso ma il cambiamento c'è!

Ad esempio: il pod è in esecuzione da 50min e cambio qualcosa e il cambiamento è online, posso vederlo sul mio browser e il pod è ancora in esecuzione + 50min !! Sto usando Helm3 ... Sai cosa lo rende possibile senza riavviare l'aggiornamento della configurazione?


1
Ok! Lo scopro ... Perché abbiamo montato la nostra mappa di configurazione come un volume e l'abbiamo aggiornata dinamicamente ... Ecco perché quando faccio questa roba di "'checksum' 'il mio pod non si riavvia ma le modifiche ci sono! Suggerisco come buona soluzione :)
Ibrahim Yesilay

-1

Un altro modo è inserirlo nella sezione dei comandi della distribuzione:

...
command: [ "echo", "
  option = value\n
  other_option = value\n
" ]
...

In alternativa, per renderlo più simile a ConfigMap, usa una distribuzione aggiuntiva che ospiterà semplicemente quella configurazione nella commandsezione ed eseguirà kubectl createsu di essa aggiungendo una 'versione' univoca al suo nome (come calcolare un hash del contenuto) e modificando tutto il distribuzioni che utilizzano quella configurazione:

...
command: [ "/usr/sbin/kubectl-apply-config.sh", "
  option = value\n
  other_option = value\n
" ]
...

Probabilmente posterò kubectl-apply-config.sh se finisce per funzionare.

(non farlo; sembra troppo brutto)

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.