Rotear o tráfego de cargas de trabalho do Cloud Service Mesh para VMs do Compute Engine

Nesta página, mostramos como rotear com segurança o tráfego de rede de cargas de trabalho do Cloud Service Mesh no GKE para a VM do Compute Engine com um BackendService.

Ao rotear o tráfego do GKE para uma VM do Compute Engine, não é necessário que a VM do Compute Engine ou o BackendService participe da malha de serviço do Cloud. No entanto, a VM do Compute Engine e o BackendService precisam estar no mesmo projeto que o cluster do GKE do Cloud Service Mesh. Essa limitação existe enquanto esse recurso está disponível no Acesso antecipado. O MTLS não tem suporte para VMs do Compute Engine

Antes de começar

As seções a seguir pressupõem que você:

  1. Um cluster do GKE com o Cloud Service Mesh ativado.
  2. Implantou uma VM do Compute Engine que é apresentada por um BackendService.

Como alternativa, execute os comandos abaixo para implantar uma VM do Compute Engine de exemplo com um BackendService.

  1. Implante uma VM do Compute Engine e um BackendService de exemplo:

    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><body><h1>'\`$(/bin/hostname)\`'</h1></body></html>' | sudo tee /var/www/html/index.html"
    
    gcloud compute instance-groups managed create http-td-mig-us-east1 \
      --zone=VM_ZONE   \
      --size=2 \
      --template=td-httpd-vm-template
    
    gcloud compute health-checks create http http-helloworld-health-check
    
    gcloud compute firewall-rules create http-vm-allow-health-checks \
      --network=default \
      --action=ALLOW \
      --direction=INGRESS \
      --source-ranges=0.0.0.0/0 \
      --target-tags=http-td-server \
      --rules=tcp:80
    
    gcloud compute backend-services create helloworld \
      --global \
      --load-balancing-scheme=INTERNAL_SELF_MANAGED \
      --protocol=HTTP \
      --health-checks http-helloworld-health-check
    
    gcloud compute backend-services add-backend helloworld \
      --instance-group=http-td-mig-us-east1 \
      --instance-group-zone=VM_ZONE  \
      --global
    

    Em que:

    • VM_ZONE é a zona em que você quer implantar a VM do Compute Engine.

Configurar uma VM do Compute Engine como um GCPBackend

Nesta seção, você expõe a VM do Compute Engine às cargas de trabalho do GKE usando o GCPBackend. O GCPBackend consiste em:

  1. Informações de front-end, especificamente o nome de host e a porta que as cargas de trabalho do GKE usariam para chamar esse GCPBackend.
  2. Informações de back-end: os detalhes do BackendService, como nome do serviço, local e número do projeto.

O GCPBackend contém os detalhes do nome do host e da porta, além dos detalhes do BackendService (nome do serviço, local e número do projeto). As cargas de trabalho do GKE precisam usar o nome de host e a porta GCPBackend nas solicitações HTTP para acessar a VM do Compute Engine.

Para tornar o DNS do nome do host solucionável no cluster (por padrão, ele não é solucionável), é necessário configurar o Google Cloud DNS para resolver todos os hosts em um nome de host escolhido para um endereço IP arbitrário. Até que você configure essa entrada de DNS, a solicitação vai falhar. A configuração do Google Cloud DNS é uma configuração única por domínio personalizado.

  1. Crie uma zona gerenciada:

    gcloud dns managed-zones create prod \
        --description="zone for gcpbackend" \
        --dns-name=gcpbackend \
        --visibility=private \
        --networks=default
    

    Neste exemplo, o nome DNS é gcpbackend e a rede VPC é default.

  2. Configure o registro para tornar o domínio solucionável:

    gcloud beta dns record-sets create *.gcpbackend \
      --ttl=3600 --type=A --zone=prod \
      --rrdatas=10.0.0.1
    
  3. Crie o GCPBackend com um nome de host no domínio anterior:

    cat <<EOF > gcp-backend.yaml
    apiVersion: networking.gke.io/v1
    kind: GCPBackend
    metadata:
      name: vm-gcp-backend
      namespace: NAMESPACE
    spec:
      type: "BackendService"
      hostname: hello-world.gcpbackend
      backendservice:
        name: helloworld
        location: global
    EOF
    kubectl apply -f gcp-backend.yaml
    

    Neste exemplo, GCP_BACKEND_NAME é vm-gcp-backend.

  4. Crie um pod de teste para verificar a conectividade do GKE com a VM do Compute Engine:

    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: testcurl
      namespace: default
    spec:
      containers:
      - name: curl
        image: curlimages/curl
        command: ["sleep", "3000"]
    EOF
    
    kubectl exec testcurl -c curl -- curl http://hello-world.gcpbackend:80
    

    Agora, as cargas de trabalho do GKE podem acessar a VM do Compute Engine enviando solicitações HTTP para hello-world.gcpbackend:80.

Use nomes distintos para o GCPBackend para evitar conflitos com serviços do Kubernetes ou entradas de serviço do Istio. Se houver conflito, a ordem de precedência (de alta para baixa) será Service do Kubernetes, ServiceEntry do Istio e GCPBackend.

O serviço virtual e o GCPBackend precisam estar no mesmo namespace, e a VM do Compute Engine precisa estar no mesmo projeto que o cluster do GKE do Cloud Service Mesh.