Nozioni di base suAWS App Meshe Amazon EC2 - AWS App Mesh

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Nozioni di base suAWS App Meshe Amazon EC2

Questo argomento ti aiuta a usareAWS App Meshcon un servizio effettivo in esecuzione su Amazon EC2. Questo tutorial copre le funzionalità di base di diversi tipi di risorse App Mesh.

Scenario

Per illustrare come utilizzare App Mesh, si supponga di disporre di un'applicazione con le seguenti caratteristiche:

  • È costituito da due servizi denominatiserviceAeserviceB.

  • Entrambi i servizi sono registrati in uno spazio dei nomi denominato apps.local.

  • ServiceA comunica con serviceB su HTTP/2, porta 80.

  • Hai già distribuito la versione 2 di serviceB e l'hai registrata con il nome serviceBv2 nello spazio dei nomi apps.local.

I requisiti sono i seguenti:

  • Vuoi inviare il 75 percento del traffico daserviceAaserviceBe il 25 percento del traffico versoserviceBv2per validarloserviceBv2è privo di bug prima di inviare il 100% del traffico daserviceAad esso.

  • Vuoi essere in grado di regolare facilmente la ponderazione del traffico in modo che il 100% del traffico vada a serviceBv2 una volta dimostrato essere affidabile. Una volta che tutto il traffico viene inviato aserviceBv2, vuoi interrompereserviceB.

  • Non è necessario modificare alcun codice applicativo esistente o registrazione di service discovery per i servizi effettivi per soddisfare i requisiti precedenti.

Per soddisfare le tue esigenze, decidi di creare un servizio mesh App Mesh con servizi virtuali, nodi virtuali, un router virtuale e un percorso. Dopo aver implementato la mesh, aggiorni i tuoi servizi per utilizzare il proxy Envoy. Una volta aggiornati, i servizi comunicano tra loro tramite il proxy Envoy anziché direttamente tra loro.

Prerequisiti

App Mesh supporta i servizi Linux registrati con DNS,AWS Cloud Mapo entrambi. Per utilizzare questa guida introduttiva, è consigliabile avere tre servizi esistenti registrati con DNS. Puoi creare una mesh dei servizi e le relative risorse anche se i servizi non esistono, ma non puoi utilizzare la mesh fino a quando non hai distribuito i servizi effettivi.

Se non hai già servizi in esecuzione, puoi avviare le istanze Amazon EC2 e distribuirvi le applicazioni. Per ulteriori informazioni, consulta la paginaTutorial: Nozioni di base sulle istanze Linux di Amazon EC2nella Guida per l'utente di Amazon EC2 per le istanze Linux. Le fasi rimanenti presuppongono che i servizi effettivi siano denominati serviceA, serviceB e serviceBv2 e che tutti i servizi siano individuabili tramite uno spazio dei nomi denominato apps.local.

Fase 1: Crea un servizio mesh e virtuale

Una mesh dei servizi è un limite logico per il traffico di rete tra i servizi che si trovano al suo interno. Per ulteriori informazioni, consulta la pagina Mesh di servizio . Un servizio virtuale è un'astrazione di un servizio effettivo. Per ulteriori informazioni, consulta la pagina Servizi virtuali .

Crea le seguenti risorse:

  • Una mesh denominata apps, perché tutti i servizi nello scenario sono registrati nello spazio dei nomi apps.local.

  • Un servizio virtuale denominato serviceb.apps.local perché il servizio virtuale rappresenta un servizio individuabile tramite questo nome e non vuoi modificare il codice per fare riferimento a un altro nome. Un servizio virtuale denominato servicea.apps.local viene aggiunto in una fase successiva.

Puoi utilizzare il pluginAWS Management Consoleo ilAWS CLIversione 1.18.116 o superiore o 2.0.38 o superiore per completare i seguenti passaggi. Se si utilizza l'AWS CLI, usare il comando aws --version per controllare la versione dell'AWS CLI installata. Se non è installata la versione 1.18.116 o superiore o 2.0.38 o superiore, è necessarioinstallazione o aggiornamento dellaAWS CLI. Seleziona la scheda relativa allo strumento che desideri utilizzare.

AWS Management Console
  1. Apri la procedura guidata per la prima esecuzione della console App Mesh all'indirizzohttps://console.aws.amazon.com/appmesh/get-started.

  2. Per Mesh name (Nome mesh), immettere apps.

  3. Per Virtual service name (Nome servizio virtuale), immettere serviceb.apps.local.

  4. Scegliere Next (Avanti) per continuare.

