Migrazione da Compute Engine a Kubernetes Engine con Migrate for Anthos

1. Panoramica

Non sempre è possibile o riprogettare le applicazioni esistenti per farle funzionare su Kubernetes manualmente. Migrate for Anthos può aiutarti a modernizzare le applicazioni esistenti e a eseguirle su Kubernetes. In questo codelab, eseguirai la migrazione a Kubernetes Engine di un'app web esistente ospitata su Compute Engine utilizzando Migrate for Anthos.

Cosa imparerai a fare

  • Eseguire il deployment di Migrate for Anthos su un cluster Kubernetes
  • Creare un container in un set stateful da un'istanza Compute Engine esistente
  • Eseguire il deployment del container in Kubernetes e configurarlo con un bilanciatore del carico

Che cosa ti serve

  • Un progetto Google Cloud in cui è configurata la fatturazione. Se non ne hai uno, dovrai crearlo.

2. Preparazione

Questo codelab può essere eseguito completamente su Google Cloud senza alcuna installazione o configurazione locale.

Abilita le API

Prima di iniziare, assicurati di abilitare le API richieste nel tuo progetto Google Cloud:

Crea un server web di istanza Compute

Creiamo un'istanza Compute che utilizzeremo per ospitare il nostro server web nginx iniziale, insieme alle regole del firewall che ci consentiranno di visualizzare la pagina di destinazione predefinita del server web. Ci sono diversi modi per farlo, ma per facilità d'uso utilizzeremo Cloud Shell.

Esegui questo comando in Cloud Shell:

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, verrà visualizzata una tabella con i relativi dettagli. Prendi nota dell'IP esterno: sarà necessario per verificare che il nostro server web sia in esecuzione in un secondo momento.

a08aa5bf924b107d.png

Quando 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

Dopo aver eseguito l'accesso alla nostra istanza di computing, installa nginx:

sudo apt install nginx

Esci dalla sessione ssh con il comando logout

Verifica che il nostro server web sia in esecuzione inserendo l'IP esterno dell'istanza nel browser precedente. Dovresti vedere la schermata di benvenuto predefinita di nginx:

5c08e3b2bd17e03.png

Questo server web fungerà da app web legacy di cui eseguiremo la migrazione a Kubernetes utilizzando Migrate for Anthos.

3. Cluster Kubernetes con Migrate for Anthos

Quindi, creeremo un cluster GKE in cui eseguiremo la migrazione del server web Compute Engine. Nella console Cloud, 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 perché il comando venga completato. Una volta creato il cluster, riceverai alcuni output con i relativi dettagli:

c69778b8fb8ac72b.png

Quindi, vai a Google Cloud Marketplace per eseguire il deployment di Migrate for Anthos:

45f5753cae53ccb5.png

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

94dc6238b2affd16.png

A questo punto dovrebbe essere eseguito il deployment di Migrate for Anthos nel nostro cluster Kubernetes. Al termine del deployment, lo stato sarà "OK" nella pagina delle applicazioni di Kubernetes Engine:

5bf601103a5335cf.png

4. Da istanza Compute al set stateful

Abbiamo un cluster Kubernetes che esegue Migrate for Anthos, quindi ora possiamo iniziare il processo di migrazione. Per eseguire il deployment dell'istanza Compute in un cluster Kubernetes, disattiveremo l'istanza Compute Engine in modo da poter acquisire snapshot dei dischi. Prima di andare avanti, prendi nota dell'ID istanza, che avremo bisogno in seguito:

gcloud compute instances describe webserver --zone us-central1-a | grep ^id

Arresta l'istanza Compute:

gcloud compute instances stop webserver --zone us-central1-a

Ora che l'istanza è stata arrestata, possiamo creare snapshot dei dischi in tutta sicurezza eseguendo lo script seguente. Assicurati di inserire l'ID progetto e l'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 queste segnalazioni, 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 creati
  • Genera un file YAML nella directory di lavoro attuale per eseguire il deployment di un set stateful che ospiterà il tuo server web

Il file YAML generato eseguirà il provisioning di un set stateful nel nostro cluster Kubernetes, insieme alle richieste di volumi permanenti necessarie per montare i dischi copiati nel container del nostro server web. Possiamo applicare queste modifiche con kubectl:

