Menyalurkan traffic dari beberapa region

Anda menampilkan respons yang lebih cepat kepada pengguna Anda di seluruh dunia dengan men-deploy layanan di beberapa region dan merutekan pengguna Anda ke region terdekat. Men-deploy di beberapa region akan memberikan latensi rendah dan ketersediaan yang lebih tinggi jika terjadi pemadaman layanan regional.

Karena layanan Cloud Run di-deploy ke setiap region, Anda perlu men-deploy layanan ke beberapa region, lalu mengonfigurasi load balancing global untuk layanan tersebut.

Men-deploy layanan ke beberapa region

Anda dapat men-deploy layanan yang sama ke beberapa region menggunakan salah satu metode berikut:

Men-deploy layanan multi-region

Bagian ini menunjukkan cara men-deploy dan mengonfigurasi layanan multi-region dari satu perintah gcloud CLI atau file YAML.

gcloud

  • Untuk membuat dan men-deploy layanan multi-region, jalankan perintah gcloud beta run deploy menggunakan flag --regions:

    gcloud beta run deploy SERVICE_NAME \
      --image=IMAGE_URL \
      --regions=REGIONS

    Ganti kode berikut:

    • SERVICE_NAME: Nama layanan multi-region yang ingin Anda deploy.
    • IMAGE_URL: Referensi ke image container, misalnya, us-docker.pkg.dev/cloudrun/container/hello:latest.
    • REGIONS: Daftar beberapa region tempat Anda ingin men-deploy. Contoh, us-central1,asia-east1.

YAML

  1. Buat file YAML untuk layanan Anda, menggunakan atribut run.googleapis.com/regions untuk menetapkan beberapa wilayah tempat Anda ingin men-deploy layanan:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE_NAME
      annotations:
        run.googleapis.com/launch-stage: BETA
        run.googleapis.com/regions: REGIONS
    spec:
      template:
        spec:
          containers:
          - image: IMAGE_URL

    Ganti kode berikut:

    • SERVICE_NAME: Nama layanan multi-region yang ingin Anda deploy.
    • REGIONS: Daftar beberapa region yang ingin Anda perbarui. Contoh, us-central1,asia-east1.
    • IMAGE_URL: Referensi ke image container, misalnya, us-docker.pkg.dev/cloudrun/container/hello:latest.
  2. Buat layanan menggunakan perintah berikut:

    gcloud beta run multi-region-services replace service.yaml

Mengupdate layanan multi-region

Bagian ini menunjukkan cara menambahkan atau menghapus region dari layanan multi-region dari satu perintah gcloud CLI atau file YAML.

gcloud

Untuk menambahkan atau menghapus region dari layanan multi-region, jalankan perintah gcloud beta run multi-region-services update.

  • Untuk menambahkan layanan multi-region ke satu atau beberapa region tambahan, gunakan flag --add-regions:

    gcloud beta run multi-region-services update SERVICE_NAME \
      --add-regions=REGIONS
  • Untuk menghapus layanan multi-region dari satu atau beberapa region, gunakan flag --remove-regions:

    gcloud beta run multi-region-services update SERVICE_NAME \
      --remove-regions=REGIONS

    Ganti kode berikut:

    • SERVICE_NAME: Nama layanan multi-region yang ingin Anda perbarui.
    • REGIONS: Region tempat Anda ingin menambahkan atau menghapus layanan. Contoh, us-central1,asia-east1.

YAML

  1. Untuk mengupdate layanan multi-region yang ada, download konfigurasi YAML-nya:

    gcloud beta run multi-region-services describe SERVICE_NAME --format export > service.yaml
  2. Perbarui atribut run.googleapis.com/regions untuk menambahkan atau menghapus daftar wilayah tempat Anda ingin layanan di-deploy:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE_NAME
      annotations:
        run.googleapis.com/launch-stage: BETA
        run.googleapis.com/regions: REGIONS

    Ganti kode berikut:

    • SERVICE_NAME: Nama layanan multi-region yang ingin Anda deploy.
    • REGIONS: Daftar baru beberapa region yang ingin Anda deploy revisi layanannya.
  3. Update layanan menggunakan perintah berikut:

    gcloud beta run multi-region-services replace service.yaml

Menghapus layanan multi-region

  • Untuk menghapus layanan multi-region, jalankan perintah gcloud beta run multi-region-services delete:

    gcloud beta run multi-region-services delete SERVICE_NAME

    Ganti SERVICE_NAME dengan nama layanan multi-region yang ingin Anda hapus.

Mengonfigurasi load balancing global

