Configurare i pod di Google Kubernetes Engine utilizzando l'inserimento manuale di Envoy

Questa guida mostra come configurare gli host Google Kubernetes Engine o Kubernetes Pod e i componenti di bilanciamento del carico richiesti da Cloud Service Mesh.

Prima di seguire le istruzioni riportate in questa guida, completa le attività preliminari descritte in Prepararsi alla configurazione delle API di routing dei servizi con Envoy e carichi di lavoro senza proxy.

Puoi configurare Cloud Service Mesh utilizzando l'SDK o le API REST per il bilanciamento del carico di Compute Engine. Consulta i riferimenti all'API di bilanciamento del carico e a gcloud.

Configurazione dei cluster GKE/Kubernetes per Cloud Service Mesh

Questa sezione descrive i passaggi necessari per abilitare i cluster GKE/Kubernetes a funzionare con Cloud Service Mesh.

Creazione del cluster GKE

I cluster GKE devono soddisfare i seguenti requisiti:

Il seguente esempio mostra come creare un cluster GKE chiamato traffic-director-cluster nella zona us-central1-a.

Console

Per creare un cluster utilizzando la console Google Cloud, svolgi i seguenti passaggi:

  1. Vai al menu Kubernetes Engine nella console Google Cloud.

    Vai al menu Google Kubernetes Engine

  2. Fai clic su Crea cluster.

  3. Completa i seguenti campi:

    • Nome: inserisci traffic-director-cluster.
    • Tipo di località: Zonal.
    • Zona: us-central1-a.
  4. Nel riquadro di navigazione, in Pool di nodi, fai clic su default-pool.

  5. Il campo Dimensioni indica il numero di nodi da creare nel cluster. Devi disporre di una quota di risorse disponibile per i nodi e le relative risorse (ad esempio le route del firewall).

  6. Nel riquadro di navigazione, fai clic su Nodi in default-pool.

  7. Il campo Tipo di macchina indica il tipo di macchina di Compute Engine da utilizzare per le istanze. Ogni tipo di macchina viene fatturato in modo diverso. Per informazioni sui prezzi dei tipo di macchina, consulta la pagina dei prezzi di Compute Engine.

  8. Nel riquadro di navigazione, in default-pool, fai clic su Sicurezza.

  9. In Ambiti di accesso, fai clic su Consenti l'accesso completo a tutte le API Cloud.

  10. Personalizza il cluster in base alle tue esigenze.

  11. Fai clic su Crea.

Dopo aver creato un cluster nella console Google Cloud, devi configurarekubectl per interagire con il cluster. Per scoprire di più, consulta la sezione Generare una voce kubeconfig.

gcloud

gcloud container clusters create traffic-director-cluster \
  --zone us-central1-a \
  --scopes=https://www.googleapis.com/auth/cloud-platform \
  --enable-ip-alias

Ottenere i privilegi del cluster GKE richiesti

Per GKE, passa al cluster(2) appena creato emettendo il seguente comando. In questo modo, kubectl viene indirizzato al cluster corretto.

gcloud container clusters get-credentials traffic-director-cluster \
    --zone us-central1-a

Configurazione dei servizi GKE/Kubernetes

Questa sezione mostra come preparare le specifiche di deployment di Kubernetes per il funzionamento con Cloud Service Mesh. Consiste nella configurazione dei servizi con NEG e nell'iniezione di proxy sidecar nei pod che richiedono l'accesso ai servizi gestiti da Cloud Service Mesh.

Configura la regola firewall

Per verificare che i pod di backend siano in esecuzione, devi configurare una regola firewall che consenta gli intervalli di indirizzi IP del controllo di integrità.