kubectl apply -f containerized-webserver.yaml

Controlla lo stato di webserver-statefulset nella pagina Carichi di lavoro:

È normale che lo stato visualizzi "Pods are pending" (I pod sono in attesa) per alcuni minuti dopo l'esecuzione di kubectl apply. Vai avanti una volta che lo stato indica "OK".

5. Esponi il cluster al bilanciatore del carico

A questo punto, il cluster Kubernetes dovrebbe eseguire il server web come set stateful, ma dovremo anche esporre il container a un bilanciatore del carico per accedere al server web tramite un indirizzo IP esterno. In Cloud Shell, crea un nuovo file denominato loadbalancer.yaml con i seguenti contenuti:

loadbalancer.yaml

apiVersion: v1
kind: Service
metadata:
  name: webserver-loadbalancer
spec:
  type: LoadBalancer
  selector:
    app: webserver-statefulset
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

E ora applicalo con kubectl:

kubectl apply -f loadbalancer.yaml

Possiamo usare kubectl per recuperare l'indirizzo IP esterno del servizio webserver-container:

kubectl get services

Se inseriamo l'indirizzo IP esterno nel browser, dovremmo ottenere la stessa schermata di benvenuto nginx predefinita di prima:

5c08e3b2bd17e03.png

Ce l'abbiamo fatta. Il nostro server web GCE adesso è ospitato su Kubernetes. Bene!

6. Monitoraggio di Stackdriver

Metriche

In quanto servizio Kubernetes gestito, Kubernetes Engine è dotato automaticamente di strumenti sia per il logging che per il monitoraggio con Stackdriver. Diamo un'occhiata ad alcune delle metriche acquisite automaticamente da Stackdriver.

Fai clic sul link Monitoring nel menu dei prodotti. Per accedere per la prima volta dal tuo progetto, la configurazione dell'area di lavoro potrebbe richiedere alcuni minuti.

Al termine del caricamento, passa il mouse sopra Risorse nel riquadro a sinistra e seleziona "Kubernetes Engine NUOVO" dal menu.

4e62c8ad3f2b3fe9.png

Ogni riga della dashboard qui presentata rappresenta una risorsa Kubernetes. Puoi spostarti tra la visualizzazione infrastruttura, carichi di lavoro o servizi utilizzando i link sopra la dashboard.

62066a9251d19843.png

Nella visualizzazione Carichi di lavoro, espandi "my-gke-cluster" e visualizza in dettaglio il valore predefinito > server web-statefulset > webserver-statefulset-0 > webserver-statefulset. Fai clic sul container webserver-stateful set. Qui troverai alcune metriche pronte all'uso acquisite da Stackdriver, tra cui l'utilizzo della memoria e della CPU.

d054778de301429e.png

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 e diagrammi per tutti i dati delle metriche disponibili. 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.

56a0513efe60de3e.png

Ora che la dashboard è vuota, possiamo aggiungere le metriche che vogliamo tenere d'occhio. Diamo alla dashboard senza titolo un nome utile come 'Contenitori del server web personale' e fai clic su "Aggiungi grafico" in alto a destra:

bd66ba91f3125028.png

Ricordi le metriche pronte all'uso? 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à i campi Tipo di risorsa e Metrica.

Successivamente, useremo il filtro in base al project_id (se abbiamo più progetti) e al 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.

3d3d45e4357454e0.png

7. Controllo di uptime e criterio di avviso

Con Stackdriver, possiamo impostare avvisi per ricevere una notifica quando una metrica raggiunge i valori di soglia specificati. Ad esempio, possiamo fare in modo che Stackdriver ci invii un'email quando l'utilizzo della CPU nell'ultimo passaggio è superiore a una certa soglia per un periodo di tempo prolungato, il che potrebbe indicare un problema con l'app. Per dimostrare l'aspetto di questi avvisi, configuriamo un controllo di uptime e simuliamo un'interruzione.

Nel riquadro a sinistra, seleziona Controlli di uptime e poi Panoramica dei controlli di uptime:

