Aggiorna il contenitore Docker senza tempi di inattività


17

Diciamo che ho un contenitore Docker con un server web (come Apache 2). Ora voglio aggiornare il sistema operativo sotto di esso. Questa risposta SF dice che il modo migliore è ricostruire l'immagine di base e la mia immagine Apache. La distribuzione dell'immagine significa tempi di inattività perché devo eliminare il vecchio contenitore prima di poter creare quello nuovo, quindi esiste un solo contenitore che si collega alla porta 80/443.

Ma come posso distribuire questo aggiornamento senza tempi di inattività? Dovrei usare un bilanciamento del carico e utilizzare la comunicazione tra container? E come posso aggiornare il bilanciamento del carico?

Risposte:


18

Lo scenario target ideale

Sì, è necessario utilizzare un bilanciamento del carico e aggiornare un'istanza alla volta. Non sono sicuro di dove arrivi la comunicazione tra container.

Ad esempio, immagina di avere un bilanciamento del carico che serve il tuo sito A. Gli utenti si connettono ad esso solo come e lo conoscono solo come "A". Il bilanciamento del carico sa che ci sono due o più backend (B, C, ecc.) E non importa se sono VM o container.

Quindi, si desidera aggiornare i backend, che in questo caso sono istanze di Apache.

  1. togliere B dai backend idonei per il bilanciamento del carico in modo che non accetti più traffico.
  2. attendere che le richieste attualmente attive vengano servite e le connessioni esistenti chiuse.
  3. aggiorna il contenitore o la macchina virtuale sottostante che serve B
  4. riavviare B, attendere il caricamento e iniziare a lavorare
  5. prova B per assicurarti di soddisfare correttamente le nuove richieste
  6. aggiungere B al pool back-end del bilanciamento del carico per riattivare il traffico

Quindi, fai lo stesso processo per C, D, ecc.

Si noti che esiste una richiesta aperta per gli aggiornamenti sul posto dei contenitori Docker , da novembre 2013, ma non sembra avere molti progressi, quindi la soluzione di cui sopra è ciò che si dovrebbe fare nel frattempo.

Cosa fare per un sito live esistente

Presumibilmente, lo stai chiedendo perché stai già eseguendo un sito live in questo modello e desideri aggiornarlo senza tempi di inattività. Quindi, dobbiamo raggiungere lo stato target ideale sopra, ma in modo incrementale.

Supponiamo che:

  • hai un nome DNS che punta al tuo contenitore
  • il tuo contenitore gira su qualche indirizzo IP
  • i tuoi utenti non conoscono l'indirizzo IP del contenitore e non sono codificati da nessuna parte

Se questi presupposti sono falsi, è necessario innanzitutto correggerlo in modo che sia corretto.

Quindi, attenersi alla seguente procedura:

  1. creare un bilanciamento del carico su un nuovo IP e puntarlo al contenitore esistente come unico back-end
  2. cambia DNS in modo che punti direttamente al bilanciamento del carico anziché all'IP del contenitore
  3. aggiungere un backend Apache identico con la stessa configurazione del contenitore VM +
  4. ora hai un bilanciamento del carico con due backend B e C, quindi segui le istruzioni nella sezione "scenario target ideale" per aggiornarli uno alla volta

Come aggiornare un bilanciamento del carico

Il modo semplice (ospitato)

L'opzione più semplice è non eseguire il proprio bilanciamento. Ad esempio, se si utilizza una piattaforma cloud che fornisce il bilanciamento del carico come servizio, è consigliabile utilizzarlo e quindi la manutenzione e l'aggiornamento del bilanciamento del carico non rappresentano un problema.

Il modo manuale

Se si esegue il proprio bilanciamento del carico, sarà utile aggiungere un altro livello di riferimento indiretto (ovvero DNS). Supponiamo che:

  • che abbiamo un nome host che si risolve nell'IP del nostro bilanciamento del carico A che vorremmo aggiornare
  • il nostro bilanciamento del carico ha un pool back-end di P1, P2, ecc.

Procediamo come segue:

  • creare un nuovo bilanciamento del carico B con la nuova versione del software
  • aggiungere tutte le istanze del pool back-end P1, P2, ecc. al nostro nuovo bilanciamento del carico B come back-end
  • aggiungi l'indirizzo IP di B alla risoluzione DNS insieme ad A

    • ora stiamo effettivamente utilizzando DNS come bilanciamento del carico
    • se le voci per A e B non sono ponderate, sono effettivamente 50-50
    • ora guarda per vedere come si comporta B, se ci sono errori, ecc.
    • se qualcosa non va in B, annulla come segue:

      1. rimuovere B dalla configurazione DNS
      2. attendere che scompaia la voce B nel DNS (ovvero attendere che scada il TTL )
      3. abbassa B
  • supponiamo di aver fatto il test "burn-in" per B e che tutto vada bene
  • aggiorna gradualmente la priorità e il peso di B in DNS
  • rimuovere completamente A da DNS
  • attendere la scadenza del DNS TTL; A non dovrebbe più ricevere richieste
  • abbassa A

e hai finito.

Dettagli, diagrammi e strumenti

Vedi questi articoli e strumenti che possono aiutarti ad automatizzare il processo, ma l'idea generale è la stessa:

La morale

"Tutti i problemi nell'informatica possono essere risolti da un altro livello di riferimento indiretto, tranne ovviamente per il problema di un numero eccessivo di riferimenti indiretti." - David Wheeler


Ma quando anche il bilanciamento del carico si trova in un contenitore (quando si utilizza CoreOS), come posso aggiornare questo contenitore?
das_j,

@das_j Ho modificato la risposta per aggiungere howto anche per l'aggiornamento di un bilanciamento del carico. Suggerimento: si tratta di un altro livello di riferimento indiretto. :-)
Misha Brukman

1
Tutto sommato, suona come si aggiornerebbero anche i server fisici e i bilanciatori del carico fisico.
Stefan Lasiewski,

@StefanLasiewski hai perfettamente ragione e ho rimosso la nota "contenitori" in una delle intestazioni. Per un utente esterno, se un'app o un bilanciamento del carico sono in esecuzione su bare metal, container o VM, è in gran parte invisibile.
Misha Brukman,
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.