Bagian ini menunjukkan cara mengonfigurasi Load Balancer Aplikasi eksternal dengan domain yang diamankan dengan sertifikat TLS yang terkelola yang mengarah ke alamat IP anycast global, yang merutekan pengguna ke pusat data Google terdekat tempat layanan Anda di-deploy.

Arsitektur yang dijelaskan di bagian berikut tidak secara otomatis merutekan permintaan ke region yang berbeda saat layanan Cloud Run regional menjadi tidak responsif atau menampilkan error. Untuk meningkatkan ketersediaan layanan multi-region Anda, Anda dapat mengonfigurasi pendeteksi pencilan untuk mengidentifikasi layanan Cloud Run yang tidak responsif berdasarkan tingkat error HTTP-nya dan membagi beberapa permintaan ke region yang lain.

Membuat load balancer

Pembuatan load balancer eksternal melibatkan pembuatan berbagai resource jaringan dan menghubungkannya bersama-sama:

gcloud CLI

  1. Cadangkan alamat IP statis sehingga Anda tidak perlu memperbarui Data DNS saat Anda membuat ulang load balancer Anda.
    gcloud compute addresses create --global SERVICE_IP
    Pada perintah di atas, ganti SERVICE_IP dengan nama untuk resource alamat IP (misalnya myservice-ip).

    Alamat IP ini adalah alamat IPv4 anycast global yang merutekan ke pusat data Google atau titik kehadiran yang terdekat dengan pengunjung Anda.

  2. Buat layanan backend.
    gcloud compute backend-services create --global BACKEND_NAME

    Pada perintah di atas, ganti BACKEND_NAME dengan nama yang ingin Anda berikan kepada layanan backend (contohnya myservice-backend).

  3. Membuat peta URL.
    gcloud compute url-maps create URLMAP_NAME --default-service=BACKEND_NAME

    Ganti URLMAP_NAME dengan nama yang ingin Anda berikan ke peta URL (contohnya myservice-urlmap).

  4. Buat sertifikat TLS yang terkelola untuk domain Anda guna menyalurkan traffic HTTPS. (Ganti example.com dengan nama domain Anda.)
    gcloud compute ssl-certificates create CERT_NAME \
      --domains=example.com

    Ganti CERT_NAME dengan nama yang Anda inginkan untuk sertifikat SSL yang terkelola (contohnya myservice-cert).

  5. Buat proxy HTTPS target.
    gcloud compute target-https-proxies create HTTPS_PROXY_NAME \
      --ssl-certificates=CERT_NAME \
      --url-map=URLMAP_NAME

    Ganti HTTPS_PROXY_NAME dengan nama yang ingin Anda berikan ke proxy HTTPS target (contohnya myservice-https).

  6. Buat aturan penerusan yang menghubungkan resource jaringan yang Anda buat ke alamat IP.
    gcloud compute forwarding-rules create --global FORWARDING_RULE_NAME \
      --target-https-proxy=HTTPS_PROXY_NAME \
      --address=SERVICE_IP \
      --ports=443

    Ganti FORWARDING_RULE_NAME dengan nama resource aturan penerusan yang ingin Anda buat (contohnya myservice-lb).

Terraform

Selain langkah-langkah yang dijelaskan di bagian ini, Anda dapat menggunakan Modul Terraform Load Balancer HTTP Global.