AWS CLI
  1. Creare una mesh con il comando create-mesh.

    aws appmesh create-mesh --mesh-name apps
  2. Creare un servizio virtuale con il comando create-virtual-service.

    aws appmesh create-virtual-service --mesh-name apps --virtual-service-name serviceb.apps.local --spec {}

Fase 2: Creazione di un nodo virtuale

Un nodo virtuale funziona come un puntatore logico a un servizio effettivo. Per ulteriori informazioni, consulta la pagina Nodi virtuali .

Crea un nodo virtuale denominato serviceB perché uno dei nodi virtuali rappresenta il servizio effettivo denominato serviceB. Il servizio effettivo rappresentato dal nodo virtuale è individuabile tramite DNS con il nome host serviceb.apps.local. In alternativa, puoi individuare i servizi effettivi utilizzando AWS Cloud Map. Il nodo virtuale ascolta il traffico utilizzando il protocollo HTTP/2 sulla porta 80. Sono supportati anche altri protocolli, così come i controlli di stato. Crei nodi virtuali perserviceAeserviceBv2in una fase successiva.

AWS Management Console
  1. Per Virtual node name (Nome nodo virtuale), immettere serviceB.

  2. Per Modalità di rilevamento del servizio, scegli DNS e immetti serviceb.apps.local per Nome host DNS.

  3. In Configurazione del listener, scegli http2 per Protocollo e immetti 80 per Porta.

  4. Scegliere Next (Avanti) per continuare.

AWS CLI
  1. Crea un file denominato create-virtual-node-serviceb.json con i seguenti contenuti:

    { "meshName": "apps", "spec": { "listeners": [ { "portMapping": { "port": 80, "protocol": "http2" } } ], "serviceDiscovery": { "dns": { "hostname": "serviceB.apps.local" } } }, "virtualNodeName": "serviceB" }
  2. Crea il nodo virtuale concreate-virtual-nodecomando che utilizza il file JSON come input.

    aws appmesh create-virtual-node --cli-input-json file://create-virtual-node-serviceb.json

Fase 3: Crea un router e un percorso virtuali

I router virtuali gestiscono il traffico per uno o più servizi virtuali all'interno della mesh. Per ulteriori informazioni, consulta Router virtuali e Route.

Crea le seguenti risorse:

  • Un router virtuale denominato serviceB perché il servizio virtuale serviceB.apps.local non avvia la comunicazione in uscita con altri servizi. Tieni presente che il servizio virtuale creato in precedenza è un'astrazione del servizio serviceb.apps.local effettivo. Il servizio virtuale invia il traffico al router virtuale. Il router virtuale ascolta il traffico utilizzando il protocollo HTTP/2 sulla porta 80. Sono supportati anche altri protocolli.

  • Una route denominata serviceB. Instrada il 100 percento del suo traffico verso ilserviceBnodo virtuale. Il peso viene aggiunto in una fase successiva dopo aver aggiunto ilserviceBv2nodo virtuale. Sebbene non sia trattato in questa guida, è possibile impostare criteri di filtro aggiuntivi per la route e aggiungere una policy per i nuovi tentativi per far sì che il proxy Envoy effettui più tentativi di invio del traffico a un nodo virtuale quando si verifica un problema di comunicazione.

AWS Management Console
  1. Per Virtual router name (Nome router virtuale), immettere serviceB.

  2. In Configurazione del listener, scegli http2 per Protocollo e specifica 80 per Porta.

  3. Per Route name (Nome route), immettere serviceB.

  4. Per Tipo di route, scegli http2.

  5. PerNome del nodo virtualesottoConfigurazione di destinazione, selectserviceBe inserisci100perWeight.

  6. SottoConfigurazione della partita, scegli unMetodo.

  7. Scegliere Next (Avanti) per continuare.

