Questo tutorial fornisce le pratiche consigliate per la creazione un'applicazione stateful e eseguendo l'upgrade del cluster Google Kubernetes Engine (GKE) che esegue l'applicazione. Questo tutorial utilizza Redis come esempio per il deployment di una ma gli stessi concetti sono applicabili ad altri tipi di di cui è stato eseguito il deployment su GKE.
Obiettivi
Questo tutorial illustra i seguenti passaggi:
- Crea un cluster GKE registrato in un canale di rilascio.
- Crea un cluster Redis su GKE.
- Eseguire il deployment dell'applicazione client Redis su GKE.
- Esegui queste best practice per gli upgrade del pool di nodi:
- Configura il budget di interruzione dei pod (PDB).
- Configura il periodo di manutenzione e le esclusioni.
- Configura la strategia di upgrade dei nodi scegliendo tra upgrade intensivo o upgrade blu/verde.
- Testa l'applicazione.
- Esegui l'upgrade del cluster.
- Testa l'interruzione del carico di lavoro.
Il seguente diagramma mostra una visione generale dell'architettura del cluster per questo tutorial:
Costi
In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:
Per generare una stima dei costi basata sull'utilizzo previsto,
utilizza il Calcolatore prezzi.
Una volta completate le attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la pagina Pulizia.
Prima di iniziare
Configura il progetto
- Accedi al tuo account Google Cloud. Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti gratuiti per l'esecuzione, il test e il deployment dei carichi di lavoro.
-
In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.
-
Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.
-
Enable the GKE API.
-
In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.
-
Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.
-
Enable the GKE API.
Configura impostazioni predefinite per Google Cloud CLI
Nella console Google Cloud, avvia un'istanza di Cloud Shell:
Apri Cloud ShellScarica il codice sorgente per questa app di esempio:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples cd kubernetes-engine-samples/quickstarts/hello-app-redis/manifests
Imposta le variabili di ambiente predefinite:
gcloud config set project PROJECT-ID gcloud config set compute/zone COMPUTE-ZONE
Sostituisci i seguenti valori:
- PROJECT_ID: il tuo ID progetto Google Cloud.
- COMPUTE_ZONE: la zona di Compute Engine.
Crea un cluster GKE registrato in un canale di rilascio
Per creare il tuo cluster GKE, completa questi passaggi:
Crea un cluster denominato
redis-test
con tre nodi:gcloud container clusters create redis-test \ --num-nodes=3 \ --release-channel regular
Una volta creato il cluster, dovresti vedere un output simile al seguente esempio:
NAME: redis-test LOCATION: us-central1-c MASTER_VERSION: 1.22.10-gke.600 MASTER_IP: 34.69.67.7 MACHINE_TYPE: e2-medium NODE_VERSION: 1.22.10-gke.600 NUM_NODES: 3 STATUS: RUNNING
Configura
kubectl
per comunicare con il cluster:gcloud container clusters get-credentials redis-test
Crea un cluster Redis su GKE
In questa sezione, aggiungerai un cluster Redis sopra il cluster GKE creato in precedenza eseguendo il deployment ConfigMap, StatefulSet, e headless.
Per creare un cluster Redis, completa questi passaggi:
Fai riferimento al file ConfigMap (
redis-configmap.yaml
) in cui è archiviata la configurazione Redis. Lo snippet seguente mostra gli script del probe di idoneità e di attività.Gli script
readiness.sh
eliveness.sh
utilizzano il ping redis-cli per verificare se il server Redis è in esecuzione. Se restituiscePONG
, il server Redis è attivo e in esecuzione. Questi script verranno utilizzati nel seguente paese:redis-cluster.yaml
.Per saperne di più sui parametri Redis in questo ConfigMap, consulta il cluster Redis nella sezione dei parametri di configurazione Tutorial sui cluster Redis.
Esegui il deployment del ConfigMap:
kubectl apply -f redis-configmap.yaml
Fai riferimento allo snippet StatefulSet (
redis-cluster.yaml
) riportato di seguito, che mostra l'utilizzo del probe di idoneità e del probe di attività.Per scoprire come configurare i probe in Kubernetes, consulta Configurare i probe.
Ti consigliamo vivamente di usare i probe di idoneità e di attività durante l'upgrade dei pool di nodi. per assicurarti che i pod siano pronti durante un upgrade.
Esegui il deployment dello StatefulSet:
kubectl apply -f redis-cluster.yaml
Il servizio headless denominato
redis-service.yaml
è per Redis nodi connessione. Il campoclusterIP
è impostato suNone
per creare un servizio headless.Esegui il deployment del servizio:
kubectl apply -f redis-service.yaml
Attendi circa due minuti e verifica che tutti i pod siano in esecuzione utilizzando il seguente comando:
kubectl get pods
Dovresti vedere un output simile all'esempio seguente:
NAME READY STATUS RESTARTS AGE redis-0 1/1 Running 0 2m29s redis-1 1/1 Running 0 2m8s redis-2 1/1 Running 0 107s redis-3 1/1 Running 0 85s redis-4 1/1 Running 0 54s redis-5 1/1 Running 0 23s
Verifica che i volumi permanenti siano stati creati eseguendo questo comando:
kubectl get pv
Dovresti vedere un output simile all'esempio seguente:
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-HASH 1Gi RWO Delete Bound default/data-redis-5 standard 75s pvc-HASH 1Gi RWO Delete Bound default/data-redis-1 standard 2m59s pvc-HASH 1Gi RWO Delete Bound default/data-redis-3 standard 2m16s pvc-HASH 1Gi RWO Delete Bound default/data-redis-2 standard 2m38s pvc-HASH 1Gi RWO Delete Bound default/data-redis-0 standard 3m20s pvc-HASH 1Gi RWO Delete Bound default/data-redis-4 standard 104s
In questo output, HASH rappresenta un hash associato a ogni un nome di volume permanente.
Assegna ruoli al tuo cluster Redis
Una volta completata la configurazione, assegna i ruoli al cluster Redis.
Lo script seguente ottiene gli indirizzi IP del pod, quindi assegna il nodo leader e dei ruoli follower passando ciascuno degli indirizzi IP dei pod al comando:
Per assegnare ruoli al cluster Redis, completa questi passaggi:
Esegui lo script:
chmod +x ./roles.sh ./roles.sh
Digita
yes
quando richiesto.Accedi a un nodo Redis per verificare il relativo ruolo. Ad esempio, per verificare che
redis-0
ha un ruolo leader, esegui questo comando:kubectl exec -it redis-0 -- redis-cli role
Dovresti vedere un output simile all'esempio seguente:
1) "master" 2) (integer) 574 3) 1) 1) "10.28.2.3" 2) "6379" 3) "574"
esegui il deployment dell'applicazione client Redis
Per eseguire il deployment dell'applicazione nel cluster GKE che hai creato, definisci
un deployment per la tua applicazione.
Il file denominato app-deployment.yaml
contiene la definizione del deployment per l'applicazione.
Per saperne di più sui probe e sulle regole di affinità dei pod utilizzati in questo deployment, consulta Best practice di GKE: progettazione e creazione di cluster a disponibilità elevata.
Per creare il deployment, completa questi passaggi:
Applica il deployment:
kubectl apply -f app-deployment.yaml
Esposizione dell'applicazione tramite un bilanciatore del carico:
kubectl expose deployment hello-web \ --type=LoadBalancer \ --port 80 \ --target-port 8080
Attendi circa un minuto e recupera l'IP esterno dell'applicazione eseguendo questo comando:
kubectl get service
Dall'output, copia il valore elencato nella colonna
hello-web's
EXTERNAL-IP
:NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello-web LoadBalancer 10.13.10.55 EXTERNAL_IP 80:30703/TCP 166m
Verifica che l'applicazione funzioni incollando EXTERNAL_IP in nel browser web. Dovresti vedere un output simile all'esempio seguente:
I have been hit [1] times since deployment!
Prendi nota del numero di visite. Devi utilizzarlo Sezione Test dell'interruzione dell'applicazione.
Imposta una variabile per il EXTERNAL_IP che hai appena copiato. Utilizzi questo quando crea script per testare l'applicazione nella sezione successiva:
export IP=EXTERNAL_IP
Configura le best practice per gli upgrade del pool di nodi
Esegui queste best practice per le applicazioni stateful in modo da ottimizzare per una migliore disponibilità durante gli upgrade del pool di nodi.
Configura il budget di interruzione dei pod (PDB)
Crea un budget di interruzione dei pod per limitare il numero di pod replicati inattivi contemporaneamente durante un'interruzione volontaria. Questo è utile per le applicazioni stateful in cui è necessario un quorum per rendere disponibili il numero di repliche durante un upgrade.
In una definizione di PDB:
app
specifica a quale applicazione si applica questo PDB.minAvailable
imposta il numero minimo di pod disponibili durante un'interruzione. Può essere un valore o una percentuale (ad es. 30%).maxUnavailable
imposta il numero massimo di pod che possono essere non disponibili durante un'interruzione. Può essere anche un valore o una percentuale.
Per configurare il PDB, completa i seguenti passaggi:
Esegui il deployment del PDB:
kubectl apply -f pdb-minavailable.yaml
Verifica che il PDB sia stato creato:
kubectl get pdb
Configura periodi di manutenzione ed esclusioni
Gli upgrade automatici dei nodi semplificano il processo di upgrade e mantengono aggiornati i nodi nel cluster quando viene eseguito per tuo conto l'upgrade del piano di controllo. Questa funzione è attivata per impostazione predefinita. Per scoprire di più, consulta Aggiornamento automatico dei nodi.
Utilizza periodi di manutenzione ed esclusioni di manutenzione per impostare gli intervalli di tempo e controllare quando può e non può avvenire la manutenzione sui cluster GKE:
Configura un periodo di manutenzione che inizi alle 02:00 UTC del 19 agosto 2022 e termini quattro ore dopo. Questo periodo di manutenzione viene eseguito ogni giorno. Durante questo periodo, è consentita la manutenzione automatica.
gcloud container clusters update redis-test \ --maintenance-window-start 2022-08-19T02:00:00Z \ --maintenance-window-end 2022-08-19T06:00:00Z \ --maintenance-window-recurrence FREQ=DAILY
Imposta una finestra di esclusione che impedisca la manutenzione durante le festività di Capodanno. Questa esclusione di manutenzione utilizza l'ambito
no_upgrades
. Durante questo periodo, non è consentita alcuna manutenzione automatica di alcun tipo. Per saperne di più, consulta Ambito di manutenzione da escludere.gcloud container clusters update redis-test \ --add-maintenance-exclusion-name new-year \ --add-maintenance-exclusion-start 2022-12-26T00:00:00Z \ --add-maintenance-exclusion-end 2023-01-02T02:00:00Z \ --add-maintenance-exclusion-scope no_upgrades
Verifica che il periodo di manutenzione e le esclusioni siano applicati. Cerca sotto
maintenancePolicy:
gcloud container clusters describe redis-test
Per scoprire di più, consulta Configurare periodi di manutenzione ed esclusioni.
Configura una strategia di upgrade dei nodi
Esistono due strategie di upgrade dei nodi che puoi utilizzare per i pool di nodi nel tuo cluster GKE: Upgrade blu/verde e upgrade di sovraccarico. Per saperne di più, consulta Strategie di upgrade dei nodi.
Upgrade blu/verde
Scegli upgrade blu/verde se i carichi di lavoro tollerano meno le interruzioni e se è accettabile un aumento temporaneo dei costi dovuto a un maggiore utilizzo delle risorse.
Esegui questo comando per cambiare i pool di nodi attuali con la strategia di upgrade blu/verde.
gcloud container node-pools update default-pool \
--cluster=redis-test \
--enable-blue-green-upgrade \
--zone COMPUTE-ZONE \
--node-pool-soak-duration=120s
La durata di sospensione del pool di nodi è impostata su due minuti per risparmiare tempo durante la fase del pool di nodi di sospensione ai fini di questo tutorial. Questa fase viene utilizzata per verificare l'integrità del carico di lavoro dopo lo svuotamento dei nodi del pool blu. Consigliamo di impostare la durata di sospensione del pool di nodi su un'ora (3600 secondi) o su una durata più adatta all'applicazione.
Per ulteriori informazioni sulla gestione dell'allocazione dei pod, consulta Esegui il deployment di un pod in un pool di nodi specifico e Deployment di servizi in pool di nodi specifici.
Per saperne di più sulla configurazione degli upgrade blu/verde, consulta Configurare gli upgrade blu/verde.
Upgrade di Surge
Scegli gli upgrade di sovraccarico se l'ottimizzazione dei costi è importante e se i carichi di lavoro possono tollerare un arresto controllato in meno di 60 minuti (GKE rispetta il PDB fino a 60 minuti).
Esegui questo comando per modificare i pool di nodi attuali in una strategia di surge upgrade.
gcloud container node-pools update default-pool \
--max-surge-upgrade=1 \
--max-unavailable-upgrade=0 \
--cluster=redis-test
Con questa configurazione (maxSurge=1
e maxUnavailable=0
), solo un nodo di picco
possono essere aggiunte al pool di nodi durante un upgrade, per cui è possibile aggiungere
contemporaneamente. Questa impostazione velocizza il riavvio dei pod durante gli upgrade,
progredendo in modo conservativo.
Per ulteriori informazioni sulla configurazione degli upgrade di sovraccarico, consulta Configurare gli upgrade di sovraccarico.
Controlla l'attuale configurazione del pool di nodi:
gcloud container node-pools describe default-pool \
--cluster redis-test \
--zone COMPUTE-ZONE
Per saperne di più sulla visualizzazione dei pool di nodi, consulta Visualizzare i pool di nodi in un cluster.
testa l'applicazione
In questa sezione utilizzerai due script: uno che invia richieste alla tua applicazione, e una che misura la percentuale di successo delle richieste. Usi questi script per misurare cosa succede quando esegui l'upgrade del cluster.
Per creare gli script:
Passa alla directory che contiene gli script:
cd cd kubernetes-engine-samples/quickstarts/hello-app-redis/scripts
Fai riferimento allo script denominato
generate_load.sh
che invia query al secondo (QPS) alla tua applicazione. Lo script salva il codice di risposta HTTP nella directory corrente in un file denominatooutput
. Il valore dioutput
viene utilizzata nello script creato nel passaggio successivo.Fai riferimento allo script denominato
print_error_rate.sh
che calcola la riuscita basata sull'output generato dagenerate_load.sh
.Concediti l'autorizzazione per eseguire gli script:
chmod u+x generate_load.sh print_error_rate.sh
Imposta una variabile per il numero di QPS. Questo valore viene utilizzato nel
generate_load.sh
, così come la variabile impostata per lo script EXTERNAL_IP. Ti consigliamo di impostare un valore pari a 40.export QPS=40
Esegui lo script
generate_load.sh
per iniziare a inviare QPS:./generate_load.sh $IP $QPS 2>&1
Lascia in esecuzione lo script
generate_load.sh
e apri un nuovo terminale. Nel nel nuovo terminale, esegui lo scriptprint_error_rate.sh
per controllare la percentuale di errori:cd cd kubernetes-engine-samples/quickstarts/hello-app-redis/scripts watch ./print_error_rate.sh
Dovresti vedere una percentuale di successo del 100% e una percentuale di errore dello 0% man mano che vengono effettuate le QPS.
Lascia entrambi gli script in esecuzione e apri un terzo terminale in preparazione per il sezione successiva.
Esegui l'upgrade del cluster
Per eseguire l'upgrade del cluster, completa questi passaggi:
Determina quale versione di GKE viene utilizzata dal cluster
redis-test
:V=$(gcloud container clusters describe redis-test | grep "version:" | sed "s/version: //") echo $V
Dovresti vedere un output simile all'esempio seguente:
1.22.9-gke.2000
.Recupera un elenco delle versioni di Kubernetes disponibili:
gcloud container get-server-config
Nell'elenco delle versioni, individua la sezione
validMasterVersions:
e cerca per la versione diredis-test
recuperata nel passaggio precedente. Da evitare violando il disallineamento delle versioni di GKE criterio scegliendo una versione incompatibile con i nodi, copia la versione dall'elenco elencato immediatamente prima della versioneredis-test
.Esegui l'upgrade del piano di controllo del cluster alla versione selezionata e digita
y
quando richiesto:gcloud container clusters upgrade redis-test \ --master \ --cluster-version VERSION
Sostituisci VERSION con la versione selezionata dall'elenco nella passaggio precedente.
L'upgrade del piano di controllo richiede diversi minuti.
Esegui l'upgrade dei nodi del cluster alla versione selezionata e digita
y
quando richiesto:gcloud container clusters upgrade redis-test \ --cluster-version=VERSION \ --node-pool=default-pool
Sostituisci VERSION con la versione selezionata dall'elenco.
Testa l'interruzione del carico di lavoro
In questa sezione testerai lo stato dell'applicazione e osserverai l'interruzione del carico di lavoro.
Torna alla finestra del terminale che esegue
./print_error_rate.sh
e osserva come cambia la percentuale di successo durante l'upgrade. Dovresti notare una lieve diminuzione della percentuale di successo e un lieve aumento della il tasso di errori di rete dell'app quando i nodi vengono eseguire l'upgrade.Nel campo
Success rate
puoi vedere quante visite sono state apportate correttamente al sito web. Prendi nota di questo valore.Interrompi l'esecuzione di entrambi gli script inserendo
CTRL+C
nei terminali pertinenti.Torna al sito web della tua applicazione inserendo il relativo indirizzo IP (questo è il valore EXTERNAL_IP che hai copiato durante Esegui il deployment dell'applicazione client Redis) nel tuo del browser.
Osserva il numero di visite per la tua richiesta. Il numero visualizzato deve essere uguale a:
ORIGINAL_VISIT_NUMBER + SUCCESSFUL_VISIT_NUMBER
dove ORIGINAL_VISIT_NUMBER è il numero che hai registrato nella finale passaggio di Deployment dell'applicazione client Redis e SUCCESSFUL_VISIT_NUMBER è il valore registrato nel primo passaggio di questa sezione.
Esegui la pulizia
Al termine del tutorial, puoi eseguire la pulizia delle risorse che hai creato in modo che smettono di usare la quota e comportano addebiti. Le seguenti sezioni descrivono come eliminare o disattivare queste risorse.
Elimina il progetto
Il modo più semplice per eliminare la fatturazione creato per il tutorial.
Per eliminare il progetto:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Elimina il cluster
Per eliminare il cluster che hai creato per questo tutorial, esegui questo comando:
gcloud container clusters delete redis-test