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 verwalteten Cloud DNS-Zone registrieren. In diesem Tutorial verwenden Sie ein Startscript, um die Instanz-IP dynamisch über den Metadatenserver zu erkennen und eine Node.js-Anwendung zu erstellen, die den eingehenden Traffic direkt in Ihrem VPC-Netzwerk verarbeitet.

Ziele

Kosten

In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Cloud de Confiance by S3NS:

Hinweis

  1. In the Cloud de Confiance console, on the project selector page, select or create a Cloud de Confiance 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

  2. Verify that billing is enabled for your Cloud de Confiance project.

  3. Aktivieren Sie die Cloud DNS API, die Cloud Run API, die Compute Engine API, die Artifact Registry API und die Cloud Build API, falls sie noch nicht aktiviert sind.

    Rollen, die zum Aktivieren von APIs erforderlich sind

    Zum Aktivieren von APIs benötigen Sie die Berechtigung serviceusage.services.enable. Wenn Sie das Projekt erstellt haben, haben Sie diese Berechtigung wahrscheinlich bereits über die Rolle „Inhaber“ (roles/owner). Andernfalls können Sie diese Berechtigung über die Rolle „Service Usage-Administrator“ (roles/serviceusage.serviceUsageAdmin) erhalten. Informationen zum Zuweisen von Rollen

    APIs aktivieren

  4. Installieren und initialisieren Sie die gcloud CLI.
  5. Aktualisieren Sie die Komponenten:
    gcloud components update
  6. Legen Sie Ihre Projekt-ID mit dem folgenden Befehl fest:
    gcloud config set project PROJECT_ID
    Ersetzen Sie PROJECT_ID durch die ID Ihres Cloud de Confiance by S3NS Projekts.

Erforderliche Rollen

Bitten Sie Ihren Administrator, Ihnen die folgenden IAM-Rollen für Ihr Projekt zuzuweisen, um die Berechtigungen zu erhalten, die Sie zum Ausführen der Anleitung benötigen:

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 erforderlichen Mindestberechtigungen zum Registrieren von DNS-Einträgen. 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.s3ns.iam.gserviceaccount.com" \
      --role="roles/dns.admin"

Cloud DNS-Zone erstellen

Erstellen Sie eine private verwaltete Cloud DNS-Zone mit dem Namen test-wp, um die Instanz-IP 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 dieses Verzeichnis:

    mkdir worker
    cd worker
    
  2. Erstellen Sie eine Datei mit dem Namen setup_dns.sh und fügen Sie ihr das folgende Skript hinzu, das beim Start der Worker-Pool-Instanz ausgeführt wird. In diesem Skript wird der DNS-Eintragsname aus dem Hostnamen der Instanz generiert. 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 Ingress der privaten 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-Verbindung für eingehenden Traffic bereitstellen

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

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

Ersetzen Sie PROJECT_ID durch Ihre Cloud de Confiance by S3NS 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. So prüfen Sie die Ingress-Funktionalität: Führen Sie mit curl eine Anfrage von einer Compute Engine-VM aus, 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 mit dem folgenden Befehl eine SSH-Verbindung zur Test-VM her:

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

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

    Es sollte folgende Ausgabe angezeigt werden:

    Hello World!

Fertig! Sie haben Ihren Cloud Run-Worker-Pool erfolgreich mit Direct VPC Ingress über eine private IP-Adresse und Cloud DNS konfiguriert.

Bereinigen

Löschen Sie alle Ressourcen, die Sie mit dieser Anleitung bereitgestellt haben, um zusätzliche Kosten für Ihr Cloud de Confiance by S3NS 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 Cloud de Confiance -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 empfangen.

    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 Cloud de Confiance Console löschen.

  2. Entfernen Sie die Konfiguration der Standardregion gcloud, die Sie während der Einrichtung für die Anleitung hinzugefügt haben:

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

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

Nächste Schritte