Merutekan traffic dari workload Cloud Service Mesh ke Layanan Cloud Run

Halaman ini menunjukkan cara merutekan traffic jaringan dengan aman dari workload Cloud Service Mesh di GKE ke Layanan Cloud Run.

Perhatikan bahwa saat merutekan traffic dari GKE ke Cloud Run, Anda tidak perlu membuat Layanan Cloud Run bergabung dengan Cloud Service Mesh. Namun, Layanan Cloud Run harus berada dalam project yang sama dengan cluster GKE Cloud Service Mesh. Batasan ini ada saat fitur ini tersedia dalam pratinjau publik.

Sebelum memulai

Bagian berikut mengasumsikan bahwa Anda telah:

  1. Cluster GKE dengan Cloud Service Mesh diaktifkan.
  2. Men-deploy layanan Cloud Run.

Atau, Anda dapat menjalankan perintah berikut untuk men-deploy contoh layanan Cloud Run.

  1. Buat konteks kubeconfig untuk cluster Anda:

    gcloud container clusters get-credentials CLUSTER_NAME --project=PROJECT_ID  --location=CLUSTER_LOCATION
    

    Dengan keterangan:

    • CLUSTER_NAME adalah nama cluster Anda.
    • PROJECT_ID adalah project ID project Anda.
    • CLUSTER_LOCATION adalah region atau zona cluster Anda.
  2. Men-deploy contoh layanan Cloud Run:

    gcloud run deploy hello-world \
      --image=us-docker.pkg.dev/cloudrun/container/hello \
      --no-allow-unauthenticated \
      --port=8080 \
      --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com \
      --region=us-central1 \
      --project=PROJECT_ID
    

    Dengan keterangan:

    • PROJECT_NUMBER adalah nomor project project Anda.
    • PROJECT_ID adalah project ID project Anda.

Mengonfigurasi IAM

Untuk memanggil layanan Cloud Run, pemeriksaan Identity and Access Management (IAM) Cloud Run harus lulus. Anda harus memberikan peran Cloud Run Invoker ke Akun Layanan Google. Anda juga harus mengonfigurasi Akun Layanan Kubernetes (KSA) GKE untuk meniru identitas Akun Layanan Google.

Lakukan langkah-langkah berikut untuk mengizinkan Akun Layanan Kubernetes meniru identitas Akun Layanan Google.

  1. Tambahkan binding kebijakan IAM ke akun layanan IAM:

    gcloud iam service-accounts add-iam-policy-binding PROJECT_NUMBER-compute@developer.gserviceaccount.com \
      --role roles/iam.workloadIdentityUser \
      --member "serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE/KSA]"
    

    Dengan keterangan:

    • NAMESPACE adalah nama namespace. Untuk tujuan panduan ini, Anda dapat menggunakan namespace default.
    • KSA adalah nama Akun Layanan Kubernetes. Untuk tujuan panduan ini, Anda dapat menggunakan default KSA.
  2. Anotasikan akun layanan:

    kubectl annotate serviceaccount KSA \
      --namespace NAMESPACE \
      iam.gke.io/gcp-service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com
    
  3. Berikan Peran Cloud Run Invoker ke Akun Layanan Google:

    gcloud run services add-iam-policy-binding hello-world \
      --region=us-central1 \
      --member="serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
      --role="roles/run.invoker"
    

Mengonfigurasi Layanan Cloud Run sebagai GCPBackend

Di bagian ini, Anda akan mengekspos layanan Cloud Run ke workload GKE menggunakan GCPBackend. GCPBackend terdiri dari:

  1. Informasi frontend - khususnya, nama host dan port yang akan digunakan Workload GKE untuk memanggil GCPBackend ini.
  2. Informasi backend - detail Layanan Cloud Run seperti nama layanan, lokasi, dan nomor project.

GCPBackend berisi nama host dan detail port serta detail Cloud Service (nama layanan, lokasi, dan nomor project). Beban kerja GKE harus menggunakan nama host dan port GCPBackend dalam permintaan HTTP-nya untuk mengakses Layanan Cloud Run.