AWS CLI
  1. Creare un router virtuale.

    1. Crea un file denominato create-virtual-router.json con i seguenti contenuti:

      { "meshName": "apps", "spec": { "listeners": [ { "portMapping": { "port": 80, "protocol": "http2" } } ] }, "virtualRouterName": "serviceB" }
    2. Crea il router virtuale concreate-virtual-routercomando che utilizza il file JSON come input.

      aws appmesh create-virtual-router --cli-input-json file://create-virtual-router.json
  2. Creare una route.

    1. Crea un file denominato create-route.json con i seguenti contenuti:

      { "meshName" : "apps", "routeName" : "serviceB", "spec" : { "httpRoute" : { "action" : { "weightedTargets" : [ { "virtualNode" : "serviceB", "weight" : 100 } ] }, "match" : { "prefix" : "/" } } }, "virtualRouterName" : "serviceB" }
    2. Creare la route con il comando create-route utilizzando il file JSON come input.

      aws appmesh create-route --cli-input-json file://create-route.json

Fase 4: Rivedi e crea

Rivedi le impostazioni in relazione alle istruzioni precedenti.

AWS Management Console

Scegli Modifica per apportare modifiche in qualsiasi sezione. Una volta soddisfatte le impostazioni, scegli Crea una mesh.

La schermata Stato mostra tutte le risorse mesh create. Puoi visualizzare le risorse create nella console selezionando Visualizza mesh.

AWS CLI

Esaminare le impostazioni della mesh creata con il comando describe-mesh .

aws appmesh describe-mesh --mesh-name apps

Rivedi le impostazioni del servizio virtuale che hai creato condescribe-virtual-servicecomando.

aws appmesh describe-virtual-service --mesh-name apps --virtual-service-name serviceb.apps.local

Rivedi le impostazioni del nodo virtuale che hai creato condescribe-virtual-nodecomando.

aws appmesh describe-virtual-node --mesh-name apps --virtual-node-name serviceB

Verifica delle impostazioni del router virtuale creato condescribe-virtual-routercomando.

aws appmesh describe-virtual-router --mesh-name apps --virtual-router-name serviceB

Esaminare le impostazioni del percorso creato con il comando describe-route .

aws appmesh describe-route --mesh-name apps \ --virtual-router-name serviceB --route-name serviceB

Fase 5: Creazione di risorse aggiuntive

Per completare lo scenario è necessario:

  • Creare un nodo virtuale denominato serviceBv2 e un altro denominato serviceA. Entrambi i nodi virtuali ascoltano le richieste su HTTP/2, porta 80. Per ilserviceAnodo virtuale, configura un backend diserviceb.apps.local. Tutto il traffico in uscita dallaserviceAil nodo virtuale viene inviato al servizio virtuale denominatoserviceb.apps.local. Sebbene non sia trattato in questa guida, è anche possibile specificare un percorso file in cui scrivere i log degli accessi per un nodo virtuale.

  • Crea un servizio virtuale aggiuntivo denominatoservicea.apps.local, che invia tutto il traffico direttamente alserviceAnodo virtuale.

  • Aggiornare la route serviceB creata in una fase precedente per inviare il 75% del traffico al nodo virtuale serviceB e il 25% del traffico al nodo virtuale serviceBv2. È possibile continuare a modificare i pesi finché serviceBv2 riceva il 100% del traffico. Una volta inviato tutto il traffico aserviceBv2, è possibile chiudere e interrompere ilserviceBnodo virtuale e servizio effettivo. Quando si cambiano i pesi, il codice non richiede alcuna modifica perché i nomi dei servizi virtuali ed effettivi serviceb.apps.local non cambiano. Tenere presente che il servizio virtuale serviceb.apps.local invia il traffico al router virtuale che instrada il traffico ai nodi virtuali. I nomi di individuazione dei servizi per i nodi virtuali possono essere modificati in qualsiasi momento.

