Traffic von Cloud Service Mesh-Arbeitslasten an eine Compute Engine-VM weiterleiten

Auf dieser Seite wird beschrieben, wie Sie den Netzwerkverkehr von Cloud Service Mesh-Arbeitslasten in GKE sicher an Compute Engine-VMs weiterleiten, die von einem BackendService bereitgestellt werden.

Wenn Sie Traffic von GKE zu einer Compute Engine-VM weiterleiten, ist es nicht erforderlich, dass die Compute Engine-VM oder der BackendService dem Cloud Service Mesh beitreten. Die Compute Engine-VM und der BackendService müssen sich jedoch im selben Projekt wie der Cloud Service Mesh-GKE-Cluster befinden. Diese Einschränkung gilt, solange sich diese Funktion in der öffentlichen Vorschau befindet. MTLS wird für Compute Engine-VMs nicht unterstützt

Hinweise

In den folgenden Abschnitten wird davon ausgegangen, dass Sie Folgendes haben:

  1. Ein GKE-Cluster mit aktiviertem Cloud Service Mesh.
  2. Sie haben eine Compute Engine-VM bereitgestellt, die von einem BackendService bereitgestellt wird.

Alternativ können Sie die folgenden Befehle ausführen, um eine Compute Engine-Beispiel-VM bereitzustellen, die von einem BackendService bereitgestellt wird.

  1. Beispiel-Compute Engine-VM und BackendService bereitstellen:

    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
    

    Wobei:

    • VM_ZONE ist die Zone, in der Sie Ihre Compute Engine-VM bereitstellen möchten.

Compute Engine-VM als GCPBackend konfigurieren

In diesem Abschnitt machen Sie die Compute Engine-VM mithilfe von GCPBackend für die GKE-Arbeitslasten verfügbar. Das GCPBackend besteht aus:

  1. Frontend-Informationen, insbesondere der Hostname und Port, die von GKE-Arbeitslasten verwendet werden, um diesen GCPBackend aufzurufen.
  2. Backend-Informationen: die Details des BackendService, z. B. Dienstname, Standort und Projektnummer.

Das GCPBackend enthält den Hostnamen und die Portdetails sowie die BackendService-Details (Dienstname, Standort und Projektnummer). Die GKE-Arbeitslasten sollten den GCPBackend-Hostnamen und -Port in ihren HTTP-Anfragen verwenden, um auf die Compute Engine-VM zuzugreifen.

Damit der Hostname innerhalb des Clusters DNS-auflösbar ist (standardmäßig ist er nicht auflösbar), müssen Sie Google Cloud DNS so konfigurieren, dass alle Hosts unter einem ausgewählten Hostnamen in eine beliebige IP-Adresse aufgelöst werden. Bis Sie diesen DNS-Eintrag konfigurieren, schlägt die Anfrage fehl. Die Google Cloud DNS-Konfiguration ist eine einmalige Einrichtung pro benutzerdefinierter Domain.

  1. So erstellen Sie eine verwaltete Zone:

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

    In diesem Beispiel ist der DNS-Name gcpbackend und das VPC-Netzwerk default.

  2. Richten Sie den Eintrag so ein, dass die Domain aufgelöst werden kann:

    gcloud beta dns record-sets create *.gcpbackend \
      --ttl=3600 --type=A --zone=prod \
      --rrdatas=10.0.0.1
    
  3. Erstellen Sie das GCPBackend mit einem Hostnamen unter der vorherigen Domain:

    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
    

    In diesem Beispiel ist GCP_BACKEND_NAME vm-gcp-backend.

  4. Erstellen Sie einen Test-Pod, um die Konnektivität zwischen GKE und Compute Engine-VM zu prüfen:

    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
    

    Ihre GKE-Arbeitslasten können jetzt auf die Compute Engine-VM zugreifen, indem sie HTTP-Anfragen an hello-world.gcpbackend:80 senden.

Sie sollten eindeutige Namen für GCPBackend verwenden, um Konflikte mit vorhandenen Kubernetes-Diensten oder Istio-Service-Einträgen zu vermeiden. Wenn es einen Konflikt gibt, ist die Prioritätsreihenfolge (hoch bis niedrig) Kubernetes-Dienst, Istio-ServiceEntry und GCPBackend.

Der Virtual Service und das GCPBackend müssen sich im selben Namespace befinden und die Compute Engine-VM muss sich im selben Projekt wie der Cloud Service Mesh-GKE-Cluster befinden.