In questo lab configurerai un'applicazione in Google Kubernetes Engine (GKE) e utilizzerai un HorizontalPodAutoscaler per scalare automaticamente l'applicazione web. Potrai quindi lavorare con più pool di nodi di tipi diversi e applicare incompatibilità e tolleranze per controllare la pianificazione dei pod in relazione al pool di nodi sottostante.
Obiettivi
In questo lab imparerai a:
Configurare scalabilità automatica e HorizontalPodAutoscaler
Aggiungere un pool di nodi e configurare le incompatibilità sui nodi per l'anti-affinità di un pod
Configurare un'eccezione per l'incompatibilità dei nodi aggiungendo una tolleranza al file manifest di un pod
Configurazione del lab
Accedi a Qwiklabs
Per ciascun lab, riceverai un nuovo progetto Google Cloud e un insieme di risorse per un periodo di tempo limitato senza alcun costo aggiuntivo.
Accedi a Qwiklabs utilizzando una finestra di navigazione in incognito.
Tieni presente la durata dell'accesso al lab (ad esempio, 1:15:00) e assicurati di finire entro quell'intervallo di tempo.
Non è disponibile una funzionalità di pausa. Se necessario, puoi riavviare il lab ma dovrai ricominciare dall'inizio.
Quando è tutto pronto, fai clic su Inizia lab.
Annota le tue credenziali del lab (Nome utente e Password). Le userai per accedere a Google Cloud Console.
Fai clic su Apri console Google.
Fai clic su Utilizza un altro account e copia/incolla le credenziali per questo lab nei prompt.
Se utilizzi altre credenziali, compariranno errori oppure ti verranno addebitati dei costi.
Accetta i termini e salta la pagina di ripristino delle risorse.
Una volta completati i passaggi di accesso iniziali, viene visualizzata la dashboard del progetto.
Attiva Google Cloud Shell
Google Cloud Shell è una macchina virtuale in cui sono caricati strumenti per sviluppatori. Offre una home directory permanente da 5 GB e viene eseguita su Google Cloud.
Google Cloud Shell fornisce l'accesso da riga di comando alle risorse Google Cloud.
Nella barra degli strumenti in alto a destra della console Cloud, fai clic sul pulsante Apri Cloud Shell.
Fai clic su Continua.
Bastano pochi istanti per eseguire il provisioning e connettersi all'ambiente. Quando la connessione è attiva, l'autenticazione è già avvenuta e il progetto è impostato sul tuo PROJECT_ID. Ad esempio:
gcloud è lo strumento a riga di comando di Google Cloud. È preinstallato su Cloud Shell e supporta il completamento.
Puoi visualizzare il nome dell'account attivo con questo comando:
Esegui il deployment di un'applicazione web di esempio nel tuo cluster GKE
Eseguirai il deployment di un'applicazione di esempio nel cluster utilizzando il file di deployment web.yaml creato per te:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 1
selector:
matchLabels:
run: web
template:
metadata:
labels:
run: web
spec:
containers:
- image: gcr.io/google-samples/hello-app:1.0
name: web
ports:
- containerPort: 8080
protocol: TCP
resources:
# You must specify requests for CPU to autoscale
# based on CPU utilization
requests:
cpu: "250m"
Questo file manifest consente di creare un deployment utilizzando un'immagine container di esempio dell'applicazione web che rimane in ascolto su un server HTTP tramite la porta 8080.
In Cloud Shell, inserisci il comando seguente per clonare il repository nella sessione di Cloud Shell del lab:
Passa alla directory che contiene i file di esempio per questo lab:
cd ~/ak8s/Autoscaling/
Per creare un deployment da questo file, esegui questo comando:
kubectl create -f web.yaml --save-config
Crea una risorsa di servizio di tipo NodePort sulla porta 8080 per il deployment web:
kubectl expose deployment web --target-port=8080 --type=NodePort
Verifica che il servizio sia stato creato e che sia stata allocata una porta del nodo:
kubectl get service web
Il tuo indirizzo IP e il numero di porta potrebbero essere diversi dall'output di esempio.
Output:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
web NodePort 10.11.246.185 8080:32056/TCP 12s
Fai clic su Controlla i miei progressi per verificare l'obiettivo.
Esegui il deployment di un'applicazione web di esempio in un cluster GKE.
Attività 2 - Configurare la scalabilità automatica sul cluster
In questa attività devi configurare il cluster in modo da scalare automaticamente l'applicazione di esempio di cui hai eseguito il deployment in precedenza.
Configura scalabilità automatica
Scarica l'elenco dei deployment per determinare se la tua applicazione web di esempio è ancora in esecuzione:
kubectl get deployment
L'output dovrebbe essere simile all'esempio seguente.
Output:
NAME READY UP-TO-DATE AVAILABLE AGE
web 1/1 1 1 5m48s
Se il deployment web della tua applicazione non viene visualizzato, torna all'attività 1 e riesegui il deployment nel cluster.
Per configurare l'applicazione di esempio per la scalabilità automatica (e impostare il numero massimo di repliche a 4 e il numero minimo a 1, con un target di utilizzo della CPU dell'1%), esegui il comando seguente:
kubectl autoscale deployment web --max 4 --min 1 --cpu-percent 1
Quando utilizzi kubectl autoscale, devi specificare un numero massimo e minimo di repliche per la tua applicazione, oltre a un target di utilizzo della CPU.
Scarica l'elenco dei deployment per verificare che sia ancora presente un solo deployment dell'applicazione web:
kubectl get deployment
Output:
NAME READY UP-TO-DATE AVAILABLE AGE
web 1/1 1 1 8m21s
Analizza l'oggetto HorizontalPodAutoscaler
Il comando kubectl autoscale che hai usato nell'attività precedente crea un oggetto HorizontalPodAutoscaler destinato a una risorsa specificata, chiamata target di scalabilità, e la scala in base alle esigenze.
Il gestore della scalabilità automatica regola periodicamente il numero di repliche del target di scalabilità in modo che corrisponda all'utilizzo medio della CPU specificato al momento della creazione del gestore della scalabilità automatica.
Esegui il comando seguente per ottenere l'elenco delle risorse HorizontalPodAutoscaler:
kubectl get hpa
L'output dovrebbe essere simile all'esempio seguente.
Output:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
web Deployment/web 0%/1% 1 4 1 1m
Per analizzare la configurazione di HorizontalPodAutoscaler sotto forma di tabella, esegui il comando seguente:
kubectl describe horizontalpodautoscaler web
L'output dovrebbe essere simile all'esempio seguente.
Output:
Name: web
Namespace: default
Labels:
Annotations:
CreationTimestamp: Tue, 08 Sep 2020...
Reference: Deployment/web
Metrics: ( current / target )
resource cpu on pods (as a percentage of request): 0% (0) / 1%
Min replicas: 1
Max replicas: 4
Deployment pods: 1 current / 1 desired
Conditions:
Type Status Reason Message
---- ------ ------ -------
AbleToScale True ScaleDownStabilized recent recommendations [...]
ScalingActive True ValidMetricFound the HPA was able to [...]
ScalingLimited False DesiredWithinRange the desired count [...]
Events:
Per visualizzare la configurazione di HorizontalPodAutoscaler in formato YAML, esegui il comando seguente:
kubectl get horizontalpodautoscaler web -o yaml
L'output dovrebbe essere simile all'esempio seguente.
Testa la configurazione della scalabilità automatica
Devi creare un carico elevato nell'applicazione web per forzarne lo scale out. Crea un file di configurazione che definisca un deployment di quattro container che eseguono un ciclo infinito di query HTTP sul server web dell'applicazione di esempio.
Puoi creare il carico sulla tua applicazione web eseguendo il deployment dell'applicazione loadgen utilizzando il file loadgen.yaml che ti è stato fornito.
Per eseguire il deployment di questo container, esegui questo comando:
kubectl apply -f loadgen.yaml
Una volta eseguito il deployment del file manifest, il pod web dovrebbe iniziare a scalare.
Fai clic su Controlla i miei progressi per verificare l'obiettivo.
Deployment dell'applicazione loadgen
Scarica l'elenco dei deployment per verificare che il generatore di carico sia in esecuzione:
kubectl get deployment
L'output dovrebbe essere simile all'esempio seguente.
Output:
NAME READY UP-TO-DATE AVAILABLE AGE
loadgen 4/4 4 4 26s
web 1/1 1 1 14m
Analizza HorizontalPodAutoscaler:
kubectl get hpa
Una volta che il pod loadgen inizia a generare traffico, l'utilizzo della CPU del deployment web inizia ad aumentare. Nell'output di esempio, i target hanno ora un utilizzo della CPU del 35% rispetto alla soglia dell'1% della CPU.
Output:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
web Deployment/web 35%/1% 1 4 1 8m
Dopo qualche minuto, analizza nuovamente HorizontalPodAutoscaler:
kubectl get hpa
Il gestore della scalabilità automatica ha aumentato la disponibilità del deployment web a quattro repliche.
Output:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
web Deployment/web 88%/1% 1 4 4 9m
Per arrestare il carico sull'applicazione web, scala il deployment loadgen fino a zero repliche:
kubectl scale deployment loadgen --replicas 0
Scarica l'elenco dei deployment per verificare che sia stato fatto lo scale down del loadgen:
kubectl get deployment
Il deployment loadgen non deve avere repliche.
Output:
NAME READY UP-TO-DATE AVAILABLE AGE
loadgen 0/0 0 0 3m40s
web 2/4 4 2 18m
Nota: devi attendere da 2 a 3 minuti prima di poter rielencare i deployment.
Scarica l'elenco dei deployment per verificare che l'applicazione web abbia fatto lo scale down al valore minimo di 1 replica configurato al momento dell'esecuzione del deployment del gestore della scalabilità automatica:
kubectl get deployment
A questo punto dovresti avere un deployment dell'applicazione web.
Output:
NAME READY UP-TO-DATE AVAILABLE AGE
loadgen 0/0 0 0 12m
web 1/1 1 1 14m
Attività 3 - Gestire i pool di nodi
In questa attività devi creare un nuovo pool di nodi utilizzando istanze prerilasciabili, quindi limitare il deployment web ai soli nodi prerilasciabili.
Aggiungi un pool di nodi
Per eseguire il deployment di un nuovo pool di nodi con tre istanze VM prerilasciabili, esegui il comando seguente:
Se visualizzi un errore che indica che non sono disponibili istanze prerilasciabili, puoi rimuovere l'opzione --preemptible per procedere con il lab.
Ottieni l'elenco dei nodi per verificare che i nuovi nodi siano pronti:
kubectl get nodes
Ora dovresti avere 4 nodi.
I tuoi nomi saranno diversi dall'output di esempio.
Output:
NAME STATUS ROLES AGE VERSION
gke-standard-cluster-1-default-pool...xc Ready 33m v1.19.10-gke.1600
gke-standard-cluster-1-default-pool...q8 Ready 33m v1.19.10-gke.1600
gke-standard-cluster-1-temp-pool-1-...vj Ready 32s v1.19.10-gke.1600
gke-standard-cluster-1-temp-pool-1-...xj Ready 37s v1.19.10-gke.1600
Tutti i nodi che hai aggiunto hanno l'etichetta temp=true, perché hai impostato questa etichetta al momento della creazione del pool di nodi. Questa etichetta consente di individuare e configurare questi nodi facilmente.
Per elencare solo i nodi con l'etichetta temp=true, esegui il comando seguente:
kubectl get nodes -l temp=true
Dovresti visualizzare solo i due nodi che hai aggiunto.
I tuoi nomi saranno diversi dall'output di esempio.
Output:
NAME STATUS ROLES AGE VERSION
gke-standard-cluster-1-temp-pool-1-...vj Ready 3m26s v1.19.10-gke.1600
gke-standard-cluster-1-temp-pool-1-...xj Ready 3m31s v1.19.10-gke.1600
Controlla la pianificazione con incompatibilità e tolleranze
Per impedire allo scheduler di eseguire un pod sui nodi temporanei, aggiungi un'incompatibilità a ciascuno dei nodi nel pool temporaneo. Le incompatibilità sono implementate come coppie chiave-valore con un effetto (ad esempio NoExecute) che determina se i pod possono essere eseguiti su un determinato nodo. Solo i nodi configurati per tollerare la coppia chiave-valore dell'incompatibilità sono pianificati per essere eseguiti su questi nodi.
Per aggiungere un'incompatibilità a ciascuno dei nodi appena creati, esegui il comando seguente.
Puoi utilizzare l'etichetta temp=true per applicare la modifica a tutti i nuovi nodi contemporaneamente:
Per consentire l'esecuzione dei pod dell'applicazione su questi nodi incompatibili, devi aggiungere una chiave di tolleranza alla configurazione del deployment.
Per modificare il file web.yaml, esegui questo comando:
nano web.yaml
Aggiungi la seguente chiave nella sezione spec del modello:
La sezione spec del file dovrebbe essere simile all'esempio seguente:
...
spec:
tolerations:
- key: "nodetype"
operator: Equal
value: "preemptible"
containers:
- image: gcr.io/google-samples/hello-app:1.0
name: web
ports:
- containerPort: 8080
protocol: TCP
resources:
# You must specify requests for CPU to autoscale
# based on CPU utilization
requests:
cpu: "250m"
Per far sì che il deployment web utilizzi il nuovo pool di nodi, aggiungi una chiave nodeSelector nella sezione spec del modello. Questa chiave è parallela alla chiave di tolleranza che hai appena aggiunto:
nodeSelector:
temp: "true"
Nota: GKE aggiunge un'etichetta personalizzata a ciascun nodo denominata cloud.google.com/gke-nodepool, che contiene il nome del pool di nodi a cui appartiene il nodo. Questa chiave può essere utilizzata anche come parte di un nodeSelector per garantire che il deployment dei pod venga eseguito solo in nodi idonei.
Il deployment web.yaml completo dovrebbe essere simile all'esempio seguente:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 1
selector:
matchLabels:
run: web
template:
metadata:
labels:
run: web
spec:
tolerations:
- key: "nodetype"
operator: Equal
value: "preemptible"
nodeSelector:
temp: "true"
containers:
- image: gcr.io/google-samples/hello-app:1.0
name: web
ports:
- containerPort: 8080
protocol: TCP
resources:
# You must specify requests for CPU to autoscale
# based on CPU utilization
requests:
cpu: "250m"
Premi CTRL+X, quindi premi Y e Invio per salvare il file e uscire dall'editor nano.
Per applicare questa modifica, esegui il comando seguente:
kubectl apply -f web.yaml
In caso di problemi durante la modifica del file, puoi utilizzare invece il file di esempio precedentemente preparato denominato web-tolerations.yaml.
Fai clic su Controlla i miei progressi per verificare l'obiettivo.
Gestisci i pool di nodi
Recupera l'elenco dei pod:
kubectl get pods
I tuoi nomi potrebbero essere diversi dall'output di esempio.
Output:
NAME READY STATUS RESTARTS AGE
web-7cb566bccd-pkfst 1/1 Running 0 1m
Per confermare la modifica, esamina i pod web in esecuzione utilizzando il seguente comando:
kubectl describe pods -l run=web
Nella parte inferiore dell'output troncato dovrebbe essere visualizzata una sezione Tolerations con nodetype=preemptible nell'elenco.
Output:
Node-Selectors: temp=true
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
nodetype=preemptible
Events:
L'output conferma che i pod tollerano il valore di incompatibilità sui nuovi nodi prerilasciabili e che quindi è possibile pianificare l'esecuzione su questi nodi.
Per forzare nuovamente l'applicazione web a fare lo scale out, scala di nuovo il deployment loadgen a quattro repliche:
kubectl scale deployment loadgen --replicas 4
Puoi scalare direttamente solo l'applicazione web, ma utilizzando l'app loadgen potrai vedere come le diverse impostazioni di incompatibilità, tolleranza e nodeSelector applicabili alle applicazioni web e loadgen influiscono sui nodi su cui sono pianificate.
Ottieni l'elenco di pod utilizzando l'ampio formato di output per mostrare i nodi in esecuzione nei pod:
kubectl get pods -o wide
Indica che l'app loadgen è in esecuzione solo sui nodi default-pool, mentre l'app web esegue solo i nodi prerilasciabili in temp-pool-1.
L'impostazione di incompatibilità impedisce l'esecuzione dei pod sui nodi prerilasciabili in modo che l'applicazione loadgen venga eseguita solo sul pool predefinito. L'impostazione di tolleranza consente all'applicazione web di essere eseguita sui nodi prerilasciabili e il nodeSelector forza l'esecuzione dei pod dell'applicazione web su questi nodi.
Una volta completato il lab, fai clic su Termina lab. Google Cloud Skills Boost rimuove le risorse che hai utilizzato ed esegue la pulizia dell'account.
Avrai la possibilità di inserire una valutazione in merito alla tua esperienza. Seleziona il numero di stelle applicabile, inserisci un commento, quindi fai clic su Invia.
Il numero di stelle corrisponde alle seguenti valutazioni:
1 stella = molto insoddisfatto
2 stelle = insoddisfatto
3 stelle = esperienza neutra
4 stelle = soddisfatto
5 stelle = molto soddisfatto
Se non vuoi lasciare un feedback, chiudi la finestra di dialogo.
Per feedback, suggerimenti o correzioni, utilizza la scheda Assistenza.
Copyright 2020 Google LLC Tutti i diritti riservati. Google e il logo Google sono marchi di Google LLC. Tutti gli altri nomi di società e prodotti sono marchi delle rispettive società a cui sono associati.
I lab creano un progetto e risorse Google Cloud per un periodo di tempo prestabilito
I lab hanno un limite di tempo e non possono essere messi in pausa. Se termini il lab, dovrai ricominciare dall'inizio.
In alto a sinistra dello schermo, fai clic su Inizia il lab per iniziare
Utilizza la navigazione privata
Copia il nome utente e la password forniti per il lab
Fai clic su Apri console in modalità privata
Accedi alla console
Accedi utilizzando le tue credenziali del lab. L'utilizzo di altre credenziali potrebbe causare errori oppure l'addebito di costi.
Accetta i termini e salta la pagina di ripristino delle risorse
Non fare clic su Termina lab a meno che tu non abbia terminato il lab o non voglia riavviarlo, perché il tuo lavoro verrà eliminato e il progetto verrà rimosso
Questi contenuti non sono al momento disponibili
Ti invieremo una notifica via email quando sarà disponibile
Bene.
Ti contatteremo via email non appena sarà disponibile
Un lab alla volta
Conferma per terminare tutti i lab esistenti e iniziare questo
Utilizza la navigazione privata per eseguire il lab
Utilizza una finestra del browser in incognito o privata per eseguire questo lab. In questo modo eviterai eventuali conflitti tra il tuo account personale e l'account Studente, che potrebbero causare addebiti aggiuntivi sul tuo account personale.
Architecting with Google Kubernetes Engine: Configurazione di scalabilità automatica dei pod e pool di nodi
Durata:
Configurazione in 10 m
·
Accesso da 60 m
·
Completamento in 60 m