Console

  1. Vai alla pagina Criteri firewall nella console Google Cloud.
    Vai alla pagina Criteri firewall
  2. Fai clic su Crea regole firewall.
  3. Nella pagina Crea una regola firewall, fornisci le seguenti informazioni:
    • Nome: specifica un nome per la regola. Per questo esempio, utilizza fw-allow-health-checks.
    • Rete: scegli una rete VPC.
    • Priorità: inserisci un numero per la priorità. I numeri più bassi hanno priorità più elevate. Assicurati che la regola firewall abbia una priorità superiore rispetto alle altre regole che potrebbero negare il traffico in entrata.
    • Direzione del traffico: scegli in entrata.
    • Azione in caso di corrispondenza: scegli Consenti.
    • Destinazioni: scegli Tutte le istanze nella rete.
    • Filtro di origine: scegli il tipo di intervallo IP corretto.
    • Intervalli IP di origine: 35.191.0.0/16,130.211.0.0/22
    • Filtro di destinazione: seleziona il tipo di IP.
    • Protocolli e porte: fai clic su Porte e protocolli specificati, quindi seleziona tcp. TCP è il protocollo di base per tutti i protocolli di controllo di integrità.
    • Fai clic su Crea.

gcloud

  1. Utilizza il seguente comando gcloud per creare una regola firewall denominata fw-allow-health-checks che consenta le connessioni in entrata alle istanze della tua rete con il tag allow-health-checks. Sostituisci NETWORK_NAME con il nome della tua rete.

    gcloud compute firewall-rules create fw-allow-health-checks \
        --network NETWORK_NAME \
        --action ALLOW \
        --direction INGRESS \
        --source-ranges 35.191.0.0/16,130.211.0.0/22 \
        --rules tcp

Per ulteriori informazioni, consulta configurare la regola firewall per i controlli di integrità.

Configurazione dei servizi GKE / Kubernetes con NEG

I servizi GKE devono essere esposti tramite gruppi di endpoint di rete (NEG) in modo da poterli configurare come backend di un servizio di backend Cloud Service Mesh. Aggiungi l'annotazione NEG alla specifica del servizio Kubernetes e scegli un nome (sostituendo NEG-NAME nell'esempio di seguito) in modo da poterlo trovare facilemente in un secondo momento. Il nome è necessario quando colleghi il NEG al servizio di backend Cloud Service Mesh. Per ulteriori informazioni sull'annotazione dei gruppi di esclusione di nome, consulta Nominare i gruppi di esclusione di nome.

...
metadata:
  annotations:
    cloud.google.com/neg: '{"exposed_ports": {"80":{"name": "NEG-NAME"}}}'
spec:
  ports:
  - port: 80
    name: service-test
    protocol: TCP
    targetPort: 8000

Per ogni servizio viene creato un NEG autonomo contenente gli endpoint che sono gli indirizzi IP e le porte del pod. Per ulteriori informazioni ed esempi, consulta Gruppi di endpoint di rete autonomi.

A scopo dimostrativo, puoi eseguire il deployment di un servizio di esempio che serve il suo nome host tramite HTTP sulla porta 80:

wget -q -O - \
https://storage.googleapis.com/traffic-director/demo/trafficdirector_service_sample.yaml \
| kubectl apply -f -

Verifica che il nuovo nome host del servizio sia stato creato e che il pod dell'applicazione sia in esecuzione:

kubectl get svc

Restituisce:

NAME             TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service-test     ClusterIP   10.71.9.71   none          80/TCP    41m
[..skip..]

kubectl get pods

Restituisce:

NAME                        READY     STATUS    RESTARTS   AGE
app1-6db459dcb9-zvfg2       1/1       Running   0          6m
[..skip..]

Salvataggio del nome del NEG

Individua il gruppo NEG creato dall'esempio riportato sopra e registra il nome.

Console

Per visualizzare un elenco di gruppi di endpoint di rete, vai alla pagina Gruppi di endpoint di rete nella console Google Cloud.
Vai alla pagina Gruppi di endpoint di rete

gcloud

gcloud compute network-endpoint-groups list

Viene restituito quanto segue:

NAME                 LOCATION          ENDPOINT_TYPE      SIZE
NEG-NAME           us-central1-a     GCE_VM_IP_PORT      1

Salva il nome del NEG nella variabile NEG_NAME, ad esempio:

NEG_NAME=$(gcloud compute network-endpoint-groups list \
| grep service-test | awk '{print $1}')

