Tutorial ini menunjukkan cara membuat endpoint HTTP pribadi di cluster Google Kubernetes Engine (GKE) pribadi yang menerima peristiwa pesan Pub/Sub menggunakan Eventarc. Untuk mempelajari tujuan peristiwa ini lebih lanjut, lihat artikel Merutekan peristiwa ke endpoint HTTP internal dalam jaringan VPC.
Cluster GKE pribadi adalah jenis cluster native Virtual Private Cloud (VPC) tempat node hanya memiliki alamat IP internal, yang berarti node dan Pod diisolasi dari internet secara default. Anda dapat memilih untuk tidak memiliki akses klien, akses terbatas, atau akses tidak terbatas ke bidang kontrol. Anda tidak dapat mengonversi cluster non-pribadi yang ada menjadi cluster pribadi. Untuk mengetahui informasi selengkapnya, lihat Tentang cluster pribadi.
Anda dapat menjalankan perintah berikut menggunakan Google Cloud CLI di terminal atau Cloud Shell.
Tujuan
Dalam tutorial ini, Anda akan:
- Buat subnet khusus proxy di jaringan VPC default, dan buat aturan firewall VPC.
- Buat cluster GKE Autopilot pribadi tanpa akses klien ke endpoint publik.
- Buat instance virtual machine (VM) Compute Engine di subnet jaringan VPC yang ditentukan.
- Buat koneksi SSH ke instance VM dan deploy layanan penerima peristiwa di instance VM.
- Deploy Gateway di cluster Anda dan manifes
HTTPRoute
untuk mengonfigurasi rute traffic di Kubernetes ke backend aplikasi. - Buat lampiran jaringan yang memungkinkan jaringan VPC produsen memulai koneksi ke jaringan VPC konsumen.
- Buat pemicu Eventarc yang merutekan peristiwa Pub/Sub ke penerima peristiwa di instance VM Anda.
- Publikasikan pesan ke topik Pub/Sub untuk membuat peristiwa, dan lihat isi peristiwa di log Pod aplikasi.
Biaya
Dalam dokumen ini, Anda akan menggunakan komponen Google Cloudyang dapat ditagih berikut:
Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda,
gunakan kalkulator harga.
Setelah menyelesaikan tugas yang dijelaskan dalam dokumen ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, lihat Pembersihan.
Sebelum memulai
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Resource Manager, Compute Engine, Eventarc, GKE, and Pub/Sub APIs:
gcloud services enable compute.googleapis.com
container.googleapis.com cloudresourcemanager.googleapis.com eventarc.googleapis.com pubsub.googleapis.com - Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Resource Manager, Compute Engine, Eventarc, GKE, and Pub/Sub APIs:
gcloud services enable compute.googleapis.com
container.googleapis.com cloudresourcemanager.googleapis.com eventarc.googleapis.com pubsub.googleapis.com - Update komponen Google Cloud CLI:
gcloud components update
- Login menggunakan akun Anda:
gcloud auth login
-
Jika Anda adalah project creator, Anda diberi peran Pemilik dasar (
roles/owner
). Secara default, peran Identity and Access Management (IAM) ini mencakup izin yang diperlukan untuk akses penuh ke sebagian besar resource Google Cloud dan Anda dapat melewati langkah ini.Jika Anda bukan project creator, izin yang diperlukan harus diberikan pada project kepada akun utama yang sesuai. Misalnya, akun utama dapat berupa Akun Google (untuk pengguna akhir) atau akun layanan (untuk aplikasi dan workload komputasi). Untuk mengetahui informasi selengkapnya, lihat halaman eran dan izin untuk tujuan peristiwa Anda.
Izin yang diperlukan
Untuk mendapatkan izin yang Anda perlukan untuk menyelesaikan panduan memulai ini, minta administrator untuk memberi Anda peran IAM berikut di project Anda:
-
Compute Network Admin (
roles/compute.networkAdmin
) -
Compute Security Admin (
roles/compute.securityAdmin
) -
Eventarc Admin (
roles/eventarc.admin
) -
Kubernetes Engine Admin (
roles/container.admin
) -
Logs View Accessor (
roles/logging.viewAccessor
) -
Project IAM Admin (
roles/resourcemanager.projectIamAdmin
) -
Pub/Sub Publisher (
roles/pubsub.publisher
) -
Service Account Admin (
roles/iam.serviceAccountAdmin
) -
Service Account User (
roles/iam.serviceAccountUser
) -
Service Usage Admin (
roles/serviceusage.serviceUsageAdmin
)
Untuk mengetahui informasi selengkapnya tentang cara memberikan peran, lihat Mengelola akses ke project, folder, dan organisasi.
Anda mungkin juga bisa mendapatkan izin yang diperlukan melalui peran khusus atau peran bawaan lainnya.
-
Compute Network Admin (
Catat akun layanan default Compute Engine karena Anda akan melampirkan akun tersebut ke pemicu Eventarc untuk merepresentasikan identitas pemicu untuk tujuan pengujian. Akun layanan ini dibuat secara otomatis setelah mengaktifkan atau menggunakan Google Cloud layanan yang menggunakan Compute Engine, dan dengan format email berikut:
PROJECT_NUMBER-compute@developer.gserviceaccount.com
Ganti
PROJECT_NUMBER
dengan Google Cloudnomor project Anda. Anda dapat menemukan nomor project di halaman Selamat Datang pada Konsol Google Cloud atau dengan menjalankan perintah berikut:gcloud projects describe PROJECT_ID --format='value(projectNumber)'
Untuk lingkungan produksi, sebaiknya buat akun layanan baru dan berikan satu atau beberapa peran IAM yang berisi izin minimum yang diperlukan dan ikuti prinsip hak istimewa terendah.
- Jika Anda mengaktifkan agen layanan Cloud Pub/Sub pada atau sebelum
8 April 2021, untuk mendukung permintaan push Pub/Sub yang diautentikasi, berikan
peran
Service Account Token Creator (
roles/iam.serviceAccountTokenCreator
) ke agen layanan. Jika tidak, peran ini akan diberikan secara default:gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \ --role=roles/iam.serviceAccountTokenCreator
Membuat subnet khusus proxy
Kecuali jika Anda membuat kebijakan organisasi yang melarang beberapa jaringan VPC, project baru dimulai dengan jaringan default (jaringan VPC mode otomatis) yang memiliki satu subnetwork (subnet) di setiap region. Setiap jaringan VPC terdiri dari satu atau beberapa rentang alamat IP yang disebut subnet. Subnet adalah resource regional, dan memiliki rentang alamat IP yang terkait dengannya.
Gunakan perintah
gcloud compute networks subnets create
untuk membuat subnet khusus proxy di jaringan default.gcloud compute networks subnets create proxy-only-subnet \ --purpose=REGIONAL_MANAGED_PROXY \ --role=ACTIVE \ --region=us-central1 \ --network=default \ --range=10.10.10.0/24
Perhatikan bahwa subnet dengan
purpose=REGIONAL_MANAGED_PROXY
dicadangkan untuk load balancer berbasis Envoy dan bahwarange
harus menyediakan 64 alamat IP atau lebih.Buat aturan firewall yang cocok dengan rentang subnet khusus proxy dan mengizinkan traffic di port TCP 8080.
gcloud compute firewall-rules create allow-proxy-connection \ --allow tcp:8080 \ --source-ranges 10.10.10.0/24 \ --network=default
Membuat cluster GKE pribadi
Gunakan perintah gcloud container clusters create-auto
untuk membuat cluster GKE pribadi dalam
mode Autopilot
yang memiliki node pribadi, dan tidak memiliki akses klien ke endpoint publik.
Contoh berikut membuat cluster GKE pribadi bernama
private-cluster
dan juga membuat subnet bernama my-subnet
:
gcloud container clusters create-auto private-cluster \
--create-subnetwork name=my-subnet \
--enable-master-authorized-networks \
--enable-private-nodes \
--enable-private-endpoint \
--region=us-central1
Perhatikan hal berikut:
--enable-master-authorized-networks
menentukan bahwa akses ke endpoint publik dibatasi untuk rentang alamat IP yang Anda otorisasi.--enable-private-nodes
menunjukkan bahwa node cluster tidak memiliki alamat IP eksternal.--enable-private-endpoint
menunjukkan bahwa cluster dikelola menggunakan alamat IP internal endpoint API bidang kontrol.
Mungkin perlu waktu beberapa menit hingga pembuatan cluster selesai. Setelah
cluster dibuat, output akan menunjukkan bahwa status cluster
adalah RUNNING
.
Membuat instance VM di subnet yang ditentukan
Instance VM Compute Engine adalah virtual machine yang dihosting di infrastruktur Google. Istilah instance Compute Engine, instance VM, dan VM adalah istilah yang sama dan digunakan secara bergantian. Instance VM mencakup cluster GKE, instance lingkungan fleksibel App Engine, dan produk Google Cloud lainnya yang di-build di VM Compute Engine.
Gunakan perintah gcloud compute instances create
untuk membuat instance VM Compute Engine di subnet yang Anda buat
sebelumnya. Lampirkan akun layanan dan tetapkan cakupan akses VM ke cloud-platform
.
gcloud compute instances create my-vm \
--service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com \
--scopes=https://www.googleapis.com/auth/cloud-platform \
--zone=us-central1-a \
--subnet=my-subnet
Untuk mengetahui informasi selengkapnya, baca Membuat dan memulai instance VM.
Men-deploy penerima peristiwa di VM
Dengan menggunakan image bawaan, us-docker.pkg.dev/cloudrun/container/hello
, deploy layanan di VM Anda yang memproses di port 80, serta menerima dan mencatat peristiwa ke dalam log.
Buat koneksi SSH ke instance VM Anda dengan menjalankan perintah berikut:
gcloud compute ssh my-vm --project=PROJECT_ID --zone=us-central1-a
Setelah koneksi ke server SSH dibuat, jalankan perintah yang tersisa di instance VM Anda.
Jika perlu, instal
kubectl
dan plugin yang diperlukan.Dari instance VM, gunakan perintah
get-credentials
agarkubectl
dapat berfungsi dengan cluster yang Anda buat.gcloud container clusters get-credentials private-cluster \ --region=us-central1 \ --internal-ip
Gunakan perintah Kubernetes,
kubectl create deployment
, untuk men-deploy aplikasi ke cluster.kubectl create deployment hello-app \ --image=us-docker.pkg.dev/cloudrun/container/hello
Tindakan ini akan membuat Deployment bernama
hello-app
. Pod Deployment akan menjalankan image containerhello
.Setelah men-deploy aplikasi, Anda dapat mengekspos aplikasi ke traffic dengan membuat Layanan Kubernetes. Jalankan perintah
kubectl expose
berikut:kubectl expose deployment hello-app \ --type ClusterIP \ --port 80 \ --target-port 8080
Anda akan melihat
service/hello-app exposed
dalam output.Anda dapat mengabaikan pesan apa pun yang mirip dengan yang berikut ini:
E0418 14:15:33.970933 1129 memcache.go:287] couldn't get resource list for metrics.k8s.io/v1beta1: the server is currently unable to handle the request
Mengonfigurasi perutean traffic Kubernetes
Resource Gateway merepresentasikan bidang data yang merutekan traffic di Kubernetes. Gateway dapat merepresentasikan berbagai jenis load balancing dan pemilihan rute, bergantung pada GatewayClass tempat gateway berasal. Untuk mengetahui informasi selengkapnya, lihat
Men-deploy Gateway.
Manifes HTTPRoute
di-deploy untuk membuat Rute dan mengirim traffic ke
backend aplikasi.
Deploy Gateway di cluster Anda.
kubectl apply -f - <<EOF kind: Gateway apiVersion: gateway.networking.k8s.io/v1beta1 metadata: name: internal-http spec: gatewayClassName: gke-l7-rilb listeners: - name: http protocol: HTTP port: 80 EOF
Perhatikan hal berikut:
gatewayClassName: gke-l7-rilb
menentukan GatewayClass yang menjadi sumber Gateway ini.gke-l7-rilb
sesuai dengan Load Balancer Aplikasi internal.port: 80
menentukan bahwa Gateway hanya mengekspos port 80 untuk memproses traffic HTTP.
Validasi bahwa Gateway telah di-deploy dengan benar. Mungkin diperlukan waktu beberapa menit untuk men-deploy semua resource-nya.
kubectl describe gateways.gateway.networking.k8s.io internal-http
Outputnya mirip dengan hal berikut ini:
Name: internal-http Namespace: default ... API Version: gateway.networking.k8s.io/v1beta1 Kind: Gateway ... Spec: Gateway Class Name: gke-l7-rilb Listeners: Allowed Routes: Namespaces: From: Same Name: http Port: 80 Protocol: HTTP Status: Addresses: Type: IPAddress Value: 10.36.172.5 ... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ADD 80s sc-gateway-controller default/internal-http Normal UPDATE 20s (x3 over 80s) sc-gateway-controller default/internal-http Normal SYNC 20s sc-gateway-controller SYNC on default/internal-http was a success
Deploy manifes
HTTPRoute
untuk merutekan traffic HTTP ke layananhello-app
di port 80.kubectl apply -f - <<EOF kind: HTTPRoute apiVersion: gateway.networking.k8s.io/v1beta1 metadata: name: hello-app-route spec: parentRefs: - kind: Gateway name: internal-http rules: - backendRefs: - name: hello-app port: 80 EOF
Membuat lampiran jaringan
Lampiran jaringan adalah resource yang memungkinkan jaringan VPC produsen memulai koneksi ke jaringan VPC konsumen melalui antarmuka Private Service Connect.
Untuk memublikasikan peristiwa, Eventarc menggunakan lampiran jaringan untuk membangun koneksi ke endpoint HTTP internal yang dihosting di jaringan VPC.
Anda dapat membuat lampiran jaringan yang otomatis menerima koneksi dari antarmuka Private Service Connect mana pun yang merujuk ke lampiran jaringan. Buat lampiran jaringan di jaringan dan region yang sama yang berisi layanan tujuan HTTP.
gcloud compute network-attachments create my-network-attachment \ --region=us-central1 \ --subnets=my-subnet\ --connection-preference=ACCEPT_AUTOMATIC
Untuk mengetahui informasi selengkapnya, lihat Tentang lampiran jaringan.
Membuat pemicu Eventarc
Buat pemicu Eventarc yang membuat topik Pub/Sub baru dan merutekan peristiwa ke penerima peristiwa yang di-deploy di VM saat pesan dipublikasikan ke topik Pub/Sub.
Ambil alamat Gateway.
GATEWAY_ADDRESS=$(kubectl get gateways.gateway.networking.k8s.io internal-http -o=jsonpath="{.status.addresses[0].value}")
Buat pemicu.
gcloud eventarc triggers create my-trigger \ --location=us-central1 \ --destination-http-endpoint-uri="http://$GATEWAY_ADDRESS:80/" \ --network-attachment="projects/PROJECT_ID/regions/us-central1/networkAttachments/my-network-attachment" \ --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \ --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com
Ganti
PROJECT_NUMBER
dengan Google Cloudnomor project Anda. Anda dapat menemukan nomor project di halaman Selamat Datang pada Konsol Google Cloud atau dengan menjalankan perintah berikut:gcloud projects describe PROJECT_ID --format='value(projectNumber)'
Untuk informasi selengkapnya tentang cara mengonfigurasi pemicu, lihat Merutekan peristiwa ke endpoint HTTP internal dalam jaringan VPC.
Membuat dan melihat peristiwa topik Pub/Sub
Anda dapat membuat peristiwa dengan memublikasikan pesan ke topik Pub/Sub.
Cari dan tetapkan topik Pub/Sub sebagai variabel lingkungan.
export MY_TOPIC=$(gcloud eventarc triggers describe my-trigger \ --location=us-central1 \ --format='value(transport.pubsub.topic)')
Publikasikan pesan ke topik Pub/Sub untuk membuat peristiwa.
gcloud pubsub topics publish $MY_TOPIC --message "Hello World"
Pemicu Eventarc merutekan peristiwa ke endpoint HTTP internal di cluster GKE pribadi.
Periksa log Pod aplikasi dan verifikasi pengiriman peristiwa.
POD_NAME=$(kubectl get pod --selector app=hello-app --output=name) kubectl logs $POD_NAME
Isi peristiwa harus mirip dengan berikut ini:
2024/04/18 20:31:43 Hello from Cloud Run! The container started successfully and is listening for HTTP requests on $PORT {"severity":"INFO","eventType":"google.cloud.pubsub.topic.v1.messagePublished","message":"Received event of type google.cloud.pubsub.topic.v1.messagePublished. Event data: Hello World","event":{"specversion":"1.0","id":"10935738681111260","source":"//pubsub.googleapis.com/projects/my-project/topics/eventarc-us-central1-my-trigger-224","type":"google.cloud.pubsub.topic.v1.messagePublished","datacontenttype":"application/json","time":"2024-04-18T20:40:03Z","data": {"message":{"data":"SGVsbG8gV29ybGQ=","messageId":"10935738681111260","publishTime":"2024-04-18T20:40:03Z"}}}}
Anda telah berhasil men-deploy layanan penerima peristiwa ke endpoint HTTP internal di cluster GKE pribadi, membuat pemicu Eventarc, membuat peristiwa dari Pub/Sub, dan mengonfirmasi bahwa peristiwa dirutekan seperti yang diharapkan oleh pemicu ke endpoint target.
Pembersihan
Agar tidak perlu membayar biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource tersebut, atau simpan project dan hapus setiap resource.
Menghapus project
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID
Menghapus resource satu per satu
- Hapus pemicu Eventarc:
gcloud eventarc triggers delete my-trigger --location=us-central1
- Keluar dari VM, lalu hapus instance VM:
gcloud compute instances delete my-vm --zone=us-central1-a
- Hapus lampiran jaringan:
gcloud compute network-attachments delete my-network-attachment --region=us-central1
- Hapus aturan firewall:
gcloud compute firewall-rules delete allow-proxy-connection
- Hapus cluster:
gcloud container clusters delete private-cluster --region=us-central1
- Delete the subnet:
gcloud compute networks subnets delete proxy-only-subnet --region=us-central1