Tujuan
- Buat zona terkelola Cloud DNS untuk menghosting data bagi kumpulan pekerja Anda.
- Buat aplikasi Node.js untuk menangani traffic ingress melalui jaringan VPC.
- Deploy worker pool dengan ingress VPC Langsung untuk menetapkan alamat IP pribadi dari subnet ke instance pekerja Anda.
- Uji aplikasi Anda untuk mengakses alamat IP pribadi dari instance virtual machine (VM) di jaringan VPC yang sama.
Biaya
Dalam dokumen ini, Anda akan menggunakan komponen Google Cloudyang dapat ditagih berikut:
Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda,
gunakan kalkulator harga.
Sebelum memulai
- Login ke akun Google Cloud Anda. Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
-
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.
Aktifkan Cloud DNS, Cloud Run, Compute Engine, Artifact Registry, dan Cloud Build API.
Peran yang diperlukan untuk mengaktifkan API
Untuk mengaktifkan API, Anda memerlukan peran IAM Service Usage Admin (
roles/serviceusage.serviceUsageAdmin), yang berisi izinserviceusage.services.enable. Pelajari cara memberikan peran.- Instal dan lakukan inisialisasi gcloud CLI.
- Perbarui komponen:
gcloud components update
- Tetapkan project ID Anda dengan menjalankan perintah berikut:
Ganti PROJECT_ID dengan ID project Google Cloud Anda.gcloud config set project PROJECT_ID
Peran yang diperlukan
Untuk mendapatkan izin yang Anda perlukan untuk menyelesaikan tutorial, minta administrator Anda untuk memberi Anda peran IAM berikut di project Anda:
-
Administrator Repositori Artifact Registry (
roles/artifactregistry.repoAdmin) -
Editor Cloud Build (
roles/cloudbuild.builds.editor) -
Admin Cloud Run (
roles/run.admin) -
Buat Akun Layanan (
roles/iam.serviceAccountCreator) -
Admin Cloud DNS (
roles/dns.admin) -
Service Account User (
roles/iam.serviceAccountUser) -
Service Usage Consumer (
roles/serviceusage.serviceUsageConsumer)
Untuk mengetahui informasi selengkapnya tentang pemberian peran, lihat Mengelola akses ke project, folder, dan organisasi.
Anda mungkin juga bisa mendapatkan izin yang diperlukan melalui peran khusus atau peran bawaan lainnya.
Membuat akun layanan kustom
Buat akun layanan kustom dengan izin minimum yang diperlukan untuk mendaftarkan catatan DNS. Untuk menyiapkan akun layanan, lakukan hal berikut:
Buat akun layanan dengan menjalankan perintah berikut:
gcloud iam service-accounts create SERVICE_ACCOUNT_NAME \ --display-name="DNS Worker Pool Service Account"
Ganti SERVICE_ACCOUNT_NAME dengan nama untuk akun layanan kustom Anda, misalnya
dns-worker-sa.Berikan peran Admin Cloud DNS ke akun layanan:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/dns.admin"
Buat zona Cloud DNS
Buat zona terkelola Cloud DNS pribadi bernama test-wp untuk mendaftarkan IP instance pool pekerja Anda.
gcloud dns managed-zones create test-wp --description="new DNS zone for worker pools" --dns-name="workerpools.example.com." --visibility="private" --networks=default
Membuat aplikasi Node.js
Buat aplikasi Node.js yang mengambil alamat IP instance pool pekerja menggunakan server metadata, lalu mendaftarkannya ke Cloud DNS.
Buat folder bernama
workerdan ubah direktori ke dalamnya:mkdir worker cd workerBuat file bernama
setup_dns.shdan tambahkan skrip berikut yang berjalan saat instance kumpulan pekerja Anda dimulai. Skrip ini menggunakan nama host instance untuk membuat nama data DNS. Jika ada lebih dari satu instance, beberapa instance dapat menggunakan nama host yang sama sehingga menyebabkan pembuatan data DNS yang tumpang-tindih.#!/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 fiBuat file
server.jsdengan kode berikut untuk menangani ingress alamat IP pribadi:// 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}/`); });Buat skrip
start.shdengan kode berikut untuk melakukan penyiapan DNS terlebih dahulu, sebelum menjalankan aplikasi Node.js Anda:#!/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.jsBuat Dockerfile berikut untuk memaketkan aplikasi dalam image:
# 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 []
Men-deploy kumpulan pekerja dengan ingress VPC Langsung
Deploy kumpulan pekerja bernama test-cli-dns dan lampirkan ke jaringan VPC.
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
Ganti PROJECT_ID dengan project ID Google Cloud Anda dan SERVICE_ACCOUNT_NAME dengan nama akun layanan yang Anda buat.
Menguji aplikasi Anda
Kumpulan pekerja Cloud Run dengan ingress VPC Langsung dirancang untuk traffic khusus internal. Mereka tidak memiliki IP publik. Untuk memverifikasi fungsi ingress, ikuti
langkah-langkah berikut untuk menjalankan permintaan menggunakan curl dari VM Compute Engine yang dihosting di
jaringan dan subnet VPC yang sama:
Buat VM pengujian di jaringan dan region yang sama dengan kumpulan pekerja Anda:
gcloud compute instances create wp-test-vm \ --zone=us-central1-a \ --network=default \ --subnet=defaultHubungkan ke VM pengujian melalui SSH dengan menjalankan perintah berikut:
gcloud compute ssh wp-test-vm --zone=us-central1-aDari terminal VM, panggil layanan Anda di alamat IP pribadi instance kumpulan pekerja yang terdaftar dengan Cloud DNS:
curl http://localhost.workerpools.example.com:3000Anda akan melihat output:
Hello World!
Berhasil! Anda telah berhasil mengonfigurasi kumpulan pekerja Cloud Run dengan ingress VPC Langsung menggunakan alamat IP pribadi dan Cloud DNS.
Pembersihan
Agar tidak menimbulkan biaya tambahan pada akun Google Cloud Anda, hapus semua resource yang Anda deploy dengan tutorial ini.
Menghapus project
Jika Anda membuat project baru untuk tutorial ini, hapus project tersebut. Jika Anda menggunakan project yang ada dan perlu mempertahankannya tanpa perubahan yang Anda tambahkan dalam tutorial ini, hapus resource yang Anda buat untuk tutorial.
Cara termudah untuk menghilangkan penagihan adalah dengan menghapus project yang Anda buat untuk tutorial.
Untuk menghapus project:
- Di Konsol Google Cloud , buka halaman Manage resources.
- Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
- Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.
Menghapus resource tutorial
Hapus layanan Cloud Run yang Anda deploy dalam tutorial ini. Layanan Cloud Run tidak menimbulkan biaya hingga menerima permintaan.
Untuk menghapus layanan Cloud Run, jalankan perintah berikut:
gcloud run services delete SERVICE-NAME
Ganti SERVICE-NAME dengan nama layanan Anda.
Anda juga dapat menghapus layanan Cloud Run dari konsolGoogle Cloud .
Hapus konfigurasi region default
gcloudyang Anda tambahkan selama penyiapan tutorial:gcloud config unset run/regionHapus konfigurasi project:
gcloud config unset projectHapus resource Google Cloud lain yang dibuat dalam tutorial ini:
- Hapus kumpulan pekerja Cloud Run.
- Hapus image container kumpulan pekerja dari Artifact Registry.
- Hapus zona terkelola Cloud DNS.
Langkah berikutnya
- Pelajari lebih lanjut cara mengonfigurasi VPC Langsung dengan jaringan VPC.
- Pelajari lebih lanjut kumpulan pekerja Cloud Run.
- Pelajari demo, tutorial, dan contoh Cloud Run lainnya.