Configurazione dei componenti di bilanciamento del carico di Google Cloud per Cloud Service Mesh

Le istruzioni riportate in questa sezione assicurano che i servizi GKE siano accessibili sull'indirizzo VIP del servizio bilanciato in base al carico da Cloud Service Mesh, utilizzando una configurazione di bilanciamento del carico simile ad altri prodotti Cloud Load Balancing di Google Cloud.

Devi configurare i seguenti componenti:

L'esempio di configurazione di Cloud Service Mesh che segue fa queste ipotesi:

  1. I NEG e tutte le altre risorse vengono creati nella rete default, con modalità automatica, nella zona us-central1-a.
  2. Il nome del NEG per il cluster è memorizzato nella variabile ${NEG_NAME}.

Creazione del controllo di integrità

Crea il controllo di integrità.

Console

  1. Vai alla pagina Controlli di integrità nella console Google Cloud.
    Vai alla pagina Controlli di integrità
  2. Fai clic su Crea controllo di integrità.
  3. Come nome, inserisci td-gke-health-check.
  4. Per il protocollo, seleziona HTTP.
  5. Fai clic su Crea.

gcloud

gcloud compute health-checks create http td-gke-health-check \
  --use-serving-port

Creazione del servizio di backend

Crea un servizio di backend globale con uno schema di bilanciamento del carico INTERNAL_SELF_MANAGED. Nella console Google Cloud, lo schema di bilanciamento del carico viene impostato in modo implicito. Aggiungi il controllo di integrità al servizio di backend.

Console

  1. Vai alla pagina Cloud Service Mesh nella console Google Cloud.

    Vai alla pagina Cloud Service Mesh

  2. Nella scheda Servizi, fai clic su Crea servizio.

  3. Fai clic su Continua.

  4. Come nome del servizio, inserisci td-gke-service.

  5. In Tipo di backend, seleziona Gruppi di endpoint di rete.

  6. Seleziona il gruppo di endpoint di rete che hai creato.

  7. Imposta RPS massimo su 5.

  8. Fai clic su Fine.

  9. In Controllo di integrità, seleziona td-gke-health-check, ovvero il controllo di integrità che hai creato.

  10. Fai clic su Continua.

gcloud

  1. Crea il servizio di backend e associa il controllo di integrità al servizio di backend.

    gcloud compute backend-services create td-gke-service \
     --global \
     --health-checks td-gke-health-check \
     --load-balancing-scheme INTERNAL_SELF_MANAGED
    
  2. Aggiungi i NEG di backend al servizio di backend.

    gcloud compute backend-services add-backend td-gke-service \
     --global \
     --network-endpoint-group ${NEG_NAME} \
     --network-endpoint-group-zone us-central1-a \
     --balancing-mode RATE \
     --max-rate-per-endpoint 5
    

Creazione della mappa di regole di routing

Segui queste istruzioni per creare la regola di routing, regola di forwarding e l'indirizzo IP interno per la configurazione di Cloud Service Mesh.

Il traffico inviato all'indirizzo IP interno viene intercettato dal proxy Envoy e inviato al servizio appropriato in base alle regole host e percorso.

La regola di forwarding viene creata come regola di forwarding globale con load-balancing-scheme impostato su INTERNAL_SELF_MANAGED.