Tambahkan kode berikut ke file Terraform Anda (misalnya main.tf):

  1. Konfigurasikan alamat IP:

    resource "google_compute_global_address" "lb_default" {
      provider = google-beta
      name     = "myservice-service-ip"
    
      # Use an explicit depends_on clause to wait until API is enabled
      depends_on = [
        google_project_service.compute_api
      ]
    }
    output "load_balancer_ip_addr" {
      value = google_compute_global_address.lb_default.address
    }

    Konfigurasikan nama resource alamat IP Anda menjadi myservice-service-ip. Anda dapat mengubahnya ke nilai Anda sendiri. Alamat IP ini adalah alamat IPv4 anycast global yang dirutekan ke pusat data Google atau titik kehadiran yang terdekat dengan pengunjung Anda.

  2. Buat dan konfigurasikan layanan backend:

    resource "google_compute_backend_service" "lb_default" {
      provider              = google-beta
      name                  = "myservice-backend"
      load_balancing_scheme = "EXTERNAL_MANAGED"
    
      backend {
        group = google_compute_region_network_endpoint_group.lb_default[0].id
      }
    
      backend {
        group = google_compute_region_network_endpoint_group.lb_default[1].id
      }
    
      # Use an explicit depends_on clause to wait until API is enabled
      depends_on = [
        google_project_service.compute_api,
      ]
    }

    Resource ini mengonfigurasi layanan backend agar diberi nama myservice-backend. Anda dapat mengubahnya ke nilai Anda sendiri.

  3. Konfigurasikan peta URL:

    resource "google_compute_url_map" "lb_default" {
      provider        = google-beta
      name            = "myservice-lb-urlmap"
      default_service = google_compute_backend_service.lb_default.id
    
      path_matcher {
        name            = "allpaths"
        default_service = google_compute_backend_service.lb_default.id
        route_rules {
          priority = 1
          url_redirect {
            https_redirect         = true
            redirect_response_code = "MOVED_PERMANENTLY_DEFAULT"
          }
        }
      }
    }

    Hubungkan resource layanan backend (myservice-backend) ke resource peta URL baru (myservice-lb-urlmap). Anda dapat mengubahnya ke nilai Anda sendiri.

  4. Buat sertifikat TLS yang terkelola untuk domain Anda guna menyalurkan traffic HTTPS. Ganti example.com dengan nama domain Anda di resource google_compute_managed_ssl_certificate:

    resource "google_compute_managed_ssl_certificate" "lb_default" {
      provider = google-beta
      name     = "myservice-ssl-cert"
    
      managed {
        domains = ["example.com"]
      }
    }
  5. Konfigurasikan proxy HTTPS:

    resource "google_compute_target_https_proxy" "lb_default" {
      provider = google-beta
      name     = "myservice-https-proxy"
      url_map  = google_compute_url_map.lb_default.id
      ssl_certificates = [
        google_compute_managed_ssl_certificate.lb_default.name
      ]
      depends_on = [
        google_compute_managed_ssl_certificate.lb_default
      ]
    }

    Buat resource google_compute_target_https_proxy dengan nama target myservice-https-proxy dan hubungkan sertifikat TLS (myservice-ssl-cert) dan resource pemetaan URL (myservice-lb-urlmap) yang dibuat sebelumnya. Anda dapat mengubahnya ke nilai Anda sendiri.

  6. Konfigurasikan aturan penerusan:

    resource "google_compute_global_forwarding_rule" "lb_default" {
      provider              = google-beta
      name                  = "myservice-lb-fr"
      load_balancing_scheme = "EXTERNAL_MANAGED"
      target                = google_compute_target_https_proxy.lb_default.id
      ip_address            = google_compute_global_address.lb_default.id
      port_range            = "443"
      depends_on            = [google_compute_target_https_proxy.lb_default]
    }

    Buat resource google_compute_global_forwarding_rule dengan nama target myservice-https-proxy dan hubungkan target proxy HTTPS (myservice-https-proxy) dan resource alamat IP (myservice-service-ip) yang dibuat sebelumnya. Anda dapat mengubahnya ke nilai Anda sendiri.

  7. Terapkan konfigurasi ini:

    Untuk menerapkan konfigurasi Terraform di project Google Cloud, selesaikan langkah-langkah di bagian berikut.

    Menyiapkan Cloud Shell

    1. Luncurkan Cloud Shell.
    2. Tetapkan project Google Cloud default tempat Anda ingin menerapkan konfigurasi Terraform.

      Anda hanya perlu menjalankan perintah ini sekali per project, dan dapat dijalankan di direktori mana pun.

      export GOOGLE_CLOUD_PROJECT=PROJECT_ID

      Variabel lingkungan akan diganti jika Anda menetapkan nilai eksplisit dalam file konfigurasi Terraform.

    Menyiapkan direktori

    Setiap file konfigurasi Terraform harus memiliki direktorinya sendiri (juga disebut modul root).

    1. Di Cloud Shell, buat direktori dan file baru di dalam direktori tersebut. Nama file harus memiliki ekstensi .tf—misalnya main.tf. Dalam tutorial ini, file ini disebut sebagai main.tf.
      mkdir DIRECTORY && cd DIRECTORY && touch main.tf
    2. Jika mengikuti tutorial, Anda dapat menyalin kode contoh di setiap bagian atau langkah.

      Salin kode contoh ke dalam main.tf yang baru dibuat.

      Atau, salin kode dari GitHub. Tindakan ini direkomendasikan jika cuplikan Terraform adalah bagian dari solusi menyeluruh.

    3. Tinjau dan ubah contoh parameter untuk diterapkan pada lingkungan Anda.
    4. Simpan perubahan Anda.
    5. Lakukan inisialisasi Terraform. Anda hanya perlu melakukan ini sekali per direktori.
      terraform init

      Secara opsional, untuk menggunakan versi penyedia Google terbaru, sertakan opsi -upgrade:

      terraform init -upgrade

    Menerapkan perubahan

    1. Tinjau konfigurasi dan pastikan resource yang akan dibuat atau diupdate oleh Terraform sesuai yang Anda inginkan:
      terraform plan

      Koreksi konfigurasi jika diperlukan.

    2. Terapkan konfigurasi Terraform dengan menjalankan perintah berikut dan memasukkan yes pada prompt:
      terraform apply

      Tunggu hingga Terraform menampilkan pesan "Apply complete!".

    3. Buka project Google Cloud Anda untuk melihat hasilnya. Di Konsol Google Cloud, buka resource Anda di UI untuk memastikan bahwa Terraform telah membuat atau mengupdatenya.

