1. Panoramica
La riscrittura o la reingegnerizzazione delle applicazioni esistenti per funzionare su Kubernetes non è sempre possibile o fattibile manualmente. Migrate for Anthos può aiutarti a modernizzare le applicazioni esistenti e a eseguirle in Kubernetes. In questo codelab, eseguirai la migrazione di un'app web esistente ospitata su Compute Engine a Kubernetes Engine utilizzando Migrate for Anthos.
Cosa imparerai a fare
- Come eseguire il deployment di Migrate for Anthos su un cluster Kubernetes
- Come creare un container in un insieme con stato da un'istanza Compute Engine esistente
- Come eseguire il deployment del container su Kubernetes e configurarlo con un bilanciatore del carico
Che cosa ti serve
- Un progetto Google Cloud con la fatturazione configurata. Se non ne hai uno, dovrai crearne uno.
2. Preparazione
Questo codelab può essere eseguito completamente su Google Cloud Platform senza alcuna installazione o configurazione locale.
Abilita API
Prima di iniziare, assicurati di abilitare le API richieste nel tuo progetto Google Cloud:
Crea un server web di Compute Engine
Creiamo un'istanza di calcolo che utilizzeremo per ospitare il nostro server web nginx iniziale, insieme alle regole firewall che ci consentiranno di visualizzare la home page predefinita del server web. Esistono diversi modi per farlo, ma per facilità d'uso utilizzeremo Cloud Shell.
In Cloud Shell, esegui questo comando:
gcloud compute instances create webserver --zone=us-central1-a && \ gcloud compute firewall-rules create default-allow-http --allow=tcp:80
La prima metà di questo comando creerà un'istanza Google Cloud nella zona us-central1-a, mentre la seconda metà creerà una regola firewall denominata "default-allow-http" che consentirà il traffico HTTP nella nostra rete.
Una volta creata l'istanza, viene visualizzata una tabella con i relativi dettagli. Prendi nota dell'IP esterno, che ci servirà per verificare che il web server sia in esecuzione in un secondo momento.

Una volta che l'istanza è attiva e in esecuzione, possiamo accedere tramite SSH all'istanza da Cloud Shell per installare nginx e avviare il server web:
gcloud compute ssh --zone us-central1-a webserver
Una volta eseguito l'accesso all'istanza di calcolo, installa nginx:
sudo apt install nginx
Esci dalla sessione SSH con il comando logout.
Verifichiamo che il nostro server web sia in esecuzione inserendo l'IP esterno dell'istanza nel browser. Dovresti visualizzare la schermata di benvenuto predefinita di nginx:

Questo web server fungerà da app web legacy che eseguiremo la migrazione a Kubernetes utilizzando Migrate for Anthos.
3. Cluster Kubernetes con Migrate for Anthos
Successivamente, creeremo un cluster GKE in cui alla fine eseguiremo la migrazione del server web Compute Engine. In Cloud Console, esegui questo comando:
gcloud container clusters create my-gke-cluster \ --zone us-central1-a \ --cluster-version 1.13 \ --machine-type n1-standard-4 \ --image-type "UBUNTU" \ --num-nodes 1 \ --enable-stackdriver-kubernetes
Attendi qualche minuto per il completamento del comando. Una volta creato il cluster, riceverai un output con i relativi dettagli:

Successivamente, vai a GCP Marketplace per eseguire il deployment di Migrate for Anthos:

Nella pagina del marketplace di Migrate for Anthos, fai clic su Configura e, se richiesto, seleziona il tuo progetto dall'elenco. La pagina successiva mostrerà un modulo con alcuni valori predefiniti inseriti. Assicurati che il cluster selezionato sia quello appena creato e fai clic su Esegui il deployment:

Migrate for Anthos dovrebbe ora essere implementato sul nostro cluster Kubernetes. Al termine del deployment, nella pagina Applicazioni Kubernetes Engine viene visualizzato lo stato "OK":