Puoi impostare l'indirizzo della regola di forwarding su 0.0.0.0. In questo caso, il traffico viene indirizzato in base al nome host HTTP e alle informazioni sul percorso configurati nella mappa URL, indipendentemente dall'indirizzo IP effettivo a cui viene risolto il nome host. In questo caso, gli URL (nome host più percorso dell'URL) dei tuoi servizi, come configurati nelle regole host, devono essere univoci all'interno della configurazione del tuo mesh di servizi. In altre parole, non puoi avere due servizi diversi, con set di backend diversi, che utilizzano entrambi la stessa combinazione di nome host e percorso.

In alternativa, puoi attivare il routing in base alla destinazione VIP effettiva del servizio. Se configuri l'IP virtuale del tuo servizio come parametro address della regola di forwarding, solo le richieste destinate a questo indirizzo IP vengono instradate in base ai parametri HTTP specificati nella mappa URL.

Console

Nella console, il proxy di destinazione viene combinato con la regola di forwarding. Quando crei la regola di forwarding, Google Cloud crea automaticamente un proxy HTTP di destinazione e lo collega alla mappa degli URL.

La regola di route è composta dalla regola di forwarding e dalle regole host e percorso (chiamate anche mappa URL).

  1. Vai alla pagina Cloud Service Mesh nella console Google Cloud.

    Vai alla pagina Cloud Service Mesh

  2. Fai clic su Mappe di regole di routing.

  3. Fai clic su Crea regola di routing.

  4. Inserisci td-gke-url-map come Nome della mappa di URL.

  5. Fai clic su Aggiungi regola di inoltro.

  6. Inserisci td-gke-forwarding-rule come nome della regola di forwarding.

  7. Seleziona la tua rete.

  8. Seleziona il tuo IP interno.

  9. Fai clic su Salva.

  10. Se vuoi, aggiungi regole host e percorso personalizzate o lascia quelle predefinite.

  11. Imposta l'host su service-test.

  12. Fai clic su Salva.

gcloud

  1. Crea una mappa URL che utilizza il servizio di backend.

    gcloud compute url-maps create td-gke-url-map \
       --default-service td-gke-service
    
  2. Crea un'espressione di corrispondenza del percorso della mappa URL e una regola host per instradare il traffico per il tuo servizio in base al nome host e a un percorso. Questo esempio utilizza service-test come nome del servizio e un corrispettivo predefinito per i percorsi che corrisponde a tutte le richieste di percorso per questo host (/*). service-test è anche il nome configurato del servizio Kubernetes utilizzato nella configurazione di esempio riportata sopra.

    gcloud compute url-maps add-path-matcher td-gke-url-map \
       --default-service td-gke-service \
       --path-matcher-name td-gke-path-matcher
    
    gcloud compute url-maps add-host-rule td-gke-url-map \
       --hosts service-test \
       --path-matcher-name td-gke-path-matcher
    
  3. Crea il proxy HTTP di destinazione.

    gcloud compute target-http-proxies create td-gke-proxy \
       --url-map td-gke-url-map
    
  4. Crea la regola di forwarding.

    gcloud compute forwarding-rules create td-gke-forwarding-rule \
      --global \
      --load-balancing-scheme=INTERNAL_SELF_MANAGED \
      --address=0.0.0.0 \
      --target-http-proxy=td-gke-proxy \
      --ports 80 --network default
    

A questo punto, Cloud Service Mesh è configurato per bilanciare il carico del traffico per i servizi specificati nella mappa URL tra i backend nel gruppo di endpoint di rete.

A seconda di come i microservizi sono distribuiti sulla rete, potresti dover aggiungere altre regole di inoltro o altre regole host e percorso alla mappa URL.

Verifica della configurazione tramite il deployment di un client di esempio per i test

Questa sezione mostra come raggiungere i backend di Cloud Service Mesh da un'applicazione client.

Per dimostrare la funzionalità, puoi eseguire il deployment di un pod di esempio che esegue Busybox. Il pod ha accesso a service-test, creato nella sezione precedente, e riceve il traffico bilanciato in base al carico da Cloud Service Mesh.

Inserimento di un proxy sidecar nei pod GKE / Kubernetes

Per accedere a un servizio gestito da Cloud Service Mesh, in un pod deve essere installato un proxy sidecar compatibile con l'API xDS.

In questo esempio, esegui il deployment di un client Busybox con un sidecar Istio-proxy e i contenitori init aggiunti al deployment utilizzando la specifica di riferimento.

Se utilizzi le API precedenti, sostituisci le variabili PROJECT_NUMBER e NETWORK_NAME con il numero del progetto e il nome della rete:

wget -q -O - https://storage.googleapis.com/traffic-director/demo/trafficdirector_client_sample_xdsv3.yaml
sed -i "s/PROJECT_NUMBER/PROJECT_NUMBER/g" trafficdirector_client_sample_xdsv3.yaml
sed -i "s/NETWORK_NAME/NETWORK_NAME/g" trafficdirector_client_sample_xdsv3.yaml
kubectl apply -f trafficdirector_client_sample_xdsv3.yaml

Se utilizzi le nuove API di instradamento dei servizi, attualmente in anteprima, sostituisci le variabili PROJECT_NUMBER e MESH_NAME con il numero e il nome del progetto Mesh:

wget -q -O - https://storage.googleapis.com/traffic-director/demo/trafficdirector_client_new_api_sample_xdsv3.yaml
sed -i "s/PROJECT_NUMBER/PROJECT_NUMBER/g" trafficdirector_client_new_api_sample_xdsv3.yaml
sed -i "s/MESH_NAME/MESH_NAME/g" trafficdirector_client_new_api_sample_xdsv3.yaml
kubectl apply -f trafficdirector_client_new_api_sample_xdsv3.yaml

Il pod Busybox ha due container in esecuzione. Il primo contenitore è il client basato sull'immagine Busybox e il secondo contenitore è il proxy Envoy iniettato come sidecar. Puoi ottenere ulteriori informazioni sul pod eseguendo il seguente comando:

kubectl describe pods -l run=client

Accesso al servizio di backend

Una volta configurate, le applicazioni sui pod in cui è stato inserito un proxy sidecar possono accedere ai servizi gestiti dai servizi Cloud Service Mesh. Per verificare la configurazione, puoi accedere a una shell su uno dei contenitori.

Se hai utilizzato la configurazione di prova fornita in questa guida, puoi eseguire il seguente comando di verifica per assicurarti che venga restituito il nome host del pod di pubblicazione.

# Get name of the Pod  with busybox.
BUSYBOX_POD=$(kubectl get po -l run=client -o=jsonpath='{.items[0].metadata.name}')

# Command to execute that tests connectivity to the service service-test.
TEST_CMD="wget -q -O - service-test; echo"

# Execute the test command on the Pod .
kubectl exec -it $BUSYBOX_POD -c busybox -- /bin/sh -c "$TEST_CMD"

Informazioni sull'intercettazione del traffico da parte del proxy sidecar

Tieni presente che, in questo esempio, quando il client Busybox invia richieste al servizio di backend, ogni richiesta viene sottoposta a proxy dal proxy sidecar.

Questa applicazione di dimostrazione utilizza il proxy Envoy. Per questo motivo, il client visualizza "server: envoy" nell'intestazione delle risposte del server.

Per confermare, utilizza i seguenti comandi:

# Get the name of the Pod  with Busybox.
BUSYBOX_POD=$(kubectl get po -l run=client -o=jsonpath='{.items[0].metadata.name}')

# Command to send a request to service-test and output server response headers.
TEST_CMD="wget -S --spider service-test; echo"

# Execute the test command on the Pod .
kubectl exec -it $BUSYBOX_POD -c busybox -- /bin/sh -c "$TEST_CMD"

In questo esempio, hai creato una regola di forwarding utilizzando l'indirizzo VIP 0.0.0.0. Ciò significa che Cloud Service Mesh inoltra le richieste al backend unicamente in base all'intestazione Host. In questo caso, l'indirizzo IP di destinazione può essere qualsiasi indirizzo, purché l'intestazione dell'host della richiesta corrisponda all'host definito nella mappa URL service-test.

Per confermare, esegui i seguenti comandi di test:

# Get name of the Pod  with Busybox.
BUSYBOX_POD=$(kubectl get po -l run=client -o=jsonpath='{.items[0].metadata.name}')

# Command to send a request to service-test setting the Host header and using a random IP address.
TEST_CMD="wget -q --header 'Host: service-test' -O - 1.2.3.4; echo"

# Execute the test command on the Pod .
kubectl exec -it $BUSYBOX_POD -c busybox -- /bin/sh -c "$TEST_CMD"

Passaggi successivi