AWS Management Console
  1. Nel riquadro di navigazione a sinistra, selezionare Meshes (Mesh).

  2. Selezionare la mesh apps creata in una fase precedente.

  3. Nel riquadro di navigazione a sinistra selezionare Virtual nodes (Nodi virtuali).

  4. Scegliere Create virtual node (Crea nodo virtuale).

  5. Per Nome del nodo virtuale immetti serviceBv2, per Modalità di rilevamento del servizio scegli DNS e per Nome host DNS immetti servicebv2.apps.local.

  6. Per Configurazione del listener seleziona http2 per Protocollo e immetti 80 per Porta.

  7. Scegliere Create virtual node (Crea nodo virtuale).

  8. Scegli Crea un nodo virtuale. Immetti serviceA per Nome del nodo virtuale. Per Modalità di rilevamento del servizio scegli DNS e per Nome host DNS immetti servicea.apps.local.

  9. Per Inserisci un nome del servizio virtuale in Nuovo back-end immetti serviceb.apps.local.

  10. In Configurazione del listener scegli http2 per Protocollo, immetti 80 per Porta e quindi scegli Crea un nodo virtuale.

  11. Nel riquadro di navigazione a sinistra selezionare Virtual routers (Router virtuali) quindi selezionare il router virtuale serviceB dall'elenco.

  12. In Route, seleziona la route denominata ServiceB creata in una fase precedente e scegli Modifica.

  13. In Destinazioni, Nome del nodo virtuale, cambia il valore di Peso per serviceB su 75.

  14. ScegliAggiungi obiettivo, scegliserviceBv2dall'elenco a discesa e impostazione del valore diWeighta25.

  15. Seleziona Salva.

  16. Nel riquadro di navigazione a sinistra seleziona Servizi virtuali, quindi scegli Crea un servizio virtuale.

  17. Immetti servicea.apps.local per Nome del servizio virtuale, seleziona Nodo virtuale per Provider, seleziona serviceA per Nodo virtuale e quindi scegli Crea un servizio virtuale.

AWS CLI
  1. Creare il nodo virtuale serviceBv2.

    1. Crea un file denominato create-virtual-node-servicebv2.json con i seguenti contenuti:

      { "meshName": "apps", "spec": { "listeners": [ { "portMapping": { "port": 80, "protocol": "http2" } } ], "serviceDiscovery": { "dns": { "hostname": "serviceBv2.apps.local" } } }, "virtualNodeName": "serviceBv2" }
    2. Creare il nodo virtuale .

      aws appmesh create-virtual-node --cli-input-json file://create-virtual-node-servicebv2.json
  2. Creare il nodo virtuale serviceA.

    1. Crea un file denominato create-virtual-node-servicea.json con i seguenti contenuti:

      { "meshName" : "apps", "spec" : { "backends" : [ { "virtualService" : { "virtualServiceName" : "serviceb.apps.local" } } ], "listeners" : [ { "portMapping" : { "port" : 80, "protocol" : "http2" } } ], "serviceDiscovery" : { "dns" : { "hostname" : "servicea.apps.local" } } }, "virtualNodeName" : "serviceA" }
    2. Creare il nodo virtuale .

      aws appmesh create-virtual-node --cli-input-json file://create-virtual-node-servicea.json
  3. Aggiornare il servizio virtuale serviceb.apps.local creato in una fase precedente per inviare il traffico al router virtuale serviceB. Quando il servizio virtuale è stato originariamente creato non inviava traffico poiché il router virtuale serviceB non era ancora stato creato.

    1. Crea un file denominato update-virtual-service.json con i seguenti contenuti:

      { "meshName" : "apps", "spec" : { "provider" : { "virtualRouter" : { "virtualRouterName" : "serviceB" } } }, "virtualServiceName" : "serviceb.apps.local" }
    2. Aggiorna il servizio virtuale conupdate-virtual-servicecomando.

      aws appmesh update-virtual-service --cli-input-json file://update-virtual-service.json
  4. Aggiornare la route serviceB creata in una fase precedente.

    1. Crea un file denominato update-route.json con i seguenti contenuti:

      { "meshName" : "apps", "routeName" : "serviceB", "spec" : { "http2Route" : { "action" : { "weightedTargets" : [ { "virtualNode" : "serviceB", "weight" : 75 }, { "virtualNode" : "serviceBv2", "weight" : 25 } ] }, "match" : { "prefix" : "/" } } }, "virtualRouterName" : "serviceB" }
    2. Aggiornare la route con il comando update-route.

      aws appmesh update-route --cli-input-json file://update-route.json
  5. Creare il servizio virtuale serviceA.

    1. Crea un file denominato create-virtual-servicea.json con i seguenti contenuti:

      { "meshName" : "apps", "spec" : { "provider" : { "virtualNode" : { "virtualNodeName" : "serviceA" } } }, "virtualServiceName" : "servicea.apps.local" }
    2. Creare il servizio virtuale .

      aws appmesh create-virtual-service --cli-input-json file://create-virtual-servicea.json

Riepilogo della mesh