Mengonfigurasi grup endpoint jaringan regional

Untuk setiap region tempat Anda men-deploy di langkah sebelumnya, Anda harus membuat grup endpoint jaringan tanpa server (NEG) dan menambahkannya ke layanan backend menggunakan petunjuk berikut:

gcloud CLI

  1. Buat grup endpoint jaringan untuk layanan Cloud Run di REGION:

    gcloud compute network-endpoint-groups create NEG_NAME \
      --region=REGION \
      --network-endpoint-type=SERVERLESS \
      --cloud-run-service=SERVICE_NAME

    Ganti kode berikut:

    • NEG_NAME dengan nama resource grup endpoint jaringan. (contohnya `myservice-neg-uscentral1`)
    • REGION dengan [region][loc] tempat layanan Anda di-deploy.
    • SERVICE_NAME dengan nama layanan Anda.
  2. Tambahkan grup endpoint jaringan ke layanan backend:

    gcloud compute backend-services add-backend --global BACKEND_NAME \
      --network-endpoint-group-region=REGION \
      --network-endpoint-group=NEG_NAME

    Tentukan NEG_NAME yang Anda buat di langkah sebelumnya untuk region.

  3. Ulangi langkah-langkah sebelumnya untuk setiap region.

Terraform

  1. Konfigurasikan grup endpoint jaringan dengan nama myservice-neg untuk layanan Cloud Run bagi setiap region yang ditentukan dalam variabel run_regions:

    resource "google_compute_region_network_endpoint_group" "lb_default" {
      provider              = google-beta
      count                 = length(local.run_regions)
      name                  = "myservice-neg"
      network_endpoint_type = "SERVERLESS"
      region                = local.run_regions[count.index]
      cloud_run {
        service = google_cloud_run_v2_service.run_default[count.index].name
      }
    }
  2. Konfigurasikan layanan backend untuk menyertakan grup endpoint jaringan (myservice-neg):

    resource "google_compute_backend_service" "lb_default" {
      provider              = google-beta
      name                  = "myservice-backend"
      load_balancing_scheme = "EXTERNAL_MANAGED"
    
      backend {
        group = google_compute_region_network_endpoint_group.lb_default[0].id
      }
    
      backend {
        group = google_compute_region_network_endpoint_group.lb_default[1].id
      }
    
      # Use an explicit depends_on clause to wait until API is enabled
      depends_on = [
        google_project_service.compute_api,
      ]
    }

Mengonfigurasi data DNS di domain Anda

Untuk mengarahkan nama domain Anda ke aturan penerusan yang Anda buat, perbarui data DNS-nya dengan alamat IP yang Anda buat.

  1. Temukan alamat IP yang dicadangkan dari load balancer dengan menjalankan perintah berikut:

    gcloud compute addresses describe \
      --global SERVICE_IP \
      --format='value(address)'

    Ganti SERVICE_IP dengan nama alamat IP yang Anda buat sebelumnya. Perintah ini akan mencetak alamat IP ke output.

  2. Update data DNS domain Anda dengan menambahkan kumpulan data A menggunakan alamat IP ini.

Mengonfigurasi audiens kustom jika menggunakan layanan terautentikasi

Layanan terautentikasi dilindungi oleh IAM. Layanan Cloud Run tersebut memerlukan autentikasi klien yang mendeklarasikan penerima permintaan yang dituju pada waktu pembuatan kredensial (audiens).

Audiens biasanya merupakan URL lengkap layanan target, yang secara default bagi layanan Cloud Run adalah URL yang dihasilkan dengan akhiran run.app. Namun, dalam deployment multi-region, klien tidak dapat mengetahui terlebih dahulu ke layanan regional mana permintaan akan dirutekan. Jadi, untuk deployment multi-region, konfigurasikan layanan Anda untuk menggunakan audiens kustom.

