Merutekan traffic dari Layanan Cloud Run ke workload Cloud Service Mesh di GKE

Halaman ini menunjukkan cara merutekan traffic jaringan dengan aman dari Layanan Cloud Run ke beban kerja Cloud Service Mesh di GKE untuk menggunakan Istio API dan memanfaatkan sidecar Envoy yang dikelola sepenuhnya.

Sebelum memulai

Bagian berikut mengasumsikan bahwa Anda memiliki cluster GKE dengan Cloud Service Mesh yang diaktifkan.

Jika Anda belum men-deploy Layanan GKE, gunakan perintah berikut untuk men-deploy layanan contoh:

cat <<EOF > /tmp/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: ads
spec:
  ports:
  - port: 9999
    targetPort: 8000
  selector:
    run: ads
  type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ads
spec:
  replicas: 1
  selector:
    matchLabels:
      run: ads
  template:
    metadata:
      labels:
        run: ads
    spec:
      containers:
      - image: docker.io/waip/simple-http:v1.0.1
        name: my-http2-svc
        ports:
        - protocol: TCP
          containerPort: 8000
      securityContext:
        fsGroup: 1337
EOF
kubectl apply -f /tmp/service.yaml

Mengonfigurasi Domain Kustom untuk host VirtualService

Layanan virtual menentukan aturan perutean traffic. Setiap traffic yang cocok kemudian dikirim ke layanan tujuan bernama

  1. Membuat zona terkelola baru:

    gcloud dns managed-zones create ZONE_NAME \
      --description="zone for service mesh routes" \
      --dns-name=DNS_SUFFIX. \
      --networks=default \
      --visibility=private
    

    dengan:

    • ZONE_NAME adalah nama untuk zona Anda (contoh: 'prod').
    • DNS_SUFFIX adalah host DNS yang valid (contoh: 'mesh.private').
  2. Buat kumpulan data resource:

    IP=10.0.0.1
    gcloud dns record-sets create '*.'"DNS_SUFFIX." --type=A --zone="ZONE_NAME" \
      --rrdatas=10.0.0.1 --ttl 3600
    

    Pastikan IP (RFC 1918 diperlukan) tidak digunakan. Atau, cadangkan IP internal statis.

  3. Mengekspor VirtualService untuk Klien Cloud Run Eksternal:

    cat <<EOF > virtual-service.yaml
    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: VIRTUAL_SERVICE_NAME
      namespace: NAMESPACE
    spec:
      hosts:
      - GKE_SERVICE_NAME.DNS_SUFFIX
      gateways:
      - external-mesh
      http:
      - route:
        - destination:
            host: GKE_SERVICE_NAME
    EOF
    kubectl apply -f virtual-service.yaml
    

    dengan:

    • VIRTUAL_SERVICE_NAME adalah nama untuk VirtualService Anda.
    • NAMESPACE adalah default jika Anda menggunakan layanan contoh yang disediakan; jika tidak, ganti NAMESPACE dengan nama namespace Anda.
    • GKE_SERVICE_NAME adalah ads jika Anda menggunakan layanan contoh yang disediakan; jika tidak, ganti GKE_SERVICE_NAME dengan nama untuk layanan GKE Anda.

Meskipun dapat menambahkan gateway external-mesh sebagai target ke VirtualService yang sudah ada, Anda harus membuat VirtualService yang berbeda untuk mengekspor layanan Kubernetes ke klien Cloud Run eksternal. Memiliki VirtualService terpisah akan memfasilitasi pengelolaan layanan yang diekspor dan konfigurasinya tanpa memengaruhi klien GKE yang ada. Selain itu, beberapa kolom di VirtualServices diabaikan untuk VirtualServices eksternal mesh, tetapi terus berfungsi seperti yang diharapkan untuk layanan GKE. Jadi, mengelola dan memecahkan masalah VirtualServices secara terpisah mungkin memiliki manfaat.

Agar klien GKE juga menerima konfigurasi VirtualService, gateway mesh atau mesh/default harus ditambahkan.

VirtualService eksternal mesh harus ditentukan dalam namespace yang sama dengan Layanan Kubernetes di tujuan VirtualService.

Mengonfigurasi Layanan Cloud Run untuk bergabung ke mesh layanan

Untuk bergabung dengan Layanan Cloud Run ke mesh layanan, lakukan langkah-langkah berikut:

  1. Tentukan ID mesh yang mendukung cluster GKE Cloud Service Mesh:

    MESH=$(kubectl get controlplanerevision --namespace istio-system -o json | jq -r '.items[0].metadata.annotations["mesh.cloud.google.com/external-mesh"]')
    
  2. Deploy Layanan Cloud Run menggunakan ID mesh, pastikan juga terhubung ke jaringan VPC cluster:

    gcloud alpha run deploy --mesh "$MESH" --network default \
      mesh-svc --image=fortio/fortio \
      --region=REGION --project=PROJECT_ID --no-allow-unauthenticated
    
  3. Pastikan layanan Cloud Run dapat mengirim permintaan ke beban kerja GKE:

    TEST_SERVICE_URL=$(gcloud run services describe mesh-svc --region REGION --format="value(status.url)" --project=PROJECT_ID)
    
    curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" "$TEST_SERVICE_URL/fortio/fetch/GKE_SERVICE_NAME.DNS_SUFFIX"
    

    Output harus berupa respons HTTP 200 yang valid.

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