Private IP-Adressen für Worker-Pools mit Cloud DNS registrieren

In dieser Anleitung wird beschrieben, wie Sie die private IP-Adresse einer Cloud Run-Worker-Pool-Instanz in einer von Cloud DNS verwalteten Zone registrieren. In dieser Anleitung verwenden Sie ein Startskript, um die Instanz-IP-Adresse dynamisch über den Metadatenserver zu erkennen, und erstellen eine Node.js-Anwendung, um den eingehenden Traffic direkt in Ihrem VPC-Netzwerk zu verarbeiten.

Ziele

Kosten

In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen. Verwenden Sie den Preisrechner.

Neuen Nutzern von Google Cloud steht möglicherweise eine kostenlose Testversion zur Verfügung.

Hinweis

  1. Melden Sie sich in Ihrem Google Cloud Konto an. Wenn Sie noch kein Google Cloud-Kunde sind, erstellen Sie ein Konto, um zu sehen, wie sich unsere Produkte in realen Szenarien schlagen. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  5. Verify that billing is enabled for your Google Cloud project.

  6. Aktivieren Sie die Cloud DNS API, die Cloud Run API, die Compute Engine API, die Artifact Registry API und die Cloud Build API.

    Erforderliche Rollen zum Aktivieren von APIs

    Zum Aktivieren von APIs benötigen Sie die IAM-Rolle „Service Usage-Administrator“ (roles/serviceusage.serviceUsageAdmin), die die Berechtigung serviceusage.services.enable enthält. Informationen zum Zuweisen von Rollen.

    APIs aktivieren

  7. Installieren und initialisieren Sie die gcloud CLI.
  8. Aktualisieren Sie die Komponenten:
    gcloud components update
  9. Legen Sie Ihre Projekt-ID mit dem folgenden Befehl fest:
    gcloud config set project PROJECT_ID
    Ersetzen Sie PROJECT_ID durch die ID Ihres Google Cloud Projekts.

Erforderliche Rollen

Bitten Sie Ihren Administrator, Ihnen die folgenden IAM-Rollen für Ihr Projekt zuzuweisen, damit Sie die Anleitung ausführen können:

Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.

Sie können die erforderlichen Berechtigungen auch über benutzerdefinierte Rollen oder andere vordefinierte Rollen erhalten.

Benutzerdefiniertes Dienstkonto erstellen

Erstellen Sie ein benutzerdefiniertes Dienstkonto mit den Mindestberechtigungen, die zum Registrieren von DNS Einträgen erforderlich sind. So richten Sie das Dienstkonto ein:

  1. Erstellen Sie ein Dienstkonto mit dem folgenden Befehl:

    gcloud iam service-accounts create SERVICE_ACCOUNT_NAME \
      --display-name="DNS Worker Pool Service Account"

    Ersetzen Sie SERVICE_ACCOUNT_NAME durch einen Namen für Ihr benutzerdefiniertes Dienstkonto, z. B. dns-worker-sa.

  2. Weisen Sie dem Dienstkonto die Rolle „Cloud DNS-Administrator“ zu:

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/dns.admin"

Cloud DNS-Zone erstellen

Erstellen Sie eine private von Cloud DNS verwaltete Zone mit dem Namen test-wp, um die Instanz-IP-Adresse Ihres Worker-Pools zu registrieren.

gcloud dns managed-zones create test-wp --description="new DNS zone for worker pools"  --dns-name="workerpools.example.com."  --visibility="private" --networks=default

Node.js-Anwendung erstellen

