Configuração do Traffic Director para um gateway de entrada

Neste guia, demonstramos como configurar o Traffic Director com um gateway de entrada.

Nesta configuração, um balanceador de carga de rede direciona o tráfego da Internet para sua malha de serviço por meio de um gateway de entrada. Um recurso Gateway gerencia um proxy do Envoy que atua como um gateway na malha de serviço. Um gateway também é conhecido como proxy intermediário ou entrada. Os proxies do Envoy implantados para atuar como um gateway de entrada são proxies independentes, em vez de um sidecar para uma carga de trabalho. Nesse modo, o Envoy detecta uma lista bem definida de endereços e portas IP e encaminha o tráfego de acordo com as regras de roteamento que você configurar. Um novo recurso de API Gateway é usado para configurar esses clientes Envoy.

Gateway de entrada com o proxy Envoy, o balanceador de carga de rede e o recurso Gateway
Gateway de entrada com o proxy Envoy, o balanceador de carga de rede e o recurso Gateway (clique para ampliar)

Configure o roteamento para garantir que o tráfego destinado aos proxies Gateway seja direcionado às VMs que hospedam os Envoys. O serviço de entrada pode ser pareado com um balanceador de carga HTTP(S) externo ou interno, mas essas configurações não estão incluídas nesta configuração de demonstração.

A comunicação entre serviços e o recurso Mesh por trás do Gateway não são abordados neste guia.

Pré-requisitos

Verifique se você seguiu os pré-requisitos nos seguintes guias:

Configurar regras de firewall