Prima di creare la mesh dei servizi, erano presenti tre servizi effettivi denominati servicea.apps.local, serviceb.apps.local e servicebv2.apps.local. Oltre ai servizi effettivi, ora hai una mesh dei servizi che contiene le seguenti risorse che rappresentano i servizi effettivi:

  • Due servizi virtuali. Il proxy invia tutto il traffico dal servizio virtuale servicea.apps.local al servizio virtuale serviceb.apps.local tramite un router virtuale.

  • Tre nodi virtuali denominati serviceA, serviceB e serviceBv2. Il proxy Envoy utilizza le informazioni di individuazione dei servizi configurate per i nodi virtuali per cercare gli indirizzi IP dei servizi effettivi.

  • Un router virtuale con una route che indica al proxy Envoy di indirizzare il 75% del traffico in ingresso al nodo virtuale serviceB e il 25% del traffico al nodo virtuale serviceBv2.

Fase 6: Servizi di aggiornamento

Dopo aver creato la mesh, è necessario completare le seguenti attività:

  • Autorizza il proxy Envoy che distribuisci con ogni servizio a leggere la configurazione di uno o più nodi virtuali. Per ulteriori informazioni su come autorizzare il proxy, consultaEnvoy Proxy Authorization.

  • Per aggiornare il servizio esistente, completa i passaggi seguenti.