Erstellen Sie eine Node.js-Anwendung, die die IP-Adresse der Worker-Pool-Instanz über den Metadatenserver abruft und sie dann bei Cloud DNS registriert.

  1. Erstellen Sie einen Ordner mit dem Namen worker und wechseln Sie in das Verzeichnis:

    mkdir worker
    cd worker
    
  2. Erstellen Sie eine Datei mit dem Namen setup_dns.sh und fügen Sie das folgende Skript hinzu, das beim Starten der Worker-Pool-Instanz ausgeführt wird. In diesem Skript wird der Hostname der Instanz verwendet, um den DNS-Eintragsnamen zu generieren. Wenn es mehr als eine Instanz gibt, können mehrere Instanzen denselben Hostnamen verwenden, was zur Erstellung sich überschneidender DNS-Einträge führt.

    #!/bin/bash
    
    # --- Variables ---
    # The name of your Cloud DNS managed zone.
    ZONE_NAME="test-wp"
    # The base domain suffix for the DNS entry. Use the part *after* the hostname.
    # For example, for "testinstance.workerpools.example.com.", the suffix is ".workerpools.example.com."
    DNS_SUFFIX=".workerpools.example.com."
    # The Time-To-Live (TTL) in seconds.
    TTL="300"
    # The record type (A for IPv4).
    RECORD_TYPE="A"
    # -----------------
    
    # 1. Dynamically generate DNS_NAME
    # Get the simple hostname (e.g., "testinstance") and append the defined suffix.
    # We use 'hostname -s' to get the short hostname.
    SHORT_HOSTNAME=$(hostname -s)
    DNS_NAME="${SHORT_HOSTNAME}${DNS_SUFFIX}"
    
    # 2. Dynamically assign NEW_IP
    # Get the IP address from metadata server using predefined key.
    NEW_IP=$(curl "http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/ip" -H "Metadata-Flavor: Google")
    
    # --- Input Validation ---
    if [ -z "$NEW_IP" ]; then
        echo "❌ ERROR: Could not obtain a valid IP address from metadata server. Aborting."
        exit 1
    fi
    
    echo "Starting DNS record update for ${DNS_NAME} in zone ${ZONE_NAME}..."
    echo "New IP detected on this instance: ${NEW_IP}"
    
    # 3. Get the current existing IP address (if any)
    # This is required to know what to put in the --rrdatas for the delete command.
    EXISTING_IP=$(gcloud dns record-sets list \
        --zone="${ZONE_NAME}" \
        --name="${DNS_NAME}" \
        --type="${RECORD_TYPE}" \
        --format="value(rrdatas[0])" 2>/dev/null)
    
    # --- Conditional Deletion/Skip Check ---
    if [ -n "$EXISTING_IP" ] && [ "$EXISTING_IP" != "$NEW_IP" ]; then
        echo "Found existing IP: ${EXISTING_IP}. It is different from the new IP."
    
        # Delete the existing record
        echo "Deleting old record..."
        gcloud dns record-sets delete "${DNS_NAME}" \
            --zone="${ZONE_NAME}" \
            --type="${RECORD_TYPE}" \
            --quiet
    
        if [ $? -ne 0 ]; then
            echo "❌ ERROR: Failed to delete existing record. Aborting."
            exit 1
        fi
    elif [ -n "$EXISTING_IP" ] && [ "$EXISTING_IP" == "$NEW_IP" ]; then
        echo "Existing IP (${EXISTING_IP}) matches the new IP. Skipping update."
        exit 0
    else
        echo "No existing record found for ${DNS_NAME}. Proceeding with creation."
    fi
    # ----------------------------------------
    
    # 4. Add the new record
    echo "Creating new record with IP: ${NEW_IP}..."
    gcloud dns record-sets create "${DNS_NAME}" \
      --zone="${ZONE_NAME}" \
      --type="${RECORD_TYPE}" \
      --ttl="${TTL}" \
      --rrdatas="${NEW_IP}"
    
    # Final status check
    if [ $? -eq 0 ]; then
        echo "✅ Successfully created/updated DNS record for ${DNS_NAME} to ${NEW_IP}."
    else
        echo "❌ ERROR: Failed to create the new DNS record."
        exit 1
    fi
    
  3. Erstellen Sie eine server.js-Datei mit dem folgenden Code, um den eingehenden Traffic über die private IP-Adresse zu verarbeiten:

    // server.js
    
    // 1. Import the built-in 'http' module
    console.log("hello from worker pool")
    const http = require('http');
    
    // Define the port the server will listen on
    const PORT = 3000;
    
    // 2. Create the server instance
    const server = http.createServer((req, res) => {
      // Set the response HTTP header with status and type of content
      res.writeHead(200, {'Content-Type': 'text/plain'});
      // Write the response body
      res.end('Hello World!\n');
    });
    
    // 3. Start the server and listen on the specified port
    server.listen(PORT, () => {
      console.log(`Server running at http://localhost:${PORT}/`);
    });
    
  4. Erstellen Sie ein start.sh-Skript mit dem folgenden Code, um zuerst die DNS-Einrichtung vorzunehmen, bevor Sie Ihre Node.js-Anwendung ausführen:

    #!/bin/bash
    set -e
    
    # 1. Execute the setup script
    echo "Running setup_dns.sh..."
    /app/setup_dns.sh
    
    # 2. Run the main application
    echo "Starting server.js..."
    exec node /app/server.js
    
  5. Erstellen Sie das folgende Dockerfile, um die Anwendung in einem Image zu verpacken:

    # Choose a base image. This image includes gcloud, kubectl, etc.
    FROM google/cloud-sdk:latest
    
    # Install Node.js on top of the Cloud SDK image.
    RUN apt-get update && \
        apt-get install -y curl && \
        curl -sL https://deb.nodesource.com/setup_lts.x | bash - && \
        apt-get install -y nodejs && \
        # Clean up to reduce image size
        apt-get clean && \
        rm -rf /var/lib/apt/lists/*
    
    # Set the working directory inside the container.
    WORKDIR /app
    
    # Copy the application and scripts into the container.
    COPY setup_dns.sh .
    COPY server.js .
    COPY start.sh .
    
    # Make both scripts executable.
    RUN chmod +x setup_dns.sh start.sh
    
    # Define the entrypoint and default command.
    ENTRYPOINT ["/app/start.sh"]
    CMD []
    

Worker-Pool mit Direct VPC-Ingress bereitstellen

Stellen Sie einen Worker-Pool mit dem Namen test-cli-dns bereit und hängen Sie ihn an ein VPC-Netzwerk an.

gcloud beta run worker-pools deploy test-cli-dns \
  --network default \
  --subnet default \
  --region us-central1 \
  --source . \
  --service-account SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
  --project PROJECT_ID

Ersetzen Sie PROJECT_ID durch Ihre Google Cloud Projekt-ID und SERVICE_ACCOUNT_NAME durch den Namen des von Ihnen erstellten Dienstkontos.

Anwendung testen

Cloud Run-Worker-Pools mit Direct VPC-Ingress sind für rein internen Traffic konzipiert. Sie haben keine öffentliche IP-Adresse. Führen Sie die folgenden Schritte aus, um die Ingress-Funktionalität zu überprüfen. Senden Sie dazu eine Anfrage mit curl von einer Compute Engine-VM, die im selben VPC-Netzwerk und Subnetz gehostet wird:

  1. Erstellen Sie eine Test-VM im selben Netzwerk und in derselben Region wie Ihr Worker-Pool:

     gcloud compute instances create wp-test-vm \
         --zone=us-central1-a \
         --network=default \
         --subnet=default
    
  2. Stellen Sie über SSH mit dem folgenden Befehl eine Verbindung zur Test-VM her:

     gcloud compute ssh wp-test-vm --zone=us-central1-a
    
  3. Rufen Sie im VM-Terminal Ihren Dienst über die private IP-Adresse der Worker-Pool-Instanz auf, die bei Cloud DNS registriert ist:

    curl http://localhost.workerpools.example.com:3000

    Die Ausgabe sollte so aussehen:

    Hello World!

Fertig! Sie haben Ihren Cloud Run-Worker-Pool mit Direct VPC-Ingress mithilfe einer privaten IP-Adresse und Cloud DNS erfolgreich konfiguriert.

Bereinigen

Löschen Sie alle Ressourcen , die Sie mit dieser Anleitung bereitgestellt haben, um zusätzliche Kosten für Ihr Google Cloud Konto zu vermeiden.

Projekt löschen

Wenn Sie ein neues Projekt für diese Anleitung erstellt haben, löschen Sie das Projekt. Wenn Sie ein vorhandenes Projekt verwendet haben und es beibehalten möchten, ohne die Änderungen in dieser Anleitung hinzuzufügen , löschen Sie die für die Anleitung erstellten Ressourcen.

Am einfachsten vermeiden Sie weitere Kosten, wenn Sie das zum Ausführen der Anleitung erstellte Projekt löschen.

So löschen Sie das Projekt:

  1. Wechseln Sie in der Google Cloud -Console zur Seite Ressourcen verwalten.

    Zur Seite „Ressourcen verwalten“

  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf Löschen.
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Shut down (Beenden), um das Projekt zu löschen.

Anleitungsressourcen löschen

  1. Löschen Sie den Cloud Run-Dienst, den Sie in dieser Anleitung bereitgestellt haben. Für Cloud Run-Dienste fallen erst Kosten an, wenn sie Anfragen erhalten.

    Führen Sie den folgenden Befehl aus, um Ihren Cloud Run-Dienst zu löschen:

    gcloud run services delete SERVICE-NAME

    Ersetzen Sie SERVICE-NAME durch den Namen Ihres Dienstes.

    Sie können Cloud Run-Dienste auch über die Google Cloud Console löschen.

  2. Entfernen Sie die Standardkonfiguration der gcloud-Region, die Sie bei der Einrichtung der Anleitung hinzugefügt haben:

     gcloud config unset run/region
    
  3. Entfernen Sie die Projektkonfiguration:

     gcloud config unset project
    
  4. Löschen Sie andere Google Cloud Ressourcen, die in dieser Anleitung erstellt wurden:

Nächste Schritte