Nesta seção, você configura duas regras de firewall. Uma delas permite que as sondagens da verificação de integridade sejam realizadas na rede da nuvem privada virtual. A outra permite o tráfego de qualquer origem na rede.

  1. Configure regras de firewall para permitir verificações de integridade.

    gcloud compute firewall-rules create allow-gateway-health-checks \
      --network=${VPC_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
    
  2. Configure regras de firewall para permitir tráfego de qualquer origem. Edite os comandos para suas portas e intervalos de endereços IP de origem.

    gcloud compute firewall-rules create allow-gateway-ingress-traffic \
      --network=${VPC_NAME} \
      --direction=INGRESS \
      --action=ALLOW \
      --rules=tcp:80,tcp:443 \
      --source-ranges="0.0.0.0/0" \
      --target-tags=gateway-proxy
    

Configurar as permissões do Gerenciamento de identidade e acesso

Nesta seção, você designa a conta de serviço para os proxies de gateway e atribui a eles os papéis corretos do IAM.

  1. Crie uma identidade de conta de serviço para os proxies de gateway.

    gcloud iam service-accounts create gateway-proxy
    
  2. Atribua os papéis do IAM necessários à identidade da conta de serviço.

    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"
    

Configurar o recurso Gateway

Nesta seção, você configura o recurso de gateway.

  1. Em um arquivo chamado gateway80.yaml, crie a especificação Gateway para o tráfego HTTP.

    cat <<EOF | tee gateway80.yaml
    name: gateway80
    scope: gateway-proxy
    ports:
    - 80
    type: OPEN_MESH
    EOF
    
  2. Crie o recurso Gateway da especificação gateway80.yaml:

    gcloud alpha network-services gateways import gateway80 \
        --source=gateway80.yaml \
        --location=global
    

Criar um grupo de instâncias gerenciadas com proxies do Envoy

Nesta seção, você cria os proxies do Envoy que estão associados ao gateway de entrada.

  1. Crie um modelo de instância para uma VM que executa um proxy de serviço do Envoy implantado automaticamente. Os Envoys têm um escopo de gateway-proxy. Não transmita a porta de exibição como um parâmetro de --service-proxy.

    gcloud beta compute instance-templates create gateway-proxy \
      --machine-type=n1-standard-1 \
      --boot-disk-size=10GB \
      --scopes=https://www.googleapis.com/auth/cloud-platform \
      --tags=gateway-proxy \
      --network-interface=network=${VPC_NAME},no-address \
      --service-account="gateway-proxy@${PROJECT_ID}.iam.gserviceaccount.com" \
      --service-proxy=enabled,scope=gateway-proxy \
    
  2. Crie um grupo de instâncias gerenciadas por região a partir do modelo de instância.

    gcloud compute instance-groups managed create gateway-proxies-${REGION} \
      --region=${REGION} \
      --size=2 \
      --template=gateway-proxy \
      --target-distribution-shape=EVEN
    
  3. Defina uma porta nomeada para ativar a verificação de integridade TCP no balanceador de carga de rede.

    gcloud compute instance-groups managed set-named-ports \
      gateway-proxies-${REGION} \
      --region=${REGION} \
      --named-ports=healthz:80
    
  4. Ative o escalonamento automático para o grupo de instâncias.

    gcloud compute instance-groups managed set-autoscaling \
      gateway-proxies-${REGION} \
      --region=${REGION} \
      --cool-down-period=60 \
      --min-num-replicas=3 \
      --max-num-replicas=10 \
      --mode=on \
      --target-cpu-utilization=0.6
    

Configurar o balanceamento de carga de rede regional

Nesta seção, você cria o balanceador de carga de rede, um serviço de back-end, uma regra de encaminhamento e uma verificação de integridade.

  1. Crie o balanceador de carga de rede.

    gcloud compute addresses create xnlb-${REGION} \
      --region=${REGION}
    
  2. Consiga o endereço IP reservado para o balanceador de carga de rede.

    export IP_ADDRESS=$(gcloud compute addresses describe xnlb-${REGION} \
      --region=${REGION} --format='value(address)')
    
  3. Crie uma verificação de integridade para os proxies de gateway.

    gcloud compute health-checks create tcp xnlb-${REGION} \
      --region=${REGION} \
      --port-name=healthz
    
  4. Crie um serviço de back-end para os proxies de 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=healthz
    
  5. Adicione o grupo de instâncias gerenciadas como os back-ends.

    gcloud compute backend-services add-backend xnlb-${REGION} \
      --instance-group=gateway-proxies-${REGION} \
      --instance-group-region=${REGION} \
      --region=${REGION}
    
  6. Crie uma regra de encaminhamento que aponte para os proxies de gateway.

    gcloud compute forwarding-rules create xnlb-${REGION} \
      --region=${REGION} \
      --load-balancing-scheme=EXTERNAL \
      --address=${IP_ADDRESS} \
      --ip-protocol=TCP \
      --ports=80 \
      --backend-service=xnlb-${REGION} \
      --backend-service-region=${REGION}
    

Configurar o servidor HTTP

Nesta seção, você cria um serviço de teste na malha de serviço.

  1. Crie um modelo de instância com um serviço de teste na porta 10000 usando o utilitário 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-9 \
      --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"
    
  2. Crie o grupo gerenciado de instâncias com base no modelo.

    gcloud compute instance-groups managed create tcp-td-mig-us-east1 \
      --zone=us-east1-a \
      --size=1 \
      --template=tcp-td-vm-template
    
  3. Crie uma verificação de integridade HTTP.

    gcloud compute health-checks create http helloworld-health-check
    
  4. Crie uma regra de firewall para permitir conexões de verificação de integridade de entrada com instâncias na sua rede.

    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:80
    
  5. Crie um serviço de back-end global com um esquema de balanceamento de carga de INTERNAL_SELF_MANAGED e anexe a verificação de integridade.

    gcloud compute backend-services create tcp-helloworld-service \
        --global \
        --load-balancing-scheme=INTERNAL_SELF_MANAGED \
        --protocol=HTTP \
        --health-checks helloworld-health-check
    
  6. Adicione o grupo de instâncias gerenciadas ao serviço de back-end.

    gcloud compute backend-services add-backend tcp-helloworld-service \
      --instance-group td-mig-us-east1 \
      --instance-group-zone us-east1-a \
      --global
    

Configure o roteamento com HTTPRoute

Agora você tem um recurso Gateway do Traffic Director e um serviço configurado. Em seguida, você os conecta usando um recurso HTTPRoute que associa um nome de host a um serviço de back-end. O HTTPRoute também faz referência ao Gateway.

  1. Em um arquivo chamado http_route.yaml, crie a especificação HTTPRoute. A especificação faz referência ao gateway80, que é o recurso Gateway criado anteriormente e aponta para o serviço de back-end http-helloworld-service.

    name: helloworld-http-route
    hostnames:
    - helloworld-gce
    gateways:
    - projects/$PROJECT_NUMBER/locations/global/gateways/gateway80
    rules:
    - action:
      destinations:
       - serviceName: "projects/$PROJECT_NUMBER/locations/global/backendServices/http-helloworld-service"
    
  2. Use a especificação em http_route.yaml para criar o recurso HTTPRoute.

    gcloud alpha network-services http-routes import helloworld-http-route \
        --source=http_route.yaml \
        --location=global
    
  3. Verifique se é possível acessar o serviço de um cliente externo por meio do balanceador de carga de rede e do Traffic Director Gateway.

    curl -H "Host: helloworld-gce" ${IP_ADDRESS}