Configurazione di un'istanza Amazon EC2 come membro del nodo virtuale

  1. Crea un ruolo IAM.

    1. Creare un file denominato ec2-trust-relationship.json con i seguenti contenuti.

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
    2. Creare un ruolo IAM con il comando seguente.

      aws iam create-role --role-name mesh-virtual-node-service-b --assume-role-policy-document file://ec2-trust-relationship.json
  2. Associa le policy IAM al ruolo che gli consente di leggere da Amazon ECR e solo alla configurazione di uno specifico nodo virtuale App Mesh.

    1. Crea un file denominato virtual-node-policy.json con il seguente contenuto. apps è il nome della mesh creata in Fase 1: Crea un servizio mesh e virtuale e serviceB è il nome del nodo virtuale creato in Fase 2: Creazione di un nodo virtuale. Sostituzione111122223333con il tuo ID account eus-west-2con la regione in cui hai creato la mesh.

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "appmesh:StreamAggregatedResources", "Resource": [ "arn:aws:appmesh:us-west-2:111122223333:mesh/apps/virtualNode/serviceB" ] } ] }
    2. Creare la policy con il seguente comando.

      aws iam create-policy --policy-name virtual-node-policy --policy-document file://virtual-node-policy.json
    3. Come allegare la policy creata nel passaggio precedente al ruolo in modo che il ruolo possa leggere la configurazione solo perserviceBnodo virtuale di App Mesh.

      aws iam attach-role-policy --policy-arn arn:aws:iam::111122223333:policy/virtual-node-policy --role-name mesh-virtual-node-service-b
    4. Come allegare laAmazonEC2ContainerRegistryReadOnlyha gestito la policy del ruolo in modo che possa estrarre l'immagine del contenitore Envoy da Amazon ECR.

      aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly --role-name mesh-virtual-node-service-b
  3. Avviare un'istanza Amazon EC2 con il ruolo IAMche hai creato tu.

  4. Eseguire la connessione all'istanza tramite SSH.

  5. Installare Docker e l'AWS CLI nell'istanza in base alla documentazione del sistema operativo.

  6. Esegui l'autenticazione nel repository Amazon ECR Envoy nella regione da cui desideri che il tuo client Docker estragga l'immagine.

    • Tutte le regioni tranneme-south-1,ap-east-1,ap-southeast-3,eu-south-1, eaf-south-1. Puoi sostituireus-west-2con qualsiasiRegione supportataeccettome-south-1,ap-east-1,ap-southeast-3,eu-south-1, eaf-south-1.

      $aws ecr get-login-password \ --region us-west-2 \ | docker login \ --username AWS \ --password-stdin 840364872350.dkr.ecr.us-west-2.amazonaws.com
    • Regione me-south-1

      $aws ecr get-login-password \ --region me-south-1 \ | docker login \ --username AWS \ --password-stdin 772975370895.dkr.ecr.me-south-1.amazonaws.com
    • Regione ap-east-1

      $aws ecr get-login-password \ --region ap-east-1 \ | docker login \ --username AWS \ --password-stdin 856666278305.dkr.ecr.ap-east-1.amazonaws.com
  7. Esegui uno dei seguenti comandi per avviare il contenitore App Mesh Envoy sulla tua istanza, a seconda della regione da cui desideri estrarre l'immagine. I valori di app e serviceB sono i nomi dei nodi mesh e virtuali definiti nello scenario. Queste informazioni indicano al proxy quale configurazione del nodo virtuale leggere da App Mesh. Per completare lo scenario, devi completare questi passaggi anche per le istanze Amazon EC2 che ospitano i servizi rappresentati daserviceBv2eserviceAnodi virtuali. Per la propria applicazione, sostituire questi valori con quelli appropriati.

    • Tutte le regioni tranneme-south-1,ap-east-1,ap-southeast-3,eu-south-1, eaf-south-1. Puoi sostituireCodice regionecon qualsiasiRegione supportataeccetto ilme-south-1,ap-east-1,ap-southeast-3,eu-south-1, eaf-south-1Regioni. Puoi sostituire 1337 con qualsiasi valore compreso tra 0 e 2147483647.

      sudo docker run --detach --env APPMESH_RESOURCE_ARN=mesh/apps/virtualNode/serviceB \ -u 1337 --network host 840364872350.dkr.ecr.region-code.amazonaws.com/aws-appmesh-envoy:v1.22.2.1-prod
    • Regione me-south-1. Puoi sostituire 1337 con qualsiasi valore compreso tra 0 e 2147483647.

      sudo docker run --detach --env APPMESH_RESOURCE_ARN=mesh/apps/virtualNode/serviceB \ -u 1337 --network host 772975370895.dkr.ecr.me-south-1.amazonaws.com/aws-appmesh-envoy:v1.22.2.1-prod
    • Regione ap-east-1. Puoi sostituire 1337 con qualsiasi valore compreso tra 0 e 2147483647.

      sudo docker run --detach --env APPMESH_RESOURCE_ARN=mesh/apps/virtualNode/serviceB \ -u 1337 --network host 856666278305.dkr.ecr.ap-east-1.amazonaws.com/aws-appmesh-envoy:v1.22.2.1-prod
    Nota

    IlAPPMESH_RESOURCE_ARNla proprietà richiede una versione1.15.0o versione successiva dell'immagine dell'inviato. Per ulteriori informazioni, consulta la pagina Immagine dell'inviato .

    Importante

    Solo la versione v1.9.0.0-prod o successiva è supportata per l'uso con App Mesh.

  8. Seleziona Show more di seguito. Crea un file denominato envoy-networking.sh nell'istanza con i seguenti contenuti. Sostituzione8000con la porta utilizzata dal codice dell'applicazione per il traffico in entrata. Puoi modificare il valore per APPMESH_IGNORE_UID, ma il valore deve essere uguale a quello specificato nel passaggio precedente, ad esempio 1337. Se necessario puoi aggiungere altri indirizzi in APPMESH_EGRESS_IGNORED_IP. Non modificare altre righe.

    #!/bin/bash -e # # Start of configurable options # #APPMESH_START_ENABLED="0" APPMESH_IGNORE_UID="1337" APPMESH_APP_PORTS="8000" APPMESH_ENVOY_EGRESS_PORT="15001" APPMESH_ENVOY_INGRESS_PORT="15000" APPMESH_EGRESS_IGNORED_IP="169.254.169.254,169.254.170.2" # Enable routing on the application start. [ -z "$APPMESH_START_ENABLED" ] && APPMESH_START_ENABLED="0" # Outbound traffic from the processess owned by the following UID/GID will be ignored. if [ -z "$APPMESH_IGNORE_UID" ] && [ -z "$APPMESH_IGNORE_GID" ]; then echo "Variables APPMESH_IGNORE_UID and/or APPMESH_IGNORE_GID must be set." echo "Envoy must run under those IDs to be able to properly route its outbound traffic." exit 1 fi # Port numbers Application and Envoy are listening on. if [ -z "$APPMESH_ENVOY_INGRESS_PORT" ] || [ -z "$APPMESH_ENVOY_EGRESS_PORT" ] || [ -z "$APPMESH_APP_PORTS" ]; then echo "All of APPMESH_ENVOY_INGRESS_PORT, APPMESH_ENVOY_EGRESS_PORT and APPMESH_APP_PORTS variables must be set." echo "If any one of them is not set we will not be able to route either inbound, outbound, or both directions." exit 1 fi # Comma separated list of ports for which outbound traffic will be ignored, we always refuse to route SSH traffic. if [ -z "$APPMESH_EGRESS_IGNORED_PORTS" ]; then APPMESH_EGRESS_IGNORED_PORTS="22" else APPMESH_EGRESS_IGNORED_PORTS="$APPMESH_EGRESS_IGNORED_PORTS,22" fi # # End of configurable options # APPMESH_LOCAL_ROUTE_TABLE_ID="100" APPMESH_PACKET_MARK="0x1e7700ce" function initialize() { echo "=== Initializing ===" iptables -t mangle -N APPMESH_INGRESS iptables -t nat -N APPMESH_INGRESS iptables -t nat -N APPMESH_EGRESS ip rule add fwmark "$APPMESH_PACKET_MARK" lookup $APPMESH_LOCAL_ROUTE_TABLE_ID ip route add local default dev lo table $APPMESH_LOCAL_ROUTE_TABLE_ID } function enable_egress_routing() { # Stuff to ignore [ ! -z "$APPMESH_IGNORE_UID" ] && \ iptables -t nat -A APPMESH_EGRESS \ -m owner --uid-owner $APPMESH_IGNORE_UID \ -j RETURN [ ! -z "$APPMESH_IGNORE_GID" ] && \ iptables -t nat -A APPMESH_EGRESS \ -m owner --gid-owner $APPMESH_IGNORE_GID \ -j RETURN [ ! -z "$APPMESH_EGRESS_IGNORED_PORTS" ] && \ iptables -t nat -A APPMESH_EGRESS \ -p tcp \ -m multiport --dports "$APPMESH_EGRESS_IGNORED_PORTS" \ -j RETURN [ ! -z "$APPMESH_EGRESS_IGNORED_IP" ] && \ iptables -t nat -A APPMESH_EGRESS \ -p tcp \ -d "$APPMESH_EGRESS_IGNORED_IP" \ -j RETURN # Redirect everything that is not ignored iptables -t nat -A APPMESH_EGRESS \ -p tcp \ -j REDIRECT --to $APPMESH_ENVOY_EGRESS_PORT # Apply APPMESH_EGRESS chain to non local traffic iptables -t nat -A OUTPUT \ -p tcp \ -m addrtype ! --dst-type LOCAL \ -j APPMESH_EGRESS } function enable_ingress_redirect_routing() { # Route everything arriving at the application port to Envoy iptables -t nat -A APPMESH_INGRESS \ -p tcp \ -m multiport --dports "$APPMESH_APP_PORTS" \ -j REDIRECT --to-port "$APPMESH_ENVOY_INGRESS_PORT" # Apply AppMesh inbound chain to everything non-local iptables -t nat -A PREROUTING \ -p tcp \ -m addrtype ! --src-type LOCAL \ -j APPMESH_INGRESS } function enable_routing() { echo "=== Enabling routing ===" enable_egress_routing enable_ingress_redirect_routing } function disable_routing() { echo "=== Disabling routing ===" iptables -F iptables -F -t nat iptables -F -t mangle } function dump_status() { echo "=== Routing rules ===" ip rule echo "=== AppMesh routing table ===" ip route list table $APPMESH_LOCAL_ROUTE_TABLE_ID echo "=== iptables FORWARD table ===" iptables -L -v -n echo "=== iptables NAT table ===" iptables -t nat -L -v -n echo "=== iptables MANGLE table ===" iptables -t mangle -L -v -n } function main_loop() { echo "=== Entering main loop ===" while read -p '> ' cmd; do case "$cmd" in "quit") break ;; "status") dump_status ;; "enable") enable_routing ;; "disable") disable_routing ;; *) echo "Available commands: quit, status, enable, disable" ;; esac done } function print_config() { echo "=== Input configuration ===" env | grep APPMESH_ || true } print_config initialize if [ "$APPMESH_START_ENABLED" == "1" ]; then enable_routing fi main_loop
  9. Per configurare le regole iptables per instradare il traffico dell'applicazione al proxy Envoy, esegui lo script creato nel passaggio precedente.

    sudo ./envoy-networking.sh
  10. Avviare il codice dell'applicazione del nodo virtuale.

Nota

Per altri esempi e procedure dettagliate per App Mesh, consulta laApp Mesh, archivio di esempi.