Menunggu load balancer tersedia

Setelah mengonfigurasi domain dengan alamat IP load balancer, tunggu data DNS diterapkan. Demikian pula, tunggu hingga sertifikat TLS yang terkelola diterbitkan untuk domain Anda dan siap untuk mulai menyalurkan traffic HTTPS secara global.

Mungkin perlu waktu hingga 30 menit agar load balancer mulai menyalurkan traffic.

Setelah siap, buka URL situs Anda dengan awalan https:// untuk mencobanya.

Verifikasi status

  1. Untuk memeriksa status penerapan data DNS, gunakan aplikasi utilitas command line dig:

    dig A +short example.com

    Output akan menampilkan alamat IP yang Anda konfigurasikan di data DNS Anda.

  2. Periksa status penerbitan sertifikat Anda yang terkelola dengan menjalankan perintah berikut:

    gcloud compute ssl-certificates describe CERT_NAME

    Ganti CERT_NAME dengan nama yang sebelumnya Anda pilih untuk resource sertifikat SSL.

    Output menampilkan baris yang berisi status: ACTIVE.

Menyiapkan pengalihan HTTP-ke-HTTPS

Secara default, aturan penerusan hanya menangani satu protokol, sehingga permintaan ke endpoint http:// Anda merespons dengan pesan "404 Not Found". Jika Anda memerlukan permintaan ke URL http:// Anda agar dialihkan ke protokol https://, buat peta URL tambahan dan aturan penerusan menggunakan petunjuk berikut:

gcloud CLI

  1. Buat peta URL dengan aturan pengalihan.

    gcloud compute url-maps import HTTP_URLMAP_NAME \
      --global \
      --source /dev/stdin <<EOF
            name: HTTP_URLMAP_NAME
            defaultUrlRedirect:
              redirectResponseCode: MOVED_PERMANENTLY_DEFAULT
              httpsRedirect: True
            EOF

    Ganti HTTP_URLMAP_NAME dengan nama resource peta URL yang akan Anda buat (misalnya, myservice-httpredirect).

  2. Buat proxy HTTP target dengan peta URL.

    gcloud compute target-http-proxies create HTTP_PROXY_NAME \
      --url-map=HTTP_URLMAP_NAME

    Ganti HTTP_PROXY_NAME dengan nama proxy HTTP target yang akan Anda buat (misalnya, myservice-http).

  3. Buat aturan penerusan di port 80 dengan alamat IP yang dicadangkan yang sama.

    gcloud compute forwarding-rules create --global HTTP_FORWARDING_RULE_NAME \
      --target-http-proxy=HTTP_PROXY_NAME \
      --address=SERVICE_IP \
      --ports=80
            

    Ganti HTTP_FORWARDING_RULE_NAME dengan nama aturan penerusan baru yang akan Anda buat (misalnya, myservice-httplb).

Terraform

  1. Buat resource peta URL dengan aturan pengalihan:

    resource "google_compute_url_map" "https_default" {
      provider = google-beta
      name     = "myservice-https-urlmap"
    
      default_url_redirect {
        redirect_response_code = "MOVED_PERMANENTLY_DEFAULT"
        https_redirect         = true
        strip_query            = false
      }
    }
  2. Buaa proxy HTTP target dengan resource peta URL yang baru dibuat (myservice-https-urlmap):

    resource "google_compute_target_http_proxy" "https_default" {
      provider = google-beta
      name     = "myservice-http-proxy"
      url_map  = google_compute_url_map.https_default.id
    
      depends_on = [
        google_compute_url_map.https_default
      ]
    }
  3. Buat aturan penerusan di port 80 dengan resource alamat IP yang dicadangkan yang sama (myservice-http-proxy):

    resource "google_compute_global_forwarding_rule" "https_default" {
      provider   = google-beta
      name       = "myservice-https-fr"
      target     = google_compute_target_http_proxy.https_default.id
      ip_address = google_compute_global_address.lb_default.id
      port_range = "80"
      depends_on = [google_compute_target_http_proxy.https_default]
    }

Menggunakan langganan push Pub/Sub terautentikasi dengan deployment multi-region

Layanan Pub/Sub secara default mengirimkan pesan ke endpoint push di region Google Cloud yang sama tempat layanan Pub/Sub menyimpan pesan. Untuk solusi atas perilaku ini, lihat Menggunakan langganan push Pub/Sub yang terautentikasi dengan deployment Cloud Run multi-region.