Agar DNS nama host dapat di-resolve dalam cluster (secara default tidak dapat di-resolve), Anda harus mengonfigurasi DNS Google Cloud untuk me-resolve semua host di bawah nama host yang dipilih ke alamat IP arbitrer. Sampai Anda mengonfigurasi entri DNS ini, permintaan akan gagal. Konfigurasi DNS Google Cloud adalah penyiapan satu kali per domain kustom.

  1. Buat zona terkelola:

    gcloud dns managed-zones create prod \
        --description="zone for gcpbackend" \
        --dns-name=gcpbackend \
        --visibility=private \
        --networks=default
    

    Dalam contoh ini, Nama DNS adalah gcpbackend dan Jaringan VPC adalah default.

  2. Siapkan data agar domain dapat di-resolve:

    gcloud beta dns record-sets create *.gcpbackend \
      --ttl=3600 --type=A --zone=prod \
      --rrdatas=10.0.0.1
    
  3. Buat GCPBackend dengan nama host di domain sebelumnya:

    cat <<EOF > gcp-backend.yaml
    apiVersion: networking.gke.io/v1
    kind: GCPBackend
    metadata:
      name: cr-gcp-backend
      namespace: NAMESPACE
    spec:
      hostname: hello-world.gcpbackend
      type: CloudRun
      cloudrun:
        service: hello-world
        regions: [us-central1]
    EOF
    kubectl apply -f gcp-backend.yaml
    

    Dalam contoh ini, GCP_BACKEND_NAME adalah cr-gcp-backend.

  4. Buat Pod pengujian untuk memverifikasi konektivitas GKE ke Cloud Run:

    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: testcurl
      namespace: default
    spec:
      containers:
      - name: curl
        image: curlimages/curl
        command: ["sleep", "3000"]
    EOF
    
    kubectl exec testcurl -c curl -- curl http://hello-world.gcpbackend/hello
    

    Sekarang, beban kerja GKE Anda dapat mengakses Layanan Cloud Run dengan mengirim permintaan HTTP ke hello-world.gcpbackend/hello.

Anda harus menggunakan nama yang berbeda untuk GCPBackend agar tidak bertentangan dengan layanan Kubernetes atau Entri Layanan Istio yang ada. Jika terjadi konflik, urutan prioritas (tinggi ke rendah) adalah Layanan Kubernetes, istio ServiceEntry, dan GCPBackend.

Perhatikan bahwa Layanan Virtual dan GCPBackend harus berada di namespace yang sama dan Layanan Cloud Run harus berada dalam project yang sama dengan cluster GKE Cloud Service Mesh.

(Opsional) Menggunakan nama host Cloud Run, bukan Cloud DNS

Setiap Layanan Cloud Run diberi nama host (misalnya, hello-world.us-central1.run.app) dan dapat di-resolve DNS secara global. Anda dapat menggunakan nama host ini langsung di nama host GCPBackend dan melewati konfigurasi Cloud DNS.

cat <<EOF | kubectl apply -f -
apiVersion: networking.gke.io/v1
kind: GCPBackend
metadata:
  name: cr-gcp-backend
  namespace: NAMESPACE
spec:
  hostname: hello-world.us-central1.run.app
  type: CloudRun
  cloudrun:
    service: hello-world
    region: [us-central1]
EOF

Sekarang, workload GKE Anda dapat mengakses Layanan Cloud Run dengan mengirim permintaan HTTP ke hello-world.us-central1.run.app.

(Opsional) Mengonfigurasi Layanan Virtual dan/atau Aturan Tujuan Istio

Anda dapat mengonfigurasi Layanan Virtual Istio atau Aturan Tujuan Istio untuk Nama Host GCPBackend guna menetapkan kebijakan konsumen atau klien untuk permintaan ke GCPBackend.

Contoh berikut memasukkan penundaan 5 detik ke 50% permintaan dan membatalkan (status http 503) ke 10% permintaan yang masuk ke GCPBackend.

cat <<EOF | kubectl apply -f -
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: cr-virtual-service
  namespace: NAMESPACE
spec:
  hosts:
  - hello-world.us-central1.run.app
  gateways:
  - mesh
  http:
  - fault:
      delay:
        percentage:
          value: 50  # Delay 50% of requests
        fixedDelay: 5s
      abort:
        percentage:
          value: 10  # Abort 10% of requests
        httpStatus: 503
  - route:
    - destination:
        host: hello-world.us-central1.run.app
EOF

Dalam contoh ini, VIRTUAL_SERVICE_NAME adalah cr-virtual-service.

Pemecahan masalah

Bagian ini menunjukkan cara memecahkan masalah error umum pada Cloud Service Mesh dan Cloud Run.

Log Sidecar Cloud Run

Error Envoy dicatat di Cloud Logging.

Misalnya, error seperti berikut akan dicatat ke dalam log jika akun layanan Cloud Run tidak diberi peran klien trafficdirector dalam project mesh:

StreamAggregatedResources gRPC config stream to trafficdirector.googleapis.com:443 closed: 7, Permission 'trafficdirector.networks.getConfigs' denied on resource '//trafficdirector.googleapis.com/projects/525300120045/networks/mesh:test-mesh/nodes/003fb3e0c8927482de85f052444d5e1cd4b3956e82b00f255fbea1e114e1c0208dbd6a19cc41694d2a271d1ab04b63ce7439492672de4499a92bb979853935b03d0ad0' (or it may not exist).

CSDS

Status klien trafficdirector dapat diambil menggunakan CSDS:

gcloud alpha container fleet mesh debug proxy-status --membership=<CLUSTER_MEMBERSHIP> --location=<CLUSTER_LOCATION>
External Clients:
....

Langkah selanjutnya