Ziele
- Erstellen Sie eine von Cloud DNS verwaltete Zone, um die Einträge für Ihren Worker-Pool zu hosten.
- Erstellen Sie eine Node.js-Anwendung, um den eingehenden Traffic über das VPC-Netzwerk zu verarbeiten.
- Stellen Sie einen Worker-Pool mit Direct VPC-Ingress bereit, um Ihrer Worker-Instanz eine private IP-Adresse aus Ihrem Subnetz zuzuweisen.
- Testen Sie Ihre Anwendung, um von einer VM-Instanz (virtuelle Maschine) im selben VPC-Netzwerk auf die private IP-Adresse zuzugreifen.
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.
Hinweis
- 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.
-
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 theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
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 theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
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 Berechtigungserviceusage.services.enableenthält. Informationen zum Zuweisen von Rollen.- Installieren und initialisieren Sie die gcloud CLI.
- Aktualisieren Sie die Komponenten:
gcloud components update
- Legen Sie Ihre Projekt-ID mit dem folgenden Befehl fest:
Ersetzen Sie PROJECT_ID durch die ID Ihres Google Cloud Projekts.gcloud config set project PROJECT_ID
Erforderliche Rollen
Bitten Sie Ihren Administrator, Ihnen die folgenden IAM-Rollen für Ihr Projekt zuzuweisen, damit Sie die Anleitung ausführen können:
-
Repository-Administrator für Artifact Registry (
roles/artifactregistry.repoAdmin) -
Cloud Build-Bearbeiter (
roles/cloudbuild.builds.editor) -
Cloud Run-Administrator (
roles/run.admin) -
Dienstkonten erstellen (
roles/iam.serviceAccountCreator) -
Cloud DNS-Administrator (
roles/dns.admin) -
Service Account User (
roles/iam.serviceAccountUser) -
Service Usage Consumer (
roles/serviceusage.serviceUsageConsumer)
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:
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.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.
Erstellen Sie einen Ordner mit dem Namen
workerund wechseln Sie in das Verzeichnis:mkdir worker cd workerErstellen Sie eine Datei mit dem Namen
setup_dns.shund 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 fiErstellen 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}/`); });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.jsErstellen 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:
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=defaultStellen Sie über SSH mit dem folgenden Befehl eine Verbindung zur Test-VM her:
gcloud compute ssh wp-test-vm --zone=us-central1-aRufen 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:3000Die 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:
- Wechseln Sie in der Google Cloud -Console zur Seite Ressourcen verwalten.
- Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf Löschen.
- Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Shut down (Beenden), um das Projekt zu löschen.
Anleitungsressourcen löschen
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.
Entfernen Sie die Standardkonfiguration der
gcloud-Region, die Sie bei der Einrichtung der Anleitung hinzugefügt haben:gcloud config unset run/regionEntfernen Sie die Projektkonfiguration:
gcloud config unset projectLöschen Sie andere Google Cloud Ressourcen, die in dieser Anleitung erstellt wurden:
Nächste Schritte
- Weitere Informationen zum Konfigurieren einer Direct VPC mit einem VPC-Netzwerk.
- Weitere Informationen zu Cloud Run-Worker-Pools.
- Weitere Cloud Run-Demos, Anleitungen und Beispiele entdecken