4. Dall'istanza di calcolo al set stateful
Abbiamo un cluster Kubernetes che esegue Migrate for Anthos, quindi ora possiamo iniziare il processo di migrazione. Per eseguire il deployment della nostra istanza di calcolo in un cluster Kubernetes, arresteremo l'istanza Compute Engine in modo da poter acquisire snapshot dei dischi. Prima di procedere, prendi nota dell'ID istanza, che ti servirà in seguito:
gcloud compute instances describe webserver --zone us-central1-a | grep ^id
Arrestiamo l'istanza di calcolo:
gcloud compute instances stop webserver --zone us-central1-a
Ora che l'istanza è arrestata, possiamo creare in sicurezza snapshot dei dischi eseguendo il seguente script. Assicurati di inserire il tuo ID progetto e il tuo ID istanza:
python3 /google/migrate/anthos/gce-to-gke/clone_vm_disks.py \ -p <project-id> -i <instance-id> \ -z us-central1-a \ -T us-central1-a \ -A webserver-statefulset \ -o containerized-webserver.yaml
Con questi flag, clone_vm_disks.py:
- Verifica che l'istanza GCE sia disattivata
- Crea uno snapshot da ciascuno dei dischi dell'istanza
- Crea un nuovo disco da ogni snapshot
- Elimina gli snapshot che ha creato
- Genera un file YAML nella directory di lavoro corrente per il deployment di un set stateful che ospiterà il server web
Il file YAML generato eseguirà il provisioning di un set stateful nel nostro cluster Kubernetes, insieme alle rivendicazioni di volumi permanenti necessarie per montare i dischi copiati nel nostro contenitore del web server. Possiamo applicare queste modifiche con kubectl:
kubectl apply -f containerized-webserver.yaml
Controlla lo stato di webserver-statefulset nella pagina Workload:
È normale che lo stato indichi "I pod sono in attesa" per alcuni minuti dopo l'esecuzione di kubectl apply. Continua quando lo stato indica "Ok".
5. Esporre il cluster al bilanciatore del carico
A questo punto, il nostro cluster Kubernetes dovrebbe eseguire il nostro web server come set stateful, ma dovremo anche esporre il suo container a un bilanciatore del carico per accedere al nostro web server tramite un indirizzo IP esterno. In Cloud Shell, crea un nuovo file denominato loadbalancer.yaml con il seguente contenuto:
loadbalancer.yaml
apiVersion: v1
kind: Service
metadata:
name: webserver-loadbalancer
spec:
type: LoadBalancer
selector:
app: webserver-statefulset
ports:
- protocol: TCP
port: 80
targetPort: 80
Ora applicalo con kubectl:
kubectl apply -f loadbalancer.yaml
Possiamo utilizzare kubectl per recuperare l'indirizzo IP esterno del servizio webserver-container:
kubectl get services
Se inseriamo l'indirizzo IP esterno nel browser, dovremmo visualizzare la stessa schermata di benvenuto predefinita di nginx di prima:

Ce l'abbiamo fatta! Il nostro web server GCE ora è ospitato su Kubernetes. Bene!
6. Monitoraggio di Stackdriver
Metriche
In quanto servizio Kubernetes gestito, Kubernetes Engine viene instrumentato automaticamente per il logging e il monitoraggio con Stackdriver. Diamo un'occhiata ad alcune delle metriche acquisite automaticamente da Stackdriver.
Fai clic sul link Monitoring nel menu dei prodotti. L'accesso per la prima volta dal tuo progetto potrebbe richiedere alcuni minuti durante la configurazione dello spazio di lavoro.
Una volta caricata, passa il mouse sopra Risorse nel riquadro a sinistra e seleziona "Kubernetes Engine NEW" dal menu.

Ogni riga della dashboard presentata qui rappresenta una risorsa Kubernetes. Puoi passare dalla visualizzazione dell'infrastruttura, dei carichi di lavoro o dei servizi utilizzando i link sopra la dashboard.

Nella visualizzazione Carichi di lavoro, espandi "my-gke-cluster" e vai a default > webserver-statefulset > webserver-statefulset-0 > webserver-statefulset. Fai clic sul contenitore webserver-stateful set. Qui troverai alcune metriche predefinite acquisite da Stackdriver, tra cui l'utilizzo della memoria e l'utilizzo della CPU.

I grafici visualizzati in questa dashboard sono quelli che potremo utilizzare per creare una dashboard personalizzata.
Dashboard personalizzate
Stackdriver ci consente di creare dashboard personalizzate che possiamo utilizzare per organizzare grafici per qualsiasi dato metrico a nostra disposizione. Creiamo una dashboard personalizzata per fornire una panoramica di alcune metriche del nostro server web.
Nel riquadro a sinistra, passa il mouse sopra Dashboard, quindi fai clic su Crea dashboard.

Ora che abbiamo la dashboard vuota, possiamo aggiungere le metriche che vogliamo monitorare. Assegniamo alla dashboard senza titolo un nome utile come "I miei container del server web" e facciamo clic su "Aggiungi grafico" in alto a destra:

Ricordi le metriche predefinite? Aggiungiamo un grafico per l'utilizzo della CPU del container. Nel campo Titolo grafico, inserisci "Utilizzo CPU". Nella casella "Trova tipo di risorsa e metrica", digita request_utilization e seleziona Utilizzo richieste CPU dall'elenco filtrato. Questa selezione compilerà automaticamente i campi Tipo di risorsa e Metrica.
Successivamente, vogliamo filtrare in base a project_id (se abbiamo più progetti) e container_name. Nella casella Filtro, digita project_id, selezionalo dall'elenco filtrato e seleziona il tuo progetto nel campo Valore. Dobbiamo anche filtrare per container_name. Nella casella Filtro, digita container_name, selezionalo dall'elenco filtrato e seleziona webserver-statefulset nel campo Valore. Fai clic su Salva.
Ora abbiamo una dashboard con il nostro primo grafico.

7. Controllo di uptime e criterio di avviso
Con Stackdriver, possiamo configurare avvisi per ricevere notifiche quando le metriche raggiungono i valori di soglia specificati. Ad esempio, possiamo chiedere a Stackdriver di inviarci un'email quando l'utilizzo della CPU dell'ultimo passaggio supera una determinata soglia per un periodo di tempo prolungato, il che potrebbe indicare un problema con la nostra app. Per mostrare l'aspetto di questi avvisi, configuriamo un controllo dell'uptime e poi simuliamo un'interruzione.
Nel riquadro a sinistra, seleziona Controlli di uptime e poi Panoramica dei controlli di uptime:

Come suggerito nella pagina Controlli di uptime, configuriamo il nostro primo controllo di uptime. Fai clic sul pulsante Aggiungi controllo di uptime in alto a destra della pagina.
Nel modulo successivo, inserisci "Endpoint Uptime" come titolo e l'indirizzo IP esterno del bilanciatore del carico come nome host.

Fai clic su Salva e ti verrà chiesto di creare un criterio di avviso di accompagnamento:

Fai clic su Crea criterio di avviso.
Assegniamo il nome "Norma di uptime dell'endpoint". Nella sezione Configurazione, imposta "La condizione si attiva se" su "Una serie temporale è in violazione" e fai clic su Salva.

Non abbiamo ancora finito. Successivamente, specificheremo un canale di notifica in modo da ricevere una notifica quando il nostro criterio di avviso viene violato. Nel menu a discesa Tipo di canale di notifica, seleziona Email, quindi un indirizzo email valido.

Fai clic su Aggiungi canale di notifica. Infine, nella parte inferiore del modulo, assegna alla policy il nome "Tempo di attività dell'app web" e fai clic su Salva.
Per vedere l'aspetto di un avviso, apri di nuovo Cloud Shell nella console Cloud. Il seguente comando interromperà il servizio nginx in esecuzione nel pod del server web:
kubectl exec -t webserver-statefulset-0 -- /bin/bash -c "nginx -s stop"
Dopo alcuni minuti, dovresti ricevere un'email che ti avvisa dell'interruzione:

Annulliamo l'operazione. Torniamo a Cloud Shell e riavviamo nginx:
kubectl exec -t webserver-statefulset-0 -- /bin/bash -c "nginx"
Dopo alcuni minuti , riceverai un'altra email da Stackdriver, questa volta con notizie migliori rispetto a prima:

8. Esegui la pulizia
Ora che abbiamo eseguito la migrazione da GCE a GKE con Migrate for Anthos, puliamo il progetto da tutte le risorse che abbiamo creato.
Eliminare il progetto
Se preferisci, puoi eliminare l'intero progetto. Nella console di GCP, vai alla pagina Cloud Resource Manager:
Nell'elenco dei progetti, seleziona il progetto su cui abbiamo lavorato e fai clic su Elimina. Ti verrà chiesto di digitare l'ID progetto. Inseriscilo e fai clic su Chiudi.
Se preferisci eliminare i diversi componenti uno alla volta, vai alla sezione successiva.
Stackdriver
Dashboard
Nella pagina del pannello, fai clic sull'icona delle impostazioni
nella parte superiore della pagina e seleziona Elimina pannello.
Criterio di avviso
Nella pagina Norme, seleziona Elimina dal menu Azioni
a destra per ogni norma che hai creato.
Controllo di uptime
Nella pagina Controlli di uptime, seleziona Elimina dal menu Azioni a destra di ogni controllo che hai creato.
GCE e Kubernetes
Istanza Google Compute Engine
gcloud compute instances delete webserver --zone=us-central1-a
Cluster Kubernetes (include Migrate for Anthos, set stateful e servizio di bilanciamento del carico)
gcloud container clusters delete my-gke-cluster --zone=us-central1-a
Dischi
Il nostro set con stato ha utilizzato un disco che abbiamo creato. Utilizza quanto segue per recuperare il nome:
gcloud compute disks list --filter=webserver
Utilizzando il nome del tuo disco al posto del mio, eliminalo con:
gcloud compute disks delete vls-690d-webserver --zone=us-central1-a
Tutto pulito.
9. Complimenti!
Complimenti! Hai eseguito la migrazione del tuo web server da un'istanza GCE a un cluster Kubernetes utilizzando Migrate for Anthos.
Argomenti trattati
- Abbiamo eseguito la migrazione di un web server da GCE a un cluster Kubernetes utilizzando Migrate for Anthos
- Abbiamo aperto il nostro web server stateful set al mondo esponendolo tramite un servizio di bilanciamento del carico Kubernetes.
- Abbiamo attivato Stackdriver e creato una dashboard personalizzata
- Abbiamo configurato un controllo di uptime insieme a un criterio di avviso per sapere quando il nostro server web non funziona