49368e5700274cf2.png

Come suggerisce la pagina Controlli di uptime, impostiamo il nostro primo controllo di uptime. Fai clic sul pulsante Aggiungi controllo di uptime in alto a destra nella pagina.

d884560f91011009.png

Nel modulo successivo, inserisci "Endpoint Uptime" come titolo e l'indirizzo IP esterno del bilanciatore del carico come nome host.

568a8f1e27ae8417.png

Fai clic su Salva. Ti verrà chiesto di creare un criterio di avviso associato:

f89d53a106a709f4.png

Fai clic su Crea criterio di avviso.

Chiamiamo questo "Criterio di uptime degli endpoint". Nella sezione Configurazione, imposta "Trigger condizione se" a "Qualsiasi violazione delle serie temporali" e fai clic su Salva.

74609849348bd03e.png

Non abbiamo ancora finito. Successivamente, specificheremo un canale di notifica per ricevere una notifica in caso di violazione delle norme di avviso. Nel menu a discesa Tipo di canale di notifica seleziona Email seguito da un indirizzo email valido.

44c474e28a497659.png

Fai clic su Add Notification Channe (Aggiungi canale di notifica). Infine, nella parte inferiore del modulo, assegna il nome "Web App Uptime" al criterio e fai clic su Salva.

Per vedere l'aspetto di un avviso, apri di nuovo Cloud Shell nella console Cloud. Il seguente comando arresterà il servizio nginx in esecuzione nel nostro pod del server web:

kubectl exec -t webserver-statefulset-0 -- /bin/bash -c "nginx -s stop"

Dopo qualche minuto, dovresti ricevere un'email di avviso dell'interruzione del servizio:

808ac1d75ce3681f.png

Annullamo l'operazione. Torna in Cloud Shell e riavvia nginx:

kubectl exec -t webserver-statefulset-0 -- /bin/bash -c "nginx"

Dopo pochi minuti , riceverai un'altra email di Stackdriver, questa volta con notizie migliori rispetto a prima:

5b8262fbbc4877c.png

8. Esegui la pulizia

Ora che abbiamo eseguito la migrazione da GCE a GKE con Migrate for Anthos, puliamo il nostro progetto di tutte le risorse che abbiamo creato.

Eliminare il progetto

Se preferisci, puoi eliminare l'intero progetto. Nella console Google Cloud, vai alla pagina Cloud Resource Manager:

Nell'elenco dei progetti, seleziona quello a cui abbiamo lavorato e fai clic su Elimina. Ti verrà chiesto di digitare l'ID progetto. Inseriscilo e fai clic su Arresta.

Se preferisci eliminare i vari componenti uno alla volta, vai alla sezione successiva.

Stackdriver

Dashboard

Dalla pagina della dashboard, fai clic sull'icona delle impostazioni dc259295eb33cb42.png nella parte superiore della pagina e seleziona Elimina dashboard.

Criterio di avviso

Nella pagina Norme, seleziona Elimina dal menu Azioni 2ef75d82e76accaa.png 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 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 bilanciatore del carico)

gcloud container clusters delete my-gke-cluster --zone=us-central1-a

Dischi

Il nostro set stateful ha utilizzato un disco che abbiamo creato. Utilizza il codice seguente per recuperare il nome:

gcloud compute disks list --filter=webserver

Utilizzando il tuo nome disco al posto del mio, eliminalo con:

gcloud compute disks delete vls-690d-webserver --zone=us-central1-a

Pulizia eseguita.

9. Complimenti!

Complimenti! Hai eseguito la migrazione del server web da un'istanza GCE a un cluster Kubernetes utilizzando Migrate for Anthos.

Argomenti trattati

  • Abbiamo eseguito la migrazione di un server web da GCE a un cluster Kubernetes utilizzando Migrate for Anthos.
  • Abbiamo aperto al mondo il nostro set stateful web server esponendolo tramite un servizio di bilanciamento del carico di Kubernetes.
  • Abbiamo abilitato Stackdriver e creato una dashboard personalizzata
  • Abbiamo configurato un controllo di uptime e un criterio di avviso per comunicarci quando il nostro server web smette di funzionare