Cloud Service Mesh regionale
Con l'isolamento regionale, i client che si connettono a una regione specifica del control plane Cloud Service Mesh possono accedere solo alle risorse all'interno di quella regione. Allo stesso modo, le risorse API all'interno di una regione specifica possono fare riferimento solo ad altre risorse in quella regione.
Cloud Service Mesh regionale presenta le seguenti limitazioni:
- L'API Istio non è supportata. Non puoi utilizzare Kubernetes con l'API Istio utilizzando Traffic Director regionale. In questa anteprima sono supportate solo le API Google Cloud .
- Si applicano le considerazioni e limitazioni esistenti delle API di routing dei servizi globali.
- La versione minima di Envoy per supportare gli schemi di denominazione xdSTP è la v1.31.1.
- L'API Gateway for Mesh non è supportata.
- La versione minima di gRPC è la v1.65.
Sono supportate solo le seguenti regioni:
africa-south1 asia-east1 asia-east2 asia-northeast1 asia-northeast2 asia-northeast3 asia-south1 asia-south2 asia-southeast1 asia-southeast2 australia-southeast1 australia-southeast2 europe-central2 europe-north1 europe-north2 europe-southwest1 europe-west10 europe-west12 europe-west1 europe-west2 europe-west3 europe-west4 europe-west6 europe-west8 europe-west9 me-central1 me-central2 me-west1 northamerica-northeast1 northamerica-northeast2 northamerica-south1 southamerica-east1 southamerica-west1 us-central1 us-east1 us-east4 us-east5 us-south1 us-west1 us-west2 us-west3 us-west4
Prezzi
Ogni regione in cui è supportato Cloud Service Mesh regionale avrà uno SKU regionale quando questa funzionalità sarà disponibile a livello generale. Per ora, i prezzi sono gli stessi di quelli globali.
Prepara il client xDS per Cloud Service Mesh
Compute VM Envoy xDS
Manuale
I passaggi manuali si basano su
Configura le VM utilizzando il deployment manuale di Envoy.
La differenza principale è che ENVOY_CONTROL_PLANE_REGION viene impostato e inserito
nel bootstrap.
Crea il modello di istanza:
gcloud compute instance-templates create td-vm-templategcloud compute instance-templates create td-vm-template \ --scopes=https://www.googleapis.com/auth/cloud-platform \ --tags=http-td-tag,http-server,https-server \ --image-family=debian-11 \ --image-project=debian-cloud \ --metadata=startup-script='#! /usr/bin/env bash # Set variables export ENVOY_CONTROL_PLANE_REGION="us-central1" export ENVOY_USER="envoy" export ENVOY_USER_UID="1337" export ENVOY_USER_GID="1337" export ENVOY_USER_HOME="/opt/envoy" export ENVOY_CONFIG="${ENVOY_USER_HOME}/config.yaml" export ENVOY_PORT="15001" export ENVOY_ADMIN_PORT="15000" export ENVOY_TRACING_ENABLED="false" export ENVOY_XDS_SERVER_CERT="/etc/ssl/certs/ca-certificates.crt" export ENVOY_ACCESS_LOG="/dev/stdout" export ENVOY_NODE_ID="$(cat /proc/sys/kernel/random/uuid)~$(hostname -i)" export BOOTSTRAP_TEMPLATE="${ENVOY_USER_HOME}/bootstrap_template.yaml" export GCE_METADATA_SERVER="169.254.169.254/32" export INTERCEPTED_CIDRS="*" export GCP_PROJECT_NUMBER=PROJECT_NUMBER export VPC_NETWORK_NAME=mesh:sidecar-mesh export GCE_ZONE=$(curl -sS -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/zone | cut -d"/" -f4) # Create system user account for Envoy binary sudo groupadd ${ENVOY_USER} \ --gid=${ENVOY_USER_GID} \ --system sudo adduser ${ENVOY_USER} \ --uid=${ENVOY_USER_UID} \ --gid=${ENVOY_USER_GID} \ --home=${ENVOY_USER_HOME} \ --disabled-login \ --system # Download and extract the Cloud Service Mesh tar.gz file cd ${ENVOY_USER_HOME} sudo curl -sL https://storage.googleapis.com/traffic-director/traffic-director-xdsv3.tar.gz -o traffic-director-xdsv3.tar.gz sudo tar -xvzf traffic-director-xdsv3.tar.gz traffic-director-xdsv3/bootstrap_template.yaml \ -C bootstrap_template.yaml \ --strip-components 1 sudo tar -xvzf traffic-director-xdsv3.tar.gz traffic-director-xdsv3/iptables.sh \ -C iptables.sh \ --strip-components 1 sudo rm traffic-director-xdsv3.tar.gz # Generate Envoy bootstrap configuration cat "${BOOTSTRAP_TEMPLATE}" \ | sed -e "s|ENVOY_NODE_ID|${ENVOY_NODE_ID}|g" \ | sed -e "s|ENVOY_ZONE|${GCE_ZONE}|g" \ | sed -e "s|VPC_NETWORK_NAME|${VPC_NETWORK_NAME}|g" \ | sed -e "s|CONFIG_PROJECT_NUMBER|${GCP_PROJECT_NUMBER}|g" \ | sed -e "s|ENVOY_PORT|${ENVOY_PORT}|g" \ | sed -e "s|ENVOY_ADMIN_PORT|${ENVOY_ADMIN_PORT}|g" \ | sed -e "s|XDS_SERVER_CERT|${ENVOY_XDS_SERVER_CERT}|g" \ | sed -e "s|TRACING_ENABLED|${ENVOY_TRACING_ENABLED}|g" \ | sed -e "s|ACCESSLOG_PATH|${ENVOY_ACCESS_LOG}|g" \ | sed -e "s|BACKEND_INBOUND_PORTS|${BACKEND_INBOUND_PORTS}|g" \ | sed -e "s|trafficdirector.googleapis.com|trafficdirector.${ENVOY_CONTROL_PLANE_REGION}.rep.googleapis.com|g" \ | sudo tee "${ENVOY_CONFIG}" # Install Envoy binary wget -O envoy_key https://apt.envoyproxy.io/signing.key cat envoy_key | sudo gpg --dearmor > $(pwd)/envoy-keyring.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=$(pwd)/envoy-keyring.gpg] https://apt.envoyproxy.io bullseye main" | sudo tee /etc/apt/sources.list.d/envoy.list sudo apt-get update sudo apt-get install envoy # Run Envoy as systemd service sudo systemd-run --uid=${ENVOY_USER_UID} --gid=${ENVOY_USER_GID} \ --working-directory=${ENVOY_USER_HOME} --unit=envoy.service \ bash -c "/usr/bin/envoy --config-path ${ENVOY_CONFIG} | tee" # Configure iptables for traffic interception and redirection sudo ${ENVOY_USER_HOME}/iptables.sh \ -p "${ENVOY_PORT}" \ -u "${ENVOY_USER_UID}" \ -g "${ENVOY_USER_GID}" \ -m "REDIRECT" \ -i "${INTERCEPTED_CIDRS}" \ -x "${GCE_METADATA_SERVER}"
Compute VM gRPC xDS
Analogamente a Cloud Service Mesh globale, i client gRPC devono configurare un bootstrap per indicare come connettersi a Cloud Service Mesh regionale.
Puoi utilizzare il generatore di bootstrap gRPC
per generare questo bootstrap. Per impostarlo in modo che utilizzi Cloud Service Mesh regionale,
specifica un nuovo flag: --xds-server-region.
In questo esempio, l'impostazione di xds-server-region su us-central1 determina automaticamente
l'endpoint Cloud Service Mesh regionale:
trafficdirector.us-central1.rep.googleapis.com:443.
Inserimento manuale di Envoy in K8s
I passaggi manuali si basano su Configurazione dei pod di Google Kubernetes Engine utilizzando l'inserimento Envoy manuale. Tuttavia, devi modificare solo la sezione relativa all'inserimento manuale di pod.
Modifica il control plane da globale a regionale:
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 sed -i "s|trafficdirector.googleapis.com|trafficdirector.${REGION}.rep.googleapis.com|g" trafficdirector_client_new_api_sample_xdsv3.yaml sed -i "s|gcr.io/google-containers/busybox|busybox:stable|g" trafficdirector_client_new_api_sample_xdsv3.yamlApplica le modifiche:
kubectl apply -f trafficdirector_client_new_api_sample_xdsv3.yaml ```
Guide per la configurazione
La sezione tratta cinque modelli di configurazione e deployment indipendenti. Queste sono tutte versioni regionalizzate delle guide alla configurazione dell'API di routing dei servizi globale esistente.
- Configurazione dei servizi gRPC senza proxy con GRPCRoute regionale e Cloud Service Mesh regionale
- Configurazione della configurazione del proxy sidecar Envoy con servizi HTTP con HTTPRoute regionale e Cloud Service Mesh regionale
- Configurazione dei servizi TCP con TCPRoute regionale
- Routing TLS del gateway
- Configurazione di riferimenti tra progetti per Cloud Service Mesh regionale e Route regionale
Configura i servizi gRPC senza proxy con GRPCRoute regionale e Cloud Service Mesh regionale
Questa sezione spiega come configurare un mesh di servizi gRPC senza proxy con Cloud Service Mesh regionale e risorse GRPCRoute regionali.
Per comodità, memorizza il numero di progetto Google Cloud in cui esegui la configurazione, in modo che tutti gli esempi di questa guida possano essere copiati e incollati nella riga di comando:
export PROJECT="PROJECT_NUMBER"
export REGION="us-central1"
export ZONE="us-central1-a"
Sostituisci PROJECT_NUMBER con il numero del progetto.
In via facoltativa, puoi sostituire quanto segue:
- us-central1 con un'altra regione che vuoi utilizzare.
- us-central1-a con un'altra zona che vuoi utilizzare.
- default con un VPC_NAME diverso.
Configurazione mesh
Quando un'applicazione gRPC senza proxy si connette a un xds://hostname, la libreria client gRPC stabilisce una connessione a Cloud Service Mesh per ottenere la configurazione di routing necessaria per instradare le richieste per il nome host.
Crea una specifica Mesh e archiviala nel file mesh.yaml:
cat <<EOF > mesh.yaml name: grpc-mesh EOFCrea una mesh utilizzando la specifica mesh.yaml:
gcloud network-services meshes import grpc-mesh \ --source=mesh.yaml \ --location=${REGION}Una volta creata la mesh regionale, Cloud Service Mesh è pronto a gestire la configurazione. Tuttavia, poiché non sono ancora stati definiti servizi, la configurazione è vuota.
Configurazione del servizio gRPC
A scopo dimostrativo, creerai un servizio di backend regionale con VM scalate automaticamente (utilizzando gruppi di istanze gestite, MIG) che serviranno hello world utilizzando il protocollo gRPC sulla porta 50051.
Crea il modello di istanza VM di Compute Engine con un servizio gRPC
helloworldesposto sulla porta 50051:gcloud compute instance-templates create grpc-td-vm-template \ --scopes=https://www.googleapis.com/auth/cloud-platform \ --tags=allow-health-checks \ --image-family=debian-11 \ --image-project=debian-cloud \ --metadata-from-file=startup-script=<(echo '#! /bin/bash set -e cd /root sudo apt-get update -y sudo apt-get install -y openjdk-11-jdk-headless curl -L https://github.com/grpc/grpc-java/archive/v1.38.0.tar.gz | tar -xz cd grpc-java-1.38.0/examples/example-hostname ../gradlew --no-daemon installDist # Server listens on 50051 sudo systemd-run ./build/install/hostname-server/bin/hostname-server')Crea un MIG basato sul modello:
gcloud compute instance-groups managed create grpc-td-mig-us-central1 \ --zone=${ZONE} \ --size=2 \ --template=grpc-td-vm-templateConfigura una porta denominata per il servizio gRPC. Questa è la porta su cui il servizio gRPC è configurato per rimanere in ascolto delle richieste.
gcloud compute instance-groups set-named-ports grpc-td-mig-us-central1 \ --named-ports=grpc-helloworld-port:50051 \ --zone=${ZONE}In questo esempio, la porta è 50051.
Crea controlli di integrità gRPC.
gcloud compute health-checks create grpc grpc-helloworld-health-check \ --use-serving-port --region=${REGION}Affinché i controlli di integrità gRPC funzionino correttamente, i servizi devono implementare il protocollo di controllo di integrità gRPC. Per saperne di più, consulta la sezione Creazione di controlli di integrità.
Crea una regola firewall per consentire le connessioni di controllo di integrità in entrata alle istanze nella tua rete:
gcloud compute firewall-rules create grpc-vm-allow-health-checks \ --network default --action allow --direction INGRESS \ --source-ranges 35.191.0.0/16,209.85.152.0/22,209.85.204.0/22 \ --target-tags allow-health-checks \ --rules tcp:50051Crea un servizio di backend regionale con uno schema di bilanciamento del carico di
INTERNAL_SELF_MANAGEDe aggiungi il controllo di integrità e un gruppo di istanze gestite creato in precedenza al servizio di backend. La porta nel nome della porta specificato viene utilizzata per connettersi alle VM nel gruppo di istanze gestite.gcloud compute backend-services create grpc-helloworld-service \ --load-balancing-scheme=INTERNAL_SELF_MANAGED \ --protocol=GRPC \ --port-name=grpc-helloworld-port \ --health-checks="https://www.googleapis.com/compute/v1/projects/${PROJECT}/regions/${REGION}/healthChecks/grpc-helloworld-health-check" \ --region=${REGION}Aggiungi il gruppo di istanze gestite a
BackendService:gcloud compute backend-services add-backend grpc-helloworld-service \ --instance-group=grpc-td-mig-us-central1 \ --instance-group-zone=${ZONE} \ --region=${REGION}
Configura il routing con GRPCRoute regionale
A questo punto, la mesh regionale e il servizio server gRPC sono configurati. Ora puoi configurare il routing richiesto.
Crea la specifica GRPCRoute regionale e archiviala nel file grpc_route.yaml:
cat <<EOF > grpc_route.yaml name: helloworld-grpc-route hostnames: - helloworld-gce meshes: - projects/${PROJECT_NUMBER}/locations/${REGION}/meshes/grpc-mesh rules: - action: destinations: - serviceName: projects/${PROJECT_NUMBER}/locations/${REGION}/backendServices/grpc-helloworld-service EOFCrea GRPCRoute regionale utilizzando la specifica grpc_route.yaml:
gcloud network-services grpc-routes import helloworld-grpc-route \ --source=grpc_route.yaml \ --location=${REGION}Cloud Service Mesh è ora configurato per bilanciare il carico del traffico per i servizi specificati nella route gRPC tra i backend nel gruppo di istanze gestite.
Crea il servizio client gRPC
Per verificare la configurazione, crea un'istanza di un'applicazione client con un piano dati gRPC senza proxy. Questa applicazione deve specificare (nel file bootstrap) il nome della mesh.
Una volta configurata, questa applicazione può inviare una richiesta alle istanze o agli endpoint
associati a helloworld-gce utilizzando l'URI del servizio xds:///helloworld-gce.
Negli esempi seguenti, utilizza lo strumento grpcurl per testare il servizio gRPC.
Crea una VM client:
gcloud compute instances create grpc-client \ --zone=${ZONE}\ --scopes=https://www.googleapis.com/auth/cloud-platform \ --image-family=debian-11 \ --image-project=debian-cloud \ --metadata-from-file=startup-script=<(echo '#! /bin/bash set -ex export PROJECT=PROJECT_NUMBER export REGION=us-central1 export GRPC_XDS_BOOTSTRAP=/run/td-grpc-bootstrap.json echo export GRPC_XDS_BOOTSTRAP=$GRPC_XDS_BOOTSTRAP | sudo tee /etc/profile.d/grpc-xds-bootstrap.sh curl -L https://storage.googleapis.com/traffic-director/td-grpc-bootstrap-0.18.0.tar.gz | tar -xz ./td-grpc-bootstrap-0.18.0/td-grpc-bootstrap --config-mesh=grpc-mesh --xds-server-uri=trafficdirector.${REGION}.rep.googleapis.com:443 --gcp-project-number=${PROJECT} | sudo tee $GRPC_XDS_BOOTSTRAP sudo sed -i "s|\"authorities\": {|\"authorities\": {\n \"traffic-director.${REGION}.xds.googleapis.com\": {\"xds_servers\":[{\"server_uri\": \"trafficdirector.${REGION}.rep.googleapis.com:443\", \"channel_creds\": [ { \"type\": \"google_default\" } ], \"server_features\": [ \"xds_v3\", \"ignore_resource_deletion\" ]}], \"client_listener_resource_name_template\": \"xdstp://traffic-director.${REGION}.xds.googleapis.com/envoy.config.listener.v3.Listener/${PROJECT}/mesh:grpc-mesh/%s\"},|g" $GRPC_XDS_BOOTSTRAP sudo sed -i "s|\"client_default_listener_resource_name_template\": \"xdstp://traffic-director-global.xds.googleapis.com|\"client_default_listener_resource_name_template\": \"xdstp://traffic-director.${REGION}.xds.googleapis.com|g" $GRPC_XDS_BOOTSTRAP')
Configura la variabile di ambiente e il file di bootstrap
L'applicazione client ha bisogno di un file di configurazione di bootstrap. Lo script di avvio
nella sezione precedente imposta la variabile di ambiente GRPC_XDS_BOOTSTRAP e
utilizza uno script di supporto per generare il file di bootstrap. I valori di
TRAFFICDIRECTOR_GCP_PROJECT_NUMBER e della zona nel file di bootstrap generato
vengono ottenuti dal server dei metadati che conosce questi dettagli sulle tue
istanze VM di Compute Engine.
Puoi fornire questi valori allo script
helper manualmente utilizzando l'opzione -gcp-project-number. Devi fornire un nome mesh che corrisponda alla risorsa mesh utilizzando l'opzione -config-mesh-experimental.
Per verificare la configurazione, accedi al client:
gcloud compute ssh grpc-client --zone=${ZONE}Scarica e installa lo strumento
grpcurl:curl -L https://github.com/fullstorydev/grpcurl/releases/download/v1.9.3/grpcurl_1.9.3_linux_x86_64.tar.gz | tar -xzEsegui lo strumento
grpcurlconxds:///helloworld-gcecome URI del servizio ehelloworld.Greeter/SayHellocome nome del servizio e metodo da richiamare../grpcurl --plaintext \ -d '{"name": "world"}' \ xds:///helloworld-gce helloworld.Greeter/SayHelloI parametri del metodo SayHello vengono passati utilizzando l'opzione -d.
Dovresti visualizzare un output simile a questo, dove
INSTANCE_NAMEè il nome dell'istanza VM:Greeting: Hello world, from INSTANCE_HOSTNAME
In questo modo viene verificato che il client gRPC senza proxy si sia connesso correttamente a Cloud Service Mesh e abbia appreso i backend per il servizio helloworld-gce utilizzando il resolver di nomi xDS. Il client ha inviato una richiesta a uno dei backend del servizio senza dover conoscere l'indirizzo IP o eseguire la risoluzione DNS.
Configurazione della configurazione del proxy sidecar Envoy con servizi HTTP con HTTPRoute regionale e mesh regionale
Questa sezione spiega come configurare un mesh di servizi basato su proxy Envoy con risorse mesh regionali e HTTPRoute regionali.
Per comodità, memorizza il numero di progetto Google Cloud in cui esegui la configurazione, in modo che tutti gli esempi di questa guida possano essere copiati e incollati nella riga di comando:
export PROJECT_ID="PROJECT_ID"
export PROJECT="PROJECT_NUMBER"
export REGION="us-central1"
export ZONE="us-central1-a"
Sostituisci quanto segue
- PROJECT_ID con l'ID progetto.
- PROJECT_NUMBER con il numero del tuo progetto.
In via facoltativa, puoi sostituire quanto segue:
- us-central1 con un'altra regione che vuoi utilizzare.
- us-central1-a con un'altra zona che vuoi utilizzare.
Configurazione mesh
Il proxy sidecar Envoy riceve la configurazione di routing del servizio da Cloud Service Mesh. Il sidecar presenta il nome della risorsa mesh regionale per identificare ilmesh di servizih specifico configurato. La configurazione di routing ricevuta da Cloud Service Mesh viene utilizzata per indirizzare il traffico che passa attraverso il proxy sidecar a vari servizi di backend regionali a seconda dei parametri della richiesta, come l'hostname o le intestazioni, configurati nelle risorse Route.
Tieni presente che il nome del mesh è la chiave utilizzata dal proxy sidecar per richiedere la configurazione associata a questo mesh.
Crea la specifica della mesh regionale e archiviala nel file mesh.yaml:
cat <<EOF > mesh.yaml name: sidecar-mesh EOFSe non specificata, la porta di intercettazione è 15001.
Crea la mesh regionale utilizzando la specifica mesh.yaml:
gcloud network-services meshes import sidecar-mesh \ --source=mesh.yaml \ --location=${REGION}Una volta creata la mesh regionale, Cloud Service Mesh è pronto a gestire la configurazione. Tuttavia, poiché non sono ancora stati definiti servizi, la configurazione sarà vuota.
Configurazione del server HTTP
A scopo dimostrativo, creerai un servizio di backend regionale con VM con scalabilità automatica (utilizzando gruppi di istanze gestite, MIG) che servirà "Hello world" utilizzando il protocollo gRPC sulla porta 80.
Crea il modello di istanza VM di Compute Engine con un servizio HTTP
helloworldesposto sulla porta 80:gcloud compute instance-templates create td-httpd-vm-template \ --scopes=https://www.googleapis.com/auth/cloud-platform \ --tags=http-td-server \ --image-family=debian-11 \ --image-project=debian-cloud \ --metadata=startup-script="#! /bin/bash sudo apt-get update -y sudo apt-get install apache2 -y sudo service apache2 restart echo '<!doctype html><html><body><h1>'\`/bin/hostname\`'</h1></body></html>' | sudo tee /var/www/html/index.html"Crea un MIG basato sul modello:
gcloud compute instance-groups managed create http-td-mig-us-central1 \ --zone=${ZONE} \ --size=2 \ --template=td-httpd-vm-templateCrea i controlli di integrità:
gcloud compute health-checks create http http-helloworld-health-check --region=${REGION}Crea una regola firewall per consentire le connessioni di controllo di integrità in entrata alle istanze nella tua rete:
gcloud compute firewall-rules create http-vm-allow-health-checks \ --network default --action allow --direction INGRESS \ --source-ranges 35.191.0.0/16,209.85.152.0/22,209.85.204.0/22 \ --target-tags http-td-server \ --rules tcp:80Crea un servizio di backend regionale con uno schema di bilanciamento del carico di
INTERNAL_SELF_MANAGED:gcloud compute backend-services create http-helloworld-service \ --load-balancing-scheme=INTERNAL_SELF_MANAGED \ --protocol=HTTP \ --health-checks="https://www.googleapis.com/compute/v1/projects/${PROJECT}/regions/${REGION}/healthChecks/http-helloworld-health-check" \ --region=${REGION}Aggiungi il controllo di integrità e un gruppo di istanze gestito o non gestito al servizio di backend:
gcloud compute backend-services add-backend http-helloworld-service \ --instance-group=http-td-mig-us-central1 \ --instance-group-zone=${ZONE} \ --region=${REGION}Questo esempio utilizza il gruppo di istanze gestite con il modello di VM Compute Engine che esegue il servizio HTTP di esempio creato in precedenza.
Configurazione del routing con HTTPRoute regionale
La risorsa mesh e il server HTTP sono configurati. Ora puoi collegarli utilizzando una risorsa HTTPRoute che associa un nome host a un servizio di backend.
Crea la specifica HTTPRoute e archiviala come http_route.yaml:
cat <<EOF > http_route.yaml name: helloworld-http-route hostnames: - helloworld-gce meshes: - projects/${PROJECT_NUMBER}/locations/${REGION}/meshes/sidecar-mesh rules: - action: destinations: - serviceName: projects/${PROJECT_NUMBER}/locations/${REGION}/backendServices/http-helloworld-service EOFCrea HTTPRoute utilizzando la specifica http_route.yaml:
gcloud network-services http-routes import helloworld-http-route \ --source=http_route.yaml \ --location=${REGION}Cloud Service Mesh è ora configurato per bilanciare il carico del traffico per i servizi specificati in HTTPRoute nei backend del gruppo di istanze gestite.
Crea un client HTTP con un proxy sidecar Envoy
In questa sezione istanzi una VM client con il proxy sidecar Envoy per richiedere
la configurazione di Cloud Service Mesh creata in precedenza. Tieni presente che il parametro mesh
nel comando Google Cloud CLI fa riferimento alla risorsa mesh creata in precedenza.
gcloud compute instance-templates create td-vm-template \
--scopes=https://www.googleapis.com/auth/cloud-platform \
--tags=http-td-tag,http-server,https-server \
--image-family=debian-11 \
--image-project=debian-cloud \
--metadata=startup-script='#! /usr/bin/env bash
# Set variables
export ENVOY_CONTROL_PLANE_REGION="us-central1"
export ENVOY_USER="envoy"
export ENVOY_USER_UID="1337"
export ENVOY_USER_GID="1337"
export ENVOY_USER_HOME="/opt/envoy"
export ENVOY_CONFIG="${ENVOY_USER_HOME}/config.yaml"
export ENVOY_PORT="15001"
export ENVOY_ADMIN_PORT="15000"
export ENVOY_TRACING_ENABLED="false"
export ENVOY_XDS_SERVER_CERT="/etc/ssl/certs/ca-certificates.crt"
export ENVOY_ACCESS_LOG="/dev/stdout"
export ENVOY_NODE_ID="$(cat /proc/sys/kernel/random/uuid)~$(hostname -i)"
export BOOTSTRAP_TEMPLATE="${ENVOY_USER_HOME}/bootstrap_template.yaml"
export GCE_METADATA_SERVER="169.254.169.254/32"
export INTERCEPTED_CIDRS="*"
export GCP_PROJECT_NUMBER=PROJECT_NUMBER
export VPC_NETWORK_NAME=mesh:sidecar-mesh
export GCE_ZONE=$(curl -sS -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/zone | cut -d"/" -f4)
# Create system user account for Envoy binary
sudo groupadd ${ENVOY_USER} \
--gid=${ENVOY_USER_GID} \
--system
sudo adduser ${ENVOY_USER} \
--uid=${ENVOY_USER_UID} \
--gid=${ENVOY_USER_GID} \
--home=${ENVOY_USER_HOME} \
--disabled-login \
--system
# Download and extract the Cloud Service Mesh tar.gz file
cd ${ENVOY_USER_HOME}
sudo curl -sL https://storage.googleapis.com/traffic-director/traffic-director-xdsv3.tar.gz -o traffic-director-xdsv3.tar.gz
sudo tar -xvzf traffic-director-xdsv3.tar.gz traffic-director-xdsv3/bootstrap_template.yaml \
-C bootstrap_template.yaml \
--strip-components 1
sudo tar -xvzf traffic-director-xdsv3.tar.gz traffic-director-xdsv3/iptables.sh \
-C iptables.sh \
--strip-components 1
sudo rm traffic-director-xdsv3.tar.gz
# Generate Envoy bootstrap configuration
cat "${BOOTSTRAP_TEMPLATE}" \
| sed -e "s|ENVOY_NODE_ID|${ENVOY_NODE_ID}|g" \
| sed -e "s|ENVOY_ZONE|${GCE_ZONE}|g" \
| sed -e "s|VPC_NETWORK_NAME|${VPC_NETWORK_NAME}|g" \
| sed -e "s|CONFIG_PROJECT_NUMBER|${GCP_PROJECT_NUMBER}|g" \
| sed -e "s|ENVOY_PORT|${ENVOY_PORT}|g" \
| sed -e "s|ENVOY_ADMIN_PORT|${ENVOY_ADMIN_PORT}|g" \
| sed -e "s|XDS_SERVER_CERT|${ENVOY_XDS_SERVER_CERT}|g" \
| sed -e "s|TRACING_ENABLED|${ENVOY_TRACING_ENABLED}|g" \
| sed -e "s|ACCESSLOG_PATH|${ENVOY_ACCESS_LOG}|g" \
| sed -e "s|BACKEND_INBOUND_PORTS|${BACKEND_INBOUND_PORTS}|g" \
| sed -e "s|trafficdirector.googleapis.com|trafficdirector.${ENVOY_CONTROL_PLANE_REGION}.rep.googleapis.com|g" \
| sudo tee "${ENVOY_CONFIG}"
# Install Envoy binary
wget -O envoy_key https://apt.envoyproxy.io/signing.key
cat envoy_key | sudo gpg --dearmor > $(pwd)/envoy-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=$(pwd)/envoy-keyring.gpg] https://apt.envoyproxy.io bullseye main" | sudo tee /etc/apt/sources.list.d/envoy.list
sudo apt-get update
sudo apt-get install envoy
# Run Envoy as systemd service
sudo systemd-run --uid=${ENVOY_USER_UID} --gid=${ENVOY_USER_GID} \
--working-directory=${ENVOY_USER_HOME} --unit=envoy.service \
bash -c "/usr/bin/envoy --config-path ${ENVOY_CONFIG} | tee"
# Configure iptables for traffic interception and redirection
sudo ${ENVOY_USER_HOME}/iptables.sh \
-p "${ENVOY_PORT}" \
-u "${ENVOY_USER_UID}" \
-g "${ENVOY_USER_GID}" \
-m "REDIRECT" \
-i "${INTERCEPTED_CIDRS}" \
-x "${GCE_METADATA_SERVER}"
'
gcloud compute instances create td-vm-client \
--zone=${ZONE} \
--source-instance-template td-vm-template
Accedi alla VM creata:
gcloud compute ssh td-vm-client --zone=${ZONE}Verifica la connettività HTTP ai servizi di test creati:
curl -H "Host: helloworld-gce" http://10.0.0.1/Il comando restituisce una risposta da una delle VM nel gruppo di istanze gestite con il relativo nome host stampato nella console.
Configurazione dei servizi TCP con TCPRoute regionale
Questo flusso di configurazione è molto simile a Configura i proxy Envoy con i servizi HTTP con l'eccezione che il servizio di backend fornisce un servizio TCP e il routing basato sui parametri TCP/IP viene utilizzato anziché sul protocollo HTTP.
Per comodità, memorizza il numero di progetto Google Cloud in cui esegui la configurazione, in modo che tutti gli esempi di questa guida possano essere copiati e incollati nella riga di comando:
export PROJECT_ID="PROJECT_ID"
export PROJECT="PROJECT_NUMBER"
export REGION="us-central1"
export ZONE="us-central1-a"
Sostituisci quanto segue
- PROJECT_ID con l'ID progetto.
- PROJECT_NUMBER con il numero del tuo progetto.
In via facoltativa, puoi sostituire quanto segue:
- us-central1 con un'altra regione che vuoi utilizzare.
- us-central1-a con un'altra zona che vuoi utilizzare.
Configurazione mesh
Crea la specifica della mesh regionale e archiviala nel file mesh.yaml:
cat <<EOF > mesh.yaml name: sidecar-mesh EOFCrea la mesh regionale utilizzando la specifica mesh.yaml:
gcloud network-services meshes import sidecar-mesh \ --source=mesh.yaml \ --location=${REGION}
Configurazione del server TCP
A scopo dimostrativo, creerai un servizio di backend regionale con VM scalate automaticamente (utilizzando gruppi di istanze gestite, MIG) che servirà "hello world" utilizzando il protocollo gRPC sulla porta 10000.
Crea il modello di istanza VM di Compute Engine con un servizio di test sulla porta 10000 utilizzando l'utilità netcat:
gcloud compute instance-templates create tcp-td-vm-template \ --scopes=https://www.googleapis.com/auth/cloud-platform \ --tags=allow-health-checks \ --image-family=debian-11 \ --image-project=debian-cloud \ --metadata=startup-script="#! /bin/bash sudo apt-get update -y sudo apt-get install netcat -y while true; do echo 'Hello from TCP service' | nc -l -s 0.0.0.0 -p 10000; done &"Crea un MIG basato sul modello:
gcloud compute instance-groups managed create tcp-td-mig-us-central1 \ --zone=${ZONE} \ --size=1 \ --template=tcp-td-vm-templateImposta le porte denominate sul gruppo di istanze gestite creato su
port 10000:gcloud compute instance-groups set-named-ports tcp-td-mig-us-central1 \ --zone=${ZONE} --named-ports=tcp:10000Crea un controllo di integrità a livello di regione:
gcloud compute health-checks create tcp tcp-helloworld-health-check --port 10000 --region=${REGION}Crea una regola firewall per consentire le connessioni di controllo di integrità in entrata alle istanze nella tua rete:
gcloud compute firewall-rules create tcp-vm-allow-health-checks \ --network default --action allow --direction INGRESS \ --source-ranges 35.191.0.0/16,209.85.152.0/22,209.85.204.0/22 \ --target-tags allow-health-checks \ --rules tcp:10000Crea un servizio di backend regionale con uno schema di bilanciamento del carico di INTERNAL_SELF_MANAGED e aggiungi il controllo di integrità e un gruppo di istanze gestite o non gestite al servizio di backend.
gcloud compute backend-services create tcp-helloworld-service \ --region=${REGION} \ --load-balancing-scheme=INTERNAL_SELF_MANAGED \ --protocol=TCP \ --port-name=tcp \ --health-checks="https://www.googleapis.com/compute/v1/projects/${PROJECT}/regions/${REGION}/healthChecks/tcp-helloworld-health-check"Aggiungi il MIG a BackendService:
gcloud compute backend-services add-backend tcp-helloworld-service \ --instance-group tcp-td-mig-us-central1 \ --instance-group-zone=${ZONE} \ --region=${REGION}
Configura il routing con TCPRoute regionale
Crea la specifica TCPRoute e archiviala nel file tcp_route.yaml:
cat <<EOF > tcp_route.yaml name: helloworld-tcp-route meshes: - projects/$PROJECT_NUMBER/locations/$REGION/meshes/sidecar-mesh rules: - action: destinations: - serviceName: projects/$PROJECT_NUMBER/locations/$REGION/backendServices/tcp-helloworld-service matches: - address: '10.0.0.1/32' port: '10000' EOFCrea TCPRoute utilizzando la specifica tcp_route.yaml:
gcloud network-services tcp-routes import helloworld-tcp-route \ --source=tcp_route.yaml \ --location=${REGION}
Crea un client TCP con un proxy sidecar Envoy
Crea una VM con Envoy connesso a Cloud Service Mesh:
gcloud compute instance-templates create td-vm-template \ --scopes=https://www.googleapis.com/auth/cloud-platform \ --tags=http-td-tag,http-server,https-server \ --image-family=debian-11 \ --image-project=debian-cloud \ --metadata=startup-script='#! /usr/bin/env bash # Set variables export ENVOY_CONTROL_PLANE_REGION="us-central1" export ENVOY_USER="envoy" export ENVOY_USER_UID="1337" export ENVOY_USER_GID="1337" export ENVOY_USER_HOME="/opt/envoy" export ENVOY_CONFIG="${ENVOY_USER_HOME}/config.yaml" export ENVOY_PORT="15001" export ENVOY_ADMIN_PORT="15000" export ENVOY_TRACING_ENABLED="false" export ENVOY_XDS_SERVER_CERT="/etc/ssl/certs/ca-certificates.crt" export ENVOY_ACCESS_LOG="/dev/stdout" export ENVOY_NODE_ID="$(cat /proc/sys/kernel/random/uuid)~$(hostname -i)" export BOOTSTRAP_TEMPLATE="${ENVOY_USER_HOME}/bootstrap_template.yaml" export GCE_METADATA_SERVER="169.254.169.254/32" export INTERCEPTED_CIDRS="*" export GCP_PROJECT_NUMBER=PROJECT_NUMBER export VPC_NETWORK_NAME=mesh:sidecar-mesh export GCE_ZONE=$(curl -sS -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/zone | cut -d"/" -f4) # Create system user account for Envoy binary sudo groupadd ${ENVOY_USER} \ --gid=${ENVOY_USER_GID} \ --system sudo adduser ${ENVOY_USER} \ --uid=${ENVOY_USER_UID} \ --gid=${ENVOY_USER_GID} \ --home=${ENVOY_USER_HOME} \ --disabled-login \ --system # Download and extract the Cloud Service Mesh tar.gz file cd ${ENVOY_USER_HOME} sudo curl -sL https://storage.googleapis.com/traffic-director/traffic-director-xdsv3.tar.gz -o traffic-director-xdsv3.tar.gz sudo tar -xvzf traffic-director-xdsv3.tar.gz traffic-director-xdsv3/bootstrap_template.yaml \ -C bootstrap_template.yaml \ --strip-components 1 sudo tar -xvzf traffic-director-xdsv3.tar.gz traffic-director-xdsv3/iptables.sh \ -C iptables.sh \ --strip-components 1 sudo rm traffic-director-xdsv3.tar.gz # Generate Envoy bootstrap configuration cat "${BOOTSTRAP_TEMPLATE}" \ | sed -e "s|ENVOY_NODE_ID|${ENVOY_NODE_ID}|g" \ | sed -e "s|ENVOY_ZONE|${GCE_ZONE}|g" \ | sed -e "s|VPC_NETWORK_NAME|${VPC_NETWORK_NAME}|g" \ | sed -e "s|CONFIG_PROJECT_NUMBER|${GCP_PROJECT_NUMBER}|g" \ | sed -e "s|ENVOY_PORT|${ENVOY_PORT}|g" \ | sed -e "s|ENVOY_ADMIN_PORT|${ENVOY_ADMIN_PORT}|g" \ | sed -e "s|XDS_SERVER_CERT|${ENVOY_XDS_SERVER_CERT}|g" \ | sed -e "s|TRACING_ENABLED|${ENVOY_TRACING_ENABLED}|g" \ | sed -e "s|ACCESSLOG_PATH|${ENVOY_ACCESS_LOG}|g" \ | sed -e "s|BACKEND_INBOUND_PORTS|${BACKEND_INBOUND_PORTS}|g" \ | sed -e "s|trafficdirector.googleapis.com|trafficdirector.${ENVOY_CONTROL_PLANE_REGION}.rep.googleapis.com|g" \ | sudo tee "${ENVOY_CONFIG}" # Install Envoy binary wget -O envoy_key https://apt.envoyproxy.io/signing.key cat envoy_key | sudo gpg --dearmor > $(pwd)/envoy-keyring.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=$(pwd)/envoy-keyring.gpg] https://apt.envoyproxy.io bullseye main" | sudo tee /etc/apt/sources.list.d/envoy.list sudo apt-get update sudo apt-get install envoy # Run Envoy as systemd service sudo systemd-run --uid=${ENVOY_USER_UID} --gid=${ENVOY_USER_GID} \ --working-directory=${ENVOY_USER_HOME} --unit=envoy.service \ bash -c "/usr/bin/envoy --config-path ${ENVOY_CONFIG} | tee" # Configure iptables for traffic interception and redirection sudo ${ENVOY_USER_HOME}/iptables.sh \ -p "${ENVOY_PORT}" \ -u "${ENVOY_USER_UID}" \ -g "${ENVOY_USER_GID}" \ -m "REDIRECT" \ -i "${INTERCEPTED_CIDRS}" \ -x "${GCE_METADATA_SERVER}" ' gcloud compute instances create td-vm-client \ --zone=${ZONE} \ --source-instance-template td-vm-templateAccedi alla VM creata:
gcloud compute ssh td-vm-client --zone=${ZONE}Verifica la connettività ai servizi di test creati:
curl 10.0.0.1:10000 --http0.9 -vDovresti vedere il testo
Hello from TCP servicerestituito, nonché qualsiasi testo digitato restituito dal servizio netcat in esecuzione sulla VM remota.
Configurazione del mesh regionale nel progetto host
Designa un progetto come progetto host. Qualsiasi account di servizio con l'autorizzazione a creare/aggiornare/eliminare mesh in questo progetto può controllare le configurazioni di routing associate alle mesh regionali in questo progetto.
Definisci una variabile che verrà utilizzata in tutto l'esempio:
export REGION="us-central1"Se vuoi, puoi sostituire us-central1 con un'altra regione che vuoi utilizzare.
Crea la specifica della mesh e archiviala nel file mesh.yaml:
cat <<EOF > mesh.yaml name: shared-mesh EOFDefinisci una risorsa mesh in questo progetto con la configurazione richiesta:
gcloud network-services meshes import shared-mesh \ --source=mesh.yaml \ --location=${REGION}Prendi nota dell'URI completo di questa risorsa mesh. I proprietari dei servizi ne avranno bisogno in futuro per collegare le proprie route a questo mesh.
Concedi l'autorizzazione IAM
networkservices.meshes.usea questo mesh e ai service account tra progetti che devono essere in grado di collegare le informazioni sui servizi a questo mesh:gcloud projects add-iam-policy-binding HOST_PROJECT_NUMBER --member='HTTP_ROUTE_SERVICE_OWNER_ACCOUNT' --role='roles/compute.networkAdmin'Ora tutti i proprietari dei servizi a cui è stata concessa l'autorizzazione
networkservices.meshes.usepossono aggiungere le proprie regole di routing a questo mesh.
Configurazione delle route nei service project
Ogni proprietario del servizio deve creare servizi di backend regionali e risorse di route regionali nel proprio progetto in modo simile a Configura i proxy Envoy con i servizi HTTP.
L'unica differenza è che ogni HTTPRoute/GRPCRoute/TCPRoute avrebbe l'URI
della risorsa mesh del progetto host nel campo meshes.
Crea una route HTTP sharedvpc:
echo "name: sharedvpc-http-route hostnames: - helloworld-gce meshes: - /projects/HOST_PROJECT_NUMBER/locations/${REGION}/meshes/shared-mesh rules: - action: destinations: - serviceName: \"SERVICE_URL\"" | \ gcloud network-services http-routes import sharedvpc-http-route \ --source=- \ --location=${REGION}
Configurazione dei servizi client nei service project
Durante la configurazione di un client Cloud Service Mesh (proxy Envoy o senza proxy) che si trova in un progetto di servizio, è necessario specificare il numero di progetto in cui si trova la risorsa mesh e il nome della mesh nella configurazione di bootstrap:
TRAFFICDIRECTOR_GCP_PROJECT_NUMBER=HOST_PROJECT_NUMBER
TRAFFICDIRECTOR_MESH_NAME=MESH_NAME
Routing TLS del gateway
Questa sezione mostra come configurare un gateway in entrata basato su proxy Envoy con risorse Gateway regionali e TLSRoute regionali.
Un bilanciatore del carico di rete passthrough esterno regionale indirizza il traffico ai proxy Envoy che fungono da gateway in entrata. I proxy Envoy utilizzano l'instradamento TLS passthrough e indirizzano il traffico ai server HTTPS in esecuzione sulle istanze VM di backend.
Definisci alcune variabili che verranno utilizzate nell'esempio.
export PROJECT_ID="PROJECT_ID"
export PROJECT_NUMBER="PROJECT_NUMBER"
export REGION="us-central1"
export ZONE="us-central1-b"
export NETWORK_NAME = "default"
Sostituisci quanto segue: default
- PROJECT_ID con l'ID progetto.
- PROJECT_NUMBER con il numero del tuo progetto.
In via facoltativa, puoi sostituire quanto segue:
- us-central1 con un'altra regione che vuoi utilizzare.
- us-central1-b con un'altra zona che vuoi utilizzare.
- default con un nome di rete diverso che vuoi utilizzare.
Riferimento incrociato alle risorse di mesh regionale e route regionale in un ambiente VPC condiviso multiprogetto
Esistono scenari in cui la configurazione mesh di servizi è costituita da servizi di proprietà di progetti diversi. Ad esempio, nelle implementazioni di VPC condiviso o VPC con peering è possibile che ogni proprietario del progetto definisca il proprio insieme di servizi con lo scopo di renderli disponibili a tutti gli altri progetti.
Questa configurazione è "cross-project" perché più risorse definite in progetti diversi vengono combinate per formare una singola configurazione che può essere fornita a un proxy o a un client senza proxy.
Configura le regole firewall
Configura le regole del firewall per consentire il traffico da qualsiasi origine. Modifica i comandi per le porte e gli intervalli di indirizzi IP di origine.
gcloud compute firewall-rules create allow-gateway-health-checks \ --network=${NETWORK_NAME} \ --direction=INGRESS \ --action=ALLOW \ --rules=tcp \ --source-ranges="35.191.0.0/16,209.85.152.0/22,209.85.204.0/22" \ --target-tags=gateway-proxy
Configurare le autorizzazioni IAM
Crea un'identità del account di servizio per i proxy gateway:
gcloud iam service-accounts create gateway-proxyAssegna i ruoli IAM richiesti all'identità del account di servizio:
gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member="serviceAccount:gateway-proxy@${PROJECT_ID}.iam.gserviceaccount.com" \ --role="roles/trafficdirector.client"gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member="serviceAccount:gateway-proxy@${PROJECT_ID}.iam.gserviceaccount.com" \ --role="roles/logging.logWriter"
Configura il gateway regionale:
In un file denominato gateway8443.yaml, crea la specifica del gateway per il traffico HTTP:
cat <<EOF > gateway8443.yaml name: gateway8443 scope: gateway-proxy-8443 ports: - 8443 type: OPEN_MESH EOFCrea la risorsa Gateway regionale utilizzando la specifica gateway8443.yaml:
gcloud network-services gateways import gateway8443 \ --source=gateway8443.yaml \ --location=${REGION}
Creazione di un gruppo di istanze gestite con proxy Envoy
In questa sezione crei un modello di istanza per una VM che esegue un
proxy di servizio Envoy di cui è stato eseguito il deployment automatico. L'ambito degli inviati è impostato su
gateway-proxy. Non trasmettere la porta di pubblicazione come parametro del
flag --service-proxy.
Crea un gruppo di istanze gestite con proxy Envoy:
gcloud beta compute instance-templates create gateway-proxy \ --scopes=https://www.googleapis.com/auth/cloud-platform \ --tags=gateway-proxy,http-td-tag,http-server,https-server \ --image-family=debian-11 \ --image-project=debian-cloud \ --network-interface=network=${NETWORK_NAME} \ --service-account="gateway-proxy@${PROJECT_ID}.iam.gserviceaccount.com" \ --metadata=startup-script='#! /usr/bin/env bash # Set variables export ENVOY_CONTROL_PLANE_REGION="us-central1" export GCP_PROJECT_NUMBER=PROJECT_NUMBER export VPC_NETWORK_NAME=scope:gateway-proxy-8443 export ENVOY_USER="envoy" export ENVOY_USER_UID="1337" export ENVOY_USER_GID="1337" export ENVOY_USER_HOME="/opt/envoy" export ENVOY_CONFIG="${ENVOY_USER_HOME}/config.yaml" export ENVOY_PORT="15001" export ENVOY_ADMIN_PORT="15000" export ENVOY_TRACING_ENABLED="false" export ENVOY_XDS_SERVER_CERT="/etc/ssl/certs/ca-certificates.crt" export ENVOY_ACCESS_LOG="/dev/stdout" export ENVOY_NODE_ID="$(cat /proc/sys/kernel/random/uuid)~$(hostname -i)" export BOOTSTRAP_TEMPLATE="${ENVOY_USER_HOME}/bootstrap_template.yaml" export GCE_METADATA_SERVER="169.254.169.254/32" export INTERCEPTED_CIDRS="*" export GCE_ZONE=$(curl -sS -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/zone | cut -d"/" -f4) # Create system user account for Envoy binary sudo groupadd ${ENVOY_USER} \ --gid=${ENVOY_USER_GID} \ --system sudo adduser ${ENVOY_USER} \ --uid=${ENVOY_USER_UID} \ --gid=${ENVOY_USER_GID} \ --home=${ENVOY_USER_HOME} \ --disabled-login \ --system # Download and extract the Cloud Service Mesh tar.gz file cd ${ENVOY_USER_HOME} sudo curl -sL https://storage.googleapis.com/traffic-director/traffic-director-xdsv3.tar.gz -o traffic-director-xdsv3.tar.gz sudo tar -xvzf traffic-director-xdsv3.tar.gz traffic-director-xdsv3/bootstrap_template.yaml \ -C bootstrap_template.yaml \ --strip-components 1 sudo tar -xvzf traffic-director-xdsv3.tar.gz traffic-director-xdsv3/iptables.sh \ -C iptables.sh \ --strip-components 1 sudo rm traffic-director-xdsv3.tar.gz # Generate Envoy bootstrap configuration cat "${BOOTSTRAP_TEMPLATE}" \ | sed -e "s|ENVOY_NODE_ID|${ENVOY_NODE_ID}|g" \ | sed -e "s|ENVOY_ZONE|${GCE_ZONE}|g" \ | sed -e "s|VPC_NETWORK_NAME|${VPC_NETWORK_NAME}|g" \ | sed -e "s|CONFIG_PROJECT_NUMBER|${GCP_PROJECT_NUMBER}|g" \ | sed -e "s|ENVOY_PORT|${ENVOY_PORT}|g" \ | sed -e "s|ENVOY_ADMIN_PORT|${ENVOY_ADMIN_PORT}|g" \ | sed -e "s|XDS_SERVER_CERT|${ENVOY_XDS_SERVER_CERT}|g" \ | sed -e "s|TRACING_ENABLED|${ENVOY_TRACING_ENABLED}|g" \ | sed -e "s|ACCESSLOG_PATH|${ENVOY_ACCESS_LOG}|g" \ | sed -e "s|BACKEND_INBOUND_PORTS|${BACKEND_INBOUND_PORTS}|g" \ | sed -e "s|trafficdirector.googleapis.com|trafficdirector.${ENVOY_CONTROL_PLANE_REGION}.rep.googleapis.com|g" \ | sudo tee "${ENVOY_CONFIG}" # Install Envoy binary wget -O envoy_key https://apt.envoyproxy.io/signing.key cat envoy_key | sudo gpg --dearmor > $(pwd)/envoy-keyring.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=$(pwd)/envoy-keyring.gpg] https://apt.envoyproxy.io bullseye main" | sudo tee /etc/apt/sources.list.d/envoy.list sudo apt-get update sudo apt-get install envoy # Run Envoy as systemd service sudo systemd-run --uid=${ENVOY_USER_UID} --gid=${ENVOY_USER_GID} \ --working-directory=${ENVOY_USER_HOME} --unit=envoy.service \ bash -c "/usr/bin/envoy --config-path ${ENVOY_CONFIG} | tee" # Configure iptables for traffic interception and redirection sudo ${ENVOY_USER_HOME}/iptables.sh \ -p "${ENVOY_PORT}" \ -u "${ENVOY_USER_UID}" \ -g "${ENVOY_USER_GID}" \ -m "REDIRECT" \ -i "${INTERCEPTED_CIDRS}" \ -x "${GCE_METADATA_SERVER}" 'Crea un gruppo di istanze gestite a livello di regione dal modello di istanza:
gcloud compute instance-groups managed create gateway-proxy \ --region=${REGION} \ --size=1 \ --template=gateway-proxyImposta il nome della porta di pubblicazione per il gruppo di istanze gestite:
gcloud compute instance-groups managed set-named-ports gateway-proxy \ --named-ports=https:8443 \ --region=${REGION}
Configura il bilanciatore del carico di rete passthrough esterno regionale
Crea un indirizzo IP esterno regionale statico:
gcloud compute addresses create xnlb-${REGION} \ --region=${REGION}Ottieni l'indirizzo IP riservato al bilanciatore del carico esterno:
gcloud compute addresses describe xnlb-${REGION} \ --region=${REGION} --format='value(address)'Crea un controllo di integrità per i proxy gateway:
gcloud compute health-checks create tcp xnlb-${REGION} \ --region=${REGION} \ --use-serving-portCrea un servizio di backend per i proxy del gateway:
gcloud compute backend-services create xnlb-${REGION} \ --health-checks=xnlb-${REGION} \ --health-checks-region=${REGION} \ --load-balancing-scheme=EXTERNAL \ --protocol=TCP \ --region=${REGION} \ --port-name=httpsAggiungi il gruppo di istanze gestite come backend:
gcloud compute backend-services add-backend xnlb-${REGION} \ --instance-group=gateway-proxy \ --instance-group-region=${REGION} \ --region=${REGION}Crea una regola di forwarding per instradare il traffico ai proxy gateway:
gcloud compute forwarding-rules create xnlb-${REGION} \ --region=${REGION} \ --load-balancing-scheme=EXTERNAL \ --address=${IP_ADDRESS} \ --ip-protocol=TCP \ --ports=8443 \ --backend-service=xnlb-${REGION} \ --backend-service-region=${REGION}
Configura un gruppo di istanze gestite che esegue un servizio HTTPS
Crea un modello di istanza con un servizio HTTPS esposto sulla porta 8443:
gcloud compute instance-templates create td-https-vm-template \ --scopes=https://www.googleapis.com/auth/cloud-platform \ --tags=https-td-server \ --image-family=debian-11 \ --image-project=debian-cloud \ --metadata=startup-script='#! /bin/bash sudo rm -rf /var/lib/apt/lists/* sudo apt-get -y clean sudo apt-get -y update sudo apt-get -y install apt-transport-https ca-certificates curl gnupg2 software-properties-common sudo curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - sudo add-apt-repository -y "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable" sudo apt-get -y update sudo apt-get -y install docker-ce sudo which docker echo "{ \"registry-mirrors\": [\"https://mirror.gcr.io\"] }" | sudo tee -a /etc/docker/daemon.json sudo service docker restart sudo docker run -e HTTPS_PORT=9999 -p 8443:9999 --rm -dt mendhak/http-https-echo:22'Crea un gruppo di istanze gestite basato sul modello di istanza:
gcloud compute instance-groups managed create https-td-mig-us-${REGION} \ --zone=${ZONE} \ --size=2 \ --template=td-https-vm-templateImposta il nome della porta di pubblicazione per il gruppo di istanze gestite:
gcloud compute instance-groups managed set-named-ports https-td-mig-us-${REGION} \ --named-ports=https:8443 \ --zone=${ZONE}Crea un controllo di integrità:
gcloud compute health-checks create https https-helloworld-health-check \ --port=8443 --region=${REGION}Crea una regola firewall per consentire le connessioni di controllo di integrità in entrata alle istanze nella tua rete:
gcloud compute firewall-rules create https-vm-allow-health-checks \ --network ${NETWORK_NAME} --action allow --direction INGRESS \ --source-ranges 35.191.0.0/16,130.211.0.0/22 \ --target-tags https-td-server \ --rules tcp:8443Crea un servizio di backend regionale con uno schema di bilanciamento del carico di
INTERNAL_SELF_MANAGEDe aggiungi il controllo di integrità:gcloud compute backend-services create https-helloworld-service \ --region=${REGION} \ --load-balancing-scheme=INTERNAL_SELF_MANAGED \ --port-name=https \ --health-checks="https://www.googleapis.com/compute/v1/projects/${PROJECT}/regions/${REGION}/healthChecks/https-helloworld-health-check"Aggiungi il gruppo di istanze gestite come backend al servizio di backend:
gcloud compute backend-services add-backend https-helloworld-service \ --instance-group=https-td-mig-us-${REGION} \ --instance-group-zone=${ZONE} \ --region=${REGION}
Configura il routing con una risorsa TLSRoute
In un file denominato tls_route.yaml, crea la specifica TLSRoute:
cat <<EOF > tls_route.yaml name: helloworld-tls-route gateways: - projects/${PROJECT_NUMBER}/locations/${REGION}/gateways/gateway8443 rules: - matches: - sniHost: - example.com alpn: - h2 action: destinations: - serviceName: projects/${PROJECT_NUMBER}/locations/${REGION}/backendServices/https-helloworld-service EOFNell'istruzione precedente, TLSRoute corrisponde a example.com come SNI e h2 come ALPN. Se le corrispondenze vengono modificate come segue, TLSRoute corrisponde a SNI o ALPN:
- matches: - sniHost: - example.com - alpn: - h2Utilizza la specifica tls_route.yaml per creare la risorsa TLSRoute:
gcloud network-services tls-routes import helloworld-tls-route \ --source=tls_route.yaml \ --location=${REGION}
Convalida il deployment
Esegui il seguente comando curl per verificare la connettività HTTP ai servizi di test che hai creato:
curl https://example.com:8443 --resolve example.com:8443:${IP_ADDRESS} -kIl comando restituisce una risposta da una delle VM nel gruppo di istanze gestite. L'output è simile al seguente:
{ "path": "/", "headers": { "host": "example.com:8443", "user-agent": "curl/8.16.0", "accept": "*/*" }, "method": "GET", "body": "", "fresh": false, "hostname": "example.com", "ip": "::ffff:10.128.0.59", "ips": [], "protocol": "https", "query": {}, "subdomains": [], "xhr": false, "os": { "hostname": "19cd7812e792" }, "connection": { "servername": "example.com" }
Verifica con esito negativo
Nel comando seguente, l'SNI non corrisponde a example.com, quindi il gateway rifiuta la connessione:
curl https://invalid-server.com:8443 --resolve invalid-server.com:8443:${IP_ADDRESS} -kNel comando seguente, ALPN non corrisponde a h2 (protocollo HTTP2), quindi il gateway rifiuta la connessione:
curl https://example.com:8443 --resolve example.com:8443:${IP_ADDRESS} -k --http1.1Tutti i comandi precedenti restituiscono il seguente errore:
curl: (35) OpenSSL SSL_connect: Connection reset by peer in connection.Nel comando seguente, il client sta creando una connessione di testo normale (non criptata), pertanto il gateway rifiuta la connessione con un errore 404 Non trovato:
curl example.com:8443 --resolve example.com:8443:${IP_ADDRESS} -k