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

Mit Cloud Service Mesh können Sie Traffic von GKE-Arbeitslasten an Compute Engine-VMs weiterleiten, die von einem BackendService bereitgestellt werden. Sie können Anfragen an diese eigenständigen Ressourcen senden, ohne die VM oder die BackendService dem Service Mesh hinzuzufügen.

Dieses Dokument gilt nur für Cloud Service Mesh-Implementierungen, die Istio APIs verwenden. Google Cloud -APIs werden nicht unterstützt. mTLS wird für Compute Engine-VMs nicht unterstützt.

Hinweis

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

  1. Einen GKE-Cluster mit aktiviertem Cloud Service Mesh.
  2. Eine Compute Engine-VM bereitgestellt, die von einem BackendService unterstützt wird.

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

  1. Stellen Sie eine Compute Engine-Beispiel-VM und einen BackendService bereit:

    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 die Compute Engine-VM bereitgestellt werden soll.

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 der Port, die von GKE-Arbeitslasten zum Aufrufen dieses GCPBackend verwendet werden.
  2. Backend-Informationen: Die BackendService-Details wie Dienstname, Standort und Projektnummer.

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

Damit der Hostname im Cluster per DNS aufgelöst werden kann (standardmäßig ist er nicht auflösbar), müssen Sie das 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. 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 lautet der DNS-Name gcpbackend und das VPC-Netzwerk default.

  2. Richten Sie den Eintrag ein, damit 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 Verbindung von GKE zur 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-Diensteinträgen zu vermeiden. Bei einem Konflikt gilt die folgende Rangfolge (von hoch nach niedrig): Kubernetes-Dienst, istio-ServiceEntry und GCPBackend.

Der virtuelle Dienst und das GCPBackend müssen sich im selben Namespace befinden.