Mengonfigurasi Load Balancer Aplikasi klasik untuk Cloud Service Mesh

Ringkasan

Dokumen ini ditujukan jika Anda adalah pengguna Cloud Service Mesh yang sudah ada dan telah bidang kontrol terkelola Istio dan Anda ingin mengonfigurasi Load Balancer Aplikasi klasik sebagai gateway masuk. Load Balancer Aplikasi klasik adalah yang juga dikenal sebagai Load Balancer Aplikasi eksternal klasik.

Jangan gunakan dokumen ini jika Anda adalah pengguna Cloud Service Mesh baru. Baru pengguna akan otomatis disiapkan dengan bidang kontrol yang dikelola Cloud Service Mesh. Anda tidak dapat menggunakan konfigurasi yang dijelaskan dalam dokumen ini dengan Bidang kontrol terkelola Cloud Service Mesh

Cloud Load Balancing menyediakan banyak solusi edge yang dikelola cloud kemampuan yang meliputi load balancing anycast global, sertifikat, Identity and Access Management, Cloud Next Generation Firewall, dan Cloud Intrusion Detection System. Cloud Service Mesh dapat mengintegrasikan kemampuan edge ini dengan lancar dalam model traffic masuk mesh. Gateway cloud mesh layanan menyediakan cara terpadu untuk mengonfigurasi gateway masuk Cloud Service Mesh dengan Cloud Load Balancing secara bersamaan melalui Kubernetes Gateway API.

Diagram yang menunjukkan load balancer dengan Cloud Service Mesh

Dibandingkan dengan panduan pengguna kami sebelumnya, Dari edge ke mesh: Mengekspos aplikasi mesh layanan melalui GKE Ingress, dengan gateway cloud mesh layanan, model ini kini dapat di-deploy melalui satu Resource Gateway Kubernetes yang menyederhanakan proses deployment cloud dan menggunakan load balancing yang dihosting cluster.

Batasan pratinjau

Untuk rilis Pratinjau fitur ini, batasan berikut berlaku:

  • Gateway Multi-cluster tidak didukung.
  • Cluster Autopilot sedang tidak didukung.
  • Hanya Load Balancer Aplikasi klasik yang didukung. Load Balancer Aplikasi eksternal global (terkadang disebut Load Balancer Lanjutan) dan Load Balancer Aplikasi internal tidak didukung.
  • Traffic antara Load Balancer Aplikasi klasik dan traffic masuk Cloud Service Mesh gateway dienkripsi menggunakan TLS. Namun, Load Balancer Aplikasi klasik tidak akan memverifikasi sertifikat yang disediakan oleh gateway masuk Cloud Service Mesh. Ini batasan berlaku untuk semua pengguna Load Balancer HTTP(S) Google Cloud.
  • Jika Cloud Service Mesh GatewayClasses dihapus dari cluster, node tersebut tidak akan diinstal ulang secara otomatis. Namun demikian, hal ini tidak akan mempengaruhi {i>usability <i}ke mengenai fitur tersebut.
  • Logika pencocokan rute tidak mengikuti Spesifikasi Gateway API dan cocok dengan urutan HTTPRoute. Hal ini akan berubah pada masa mendatang versi baru dengan mengikuti spesifikasi Gateway API.

Persyaratan

  • Mesh Layanan Cloud Terkelola diinstal di cluster Google Kubernetes Engine (GKE) yang menjalankan versi 1.24 atau yang lebih baru. Yang lain GKE Enterprise clusters tidak didukung.
  • Khusus versi Kubernetes Gateway API v1beta1.

Prasyarat

  • Aktifkan API berikut di project Anda:

    • compute.googleapis.com
    • container.googleapis.com
    • certificatemanager.googleapis.com
    • serviceusage.googleapis.com
    gcloud services enable \
       compute.googleapis.com \
       container.googleapis.com \
       certificatemanager.googleapis.com \
       serviceusage.googleapis.com
    

Men-deploy gateway cloud mesh layanan untuk mesh cluster tunggal

Bagian ini menunjukkan cara men-deploy Resource Gateway Kubernetes yang men-deploy Load Balancer Aplikasi klasik dan gateway masuk Cloud Service Mesh.

Mengaktifkan Gateway API dengan Cloud Service Mesh terkelola

  1. Aktifkan Gateway API di cluster Anda. Tujuan Cluster GKE harus versi 1.24 atau yang lebih baru.

  2. Instal Cloud Layanan Cloud terkelola dengan rapid atau regular sebagai saluran rilisnya.

Men-deploy resource Gateway

Saat men-deploy gateway cloud mesh layanan, Kubernetes Resource gateway digunakan untuk men-deploy Cloud Load Balancing dan Cloud Service Mesh gateway masuk sebagai satu langkah. Perlu diketahui bahwa Resource Kubernetes Gateway berbeda dengan Gateway Istio Google Cloud Platform.

Untuk informasi selengkapnya tentang perbedaannya, lihat Gateway Kubernetes dan Gateway Istio. Setiap Gateway Kubernetes memiliki GatewayClass yang menunjukkan tipe dan inherennya kemampuan IT. gateway cloud mesh layanan memiliki GatewayClass yang memiliki kemampuan untuk men-deploy Cloud Load Balancing dan gateway masuk Cloud Service Mesh.

  1. Simpan manifes GatewayClass berikut ke file bernama l7-gateway-class.yaml:

    apiVersion: gateway.networking.k8s.io/v1beta1
    kind: GatewayClass
    metadata:
      name: asm-l7-gxlb
    spec:
      controllerName: mesh.cloud.google.com/gateway
    
  2. Deploy GatewayClass di cluster Anda:

    kubectl apply -f l7-gateway-class.yaml
    
  3. Pastikan GatewayClass ada setelah penginstalan:

    kubectl get gatewayclasses.gateway.networking.k8s.io
    

    Outputnya mirip dengan:

    NAME          CONTROLLER
    asm-l7-gxlb   mesh.cloud.google.com/gateway
    gke-l7-rilb   networking.gke.io/gateway
    gke-l7-gxlb   networking.gke.io/gateway
    

    Mungkin perlu waktu beberapa menit untuk men-deploy semua resource. Jika Anda tidak melihat {i>output<i} yang diharapkan, verifikasi bahwa Anda telah memenuhi prasyarat.

    Anda juga akan melihat GatewayClass berikut:

    gke-l7-gxlb   networking.gke.io/gateway
    

    Layanan ini digunakan untuk men-deploy Load Balancer Aplikasi klasik Google Cloud yang mendasarinya.

  4. Buat Namespace khusus untuk gateway cloud mesh layanan Anda:

    kubectl create namespace istio-ingress
    
  5. Simpan manifes Gateway berikut ke file bernama gateway.yaml:

    kind: Gateway
    apiVersion: gateway.networking.k8s.io/v1beta1
    metadata:
      name: servicemesh-cloud-gw
      namespace: istio-ingress
    spec:
      gatewayClassName: asm-l7-gxlb
      listeners:
      - name: http
        protocol: HTTP
        port: 80
        allowedRoutes:
          namespaces:
            from: All
    
  6. Deploy Gateway di cluster Anda di Namespace istio-ingress:

    kubectl apply -f gateway.yaml
    
  7. Pastikan objek Kubernetes Gateway API telah dibuat:

    kubectl get gateways.gateway.networking.k8s.io -n istio-ingress
    

    Outputnya mirip dengan:

    NAME                                CLASS         ADDRESS         READY   AGE
    asm-gw-gke-servicemesh-cloud-gw     gke-l7-gxlb   34.111.114.64   True    9m40s
    asm-gw-istio-servicemesh-cloud-gw   istio                                 9m44s
    servicemesh-cloud-gw                asm-l7-gxlb                           9m44s
    

Hal berikut akan terjadi saat objek Kubernetes Gateway API ini di-deploy:

  • Load Balancer HTTP(S) eksternal di-deploy dan dikonfigurasi. Mungkin perlu waktu beberapa menit untuk itu untuk muncul tetapi ketika itu terjadi, {i>Gateway<i} akan menunjukkan alamat IP dan akan diberi anotasi dengan nama load balancer Compute Engine resource yang telah dibuat.
  • Deployment gateway masuk Cloud Service Mesh dibuat di istio-ingress namespace. Tindakan ini akan membuat instance proxy Envoy yang akan menerima traffic dari dengan load balancer Jaringan Passthrough Eksternal Regional.
  • Load balancer akan mengenkripsi dan merutekan semua traffic ke Gateway masuk Cloud Service Mesh.

Sekarang Anda memiliki infrastruktur lengkap yang diperlukan untuk menerima lalu lintas internet ke {i>mesh.<i} Perhatikan bahwa ini adalah yang paling sederhana. Di bagian berikut, Anda akan menambahkan kebijakan dan kemampuan tambahan yang akan membuatnya siap diproduksi.

Deployment aplikasi dan perutean

Untuk mendemonstrasikan sepenuhnya kemampuan Anda akan men-deploy aplikasi ke Cloud Service Mesh dan menerima traffic internet melalui Gateway Anda, misalnya tujuan.

  1. Beri label Namespace default untuk mengaktifkan injeksi file bantuan.

    kubectl label namespace default istio-injection=enabled istio.io/rev- --overwrite
    
  2. Simpan manifes Gateway berikut ke file bernama whereami.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: whereami-v1
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: whereami-v1
      template:
        metadata:
          labels:
            app: whereami-v1
        spec:
          containers:
          - name: whereami
            image: us-docker.pkg.dev/google-samples/containers/gke/whereami:v1.2.20
            ports:
              - containerPort: 8080
            env:
            - name: METADATA
              value: "whereami-v1"
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: whereami-v1
    spec:
      selector:
        app: whereami-v1
      ports:
      - port: 8080
        targetPort: 8080
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: whereami-v2
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: whereami-v2
      template:
        metadata:
          labels:
            app: whereami-v2
        spec:
          containers:
          - name: whereami
            image: us-docker.pkg.dev/google-samples/containers/gke/whereami:v1.2.20
            ports:
              - containerPort: 8080
            env:
            - name: METADATA
              value: "whereami-v2"
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: whereami-v2
    spec:
      selector:
        app: whereami-v2
      ports:
      - port: 8080
        targetPort: 8080
    

    Manifes ini membuat Service/whereami-v1, Service/whereami-v2, Deployment/whereami-v1, dan Deployment/whereami-v2 untuk Whereami, sebuah aplikasi sederhana yang menghasilkan JSON untuk menunjukkan identitas dan lokasinya. Anda akan men-deploy dua versi yang berbeda.

  3. Membuat Layanan dan Deployment:

    kubectl apply -f whereami.yaml
    

    Setelah aktif dan berjalan, Anda akan memiliki empat Pod whereami yang berjalan di cluster Anda.

  4. Pastikan keempat Pod berjalan:

    kubectl get pods
    

    Outputnya mirip dengan:

    whereami-v1-7c76d89d55-qg6vs       2/2     Running   0          28s
    whereami-v1-7c76d89d55-vx9nm       2/2     Running   0          28s
    whereami-v2-67f6b9c987-p9kqm       2/2     Running   0          27s
    whereami-v2-67f6b9c987-qhj76       2/2     Running   0          27s
    
  5. Simpan manifes HTTPRoute berikut ke file bernama http-route.yaml:

    kind: HTTPRoute
    apiVersion: gateway.networking.k8s.io/v1beta1
    metadata:
      name: where-route
    spec:
     parentRefs:
     - kind: Gateway
       name: servicemesh-cloud-gw
       namespace: istio-ingress
     hostnames:
     - "where.example.com"
     rules:
     - matches:
       - headers:
         - name: version
           value: v2
       backendRefs:
       - name: whereami-v2
         port: 8080
     - backendRefs:
       - name: whereami-v1
         port: 8080
    
  6. Deploy http-route.yaml ke cluster Anda:

    kubectl apply -f http-route.yaml
    

    HTTPRoute ini mereferensikan servicemesh-cloud-gw, yang berarti bahwa ini akan mengonfigurasi gateway cloud mesh layanan agar dapat mengonfigurasi Cloud Service Mesh yang mendasarinya traffic masuk dengan aturan perutean ini. HTTPRoute melakukan hal yang sama berfungsi sebagai Istio VirtualService tetapi menggunakan Kubernetes Gateway API untuk melakukannya. Karena Gateway API adalah spesifikasi OSS dengan banyak maka ini adalah API terbaik yang cocok untuk menentukan perutean kombinasi load balancer yang berbeda (seperti proxy Cloud Service Mesh load balancer).

  7. Ambil alamat IP dari Gateway agar Anda dapat mengirimkan traffic ke aplikasi Anda:

    VIP=$(kubectl get gateways.gateway.networking.k8s.io asm-gw-gke-servicemesh-cloud-gw -o=jsonpath="{.status.addresses[0].value}" -n istio-ingress)
    

    Outputnya adalah alamat IP.

    echo $VIP
    
    34.111.61.135
    
  8. Kirim traffic ke alamat IP Gateway untuk memvalidasi bahwa penyiapan ini berfungsi dengan benar. Kirim satu permintaan dengan header version: v2 dan satu lagi tanpa ke menentukan bahwa {i>routing<i} dilakukan dengan benar pada kedua versi aplikasi.

    curl ${VIP} -H "host: where.example.com"
    
    {
      "cluster_name": "gke1",
      "host_header": "where.example.com",
      "metadata": "whereami-v1",
      "node_name": "gke-gke1-default-pool-9b3b5b18-hw5z.c.church-243723.internal",
      "pod_name": "whereami-v1-67d9c5d48b-zhr4l",
      "pod_name_emoji": "⚒",
      "project_id": "church-243723",
      "timestamp": "2021-02-08T18:55:01",
      "zone": "us-central1-a"
    }
    
    curl ${VIP} -H "host: where.example.com" -H "version: v2"
    
    {
      "cluster_name": "gke1",
      "host_header": "where.example.com",
      "metadata": "whereami-v2",
      "node_name": "gke-gke1-default-pool-9b3b5b18-hw5z.c.church-243723.internal",
      "pod_name": "whereami-v2-67d9c5d48b-zhr4l",
      "pod_name_emoji": "⚒",
      "project_id": "church-243723",
      "timestamp": "2021-02-08T18:55:01",
      "zone": "us-central1-a"
    }
    

Deployment gateway produksi

Bagian sebelumnya menunjukkan contoh gateway cloud mesh layanan yang sangat sederhana. Langkah-langkah berikut dibuat berdasarkan contoh sederhana untuk menampilkan konfigurasi siap produksi yang menunjukkan keuntungan mendelegasikan beberapa pemilihan rute masuk fungsi load balancer baru pada Load Balancer Aplikasi klasik.

Jangan gunakan dokumen ini jika Anda adalah pengguna Cloud Service Mesh baru. Baru pengguna akan otomatis disiapkan dengan bidang kontrol yang dikelola Cloud Service Mesh. Anda tidak dapat menggunakan konfigurasi yang dijelaskan dalam dokumen ini dengan Bidang kontrol terkelola Cloud Service Mesh

Cloud Load Balancing menyediakan banyak solusi edge yang dikelola cloud kemampuan yang meliputi load balancing anycast global, sertifikat, Identity and Access Management, Cloud Next Generation Firewall, dan Cloud Intrusion Detection System. Cloud Service Mesh dapat mengintegrasikan kemampuan edge ini dengan lancar dalam model traffic masuk mesh. Gateway cloud mesh layanan menyediakan cara terpadu untuk mengonfigurasi gateway masuk Cloud Service Mesh dengan Cloud Load Balancing secara bersamaan melalui Kubernetes Gateway API.

Diagram yang menunjukkan load balancer dengan Cloud Service Mesh

Dibandingkan dengan panduan pengguna kami sebelumnya, Dari edge ke mesh: Mengekspos aplikasi mesh layanan melalui GKE Ingress, dengan gateway cloud mesh layanan, model ini kini dapat di-deploy melalui satu Resource Gateway Kubernetes yang menyederhanakan proses deployment cloud dan menggunakan load balancing yang dihosting cluster.

Batasan pratinjau

Untuk rilis Pratinjau fitur ini, batasan berikut berlaku:

  • Gateway Multi-cluster tidak didukung.
  • Cluster Autopilot sedang tidak didukung.
  • Hanya Load Balancer Aplikasi klasik yang didukung. Load Balancer Aplikasi eksternal global (terkadang disebut Load Balancer Lanjutan) dan Load Balancer Aplikasi internal tidak didukung.
  • Traffic antara Load Balancer Aplikasi klasik dan traffic masuk Cloud Service Mesh gateway dienkripsi menggunakan TLS. Namun, Load Balancer Aplikasi klasik tidak akan memverifikasi sertifikat yang disediakan oleh gateway masuk Cloud Service Mesh. Ini batasan berlaku untuk semua pengguna Load Balancer HTTP(S) Google Cloud.
  • Jika Cloud Service Mesh GatewayClasses dihapus dari cluster, node tersebut tidak akan diinstal ulang secara otomatis. Namun demikian, hal ini tidak akan mempengaruhi {i>usability <i}ke mengenai fitur tersebut.
  • Logika pencocokan rute tidak mengikuti Spesifikasi Gateway API dan cocok dengan urutan HTTPRoute. Hal ini akan berubah pada masa mendatang versi baru dengan mengikuti spesifikasi Gateway API.

Persyaratan

  • Mesh Layanan Cloud Terkelola diinstal di cluster Google Kubernetes Engine (GKE) yang menjalankan versi 1.24 atau yang lebih baru. Yang lain GKE Enterprise clusters tidak didukung.
  • Khusus versi Kubernetes Gateway API v1beta1.

Prasyarat

  • Aktifkan API berikut di project Anda:

    • compute.googleapis.com
    • container.googleapis.com
    • certificatemanager.googleapis.com
    • serviceusage.googleapis.com
    gcloud services enable \
       compute.googleapis.com \
       container.googleapis.com \
       certificatemanager.googleapis.com \
       serviceusage.googleapis.com
    

Men-deploy gateway cloud mesh layanan untuk mesh cluster tunggal

Bagian ini menunjukkan cara men-deploy Resource Gateway Kubernetes yang men-deploy Load Balancer Aplikasi klasik dan gateway masuk Cloud Service Mesh.

Mengaktifkan Gateway API dengan Cloud Service Mesh terkelola

  1. Aktifkan Gateway API di cluster Anda. Tujuan Cluster GKE harus versi 1.24 atau yang lebih baru.

  2. Instal Cloud Layanan Cloud terkelola dengan rapid atau regular sebagai saluran rilisnya.

Men-deploy resource Gateway

Saat men-deploy gateway cloud mesh layanan, Kubernetes Resource gateway digunakan untuk men-deploy Cloud Load Balancing dan Cloud Service Mesh gateway masuk sebagai satu langkah. Perlu diketahui bahwa Resource Kubernetes Gateway berbeda dengan Gateway Istio Google Cloud Platform.

Untuk informasi selengkapnya tentang perbedaannya, lihat Gateway Kubernetes dan Gateway Istio. Setiap Gateway Kubernetes memiliki GatewayClass yang menunjukkan tipe dan inherennya kemampuan IT. gateway cloud mesh layanan memiliki GatewayClass yang memiliki kemampuan untuk men-deploy Cloud Load Balancing dan gateway masuk Cloud Service Mesh.

  1. Simpan manifes GatewayClass berikut ke file bernama l7-gateway-class.yaml:

    apiVersion: gateway.networking.k8s.io/v1beta1
    kind: GatewayClass
    metadata:
      name: asm-l7-gxlb
    spec:
      controllerName: mesh.cloud.google.com/gateway
    
  2. Deploy GatewayClass di cluster Anda:

    kubectl apply -f l7-gateway-class.yaml
    
  3. Pastikan GatewayClass ada setelah penginstalan:

    kubectl get gatewayclasses.gateway.networking.k8s.io
    

    Outputnya mirip dengan:

    NAME          CONTROLLER
    asm-l7-gxlb   mesh.cloud.google.com/gateway
    gke-l7-rilb   networking.gke.io/gateway
    gke-l7-gxlb   networking.gke.io/gateway
    

    Mungkin perlu waktu beberapa menit untuk men-deploy semua resource. Jika Anda tidak melihat {i>output<i} yang diharapkan, verifikasi bahwa Anda telah memenuhi prasyarat.

    Anda juga akan melihat GatewayClass berikut:

    gke-l7-gxlb   networking.gke.io/gateway
    

    Layanan ini digunakan untuk men-deploy Load Balancer Aplikasi klasik Google Cloud yang mendasarinya.

  4. Buat Namespace khusus untuk gateway cloud mesh layanan Anda:

    kubectl create namespace istio-ingress
    
  5. Simpan manifes Gateway berikut ke file bernama gateway.yaml:

    kind: Gateway
    apiVersion: gateway.networking.k8s.io/v1beta1
    metadata:
      name: servicemesh-cloud-gw
      namespace: istio-ingress
    spec:
      gatewayClassName: asm-l7-gxlb
      listeners:
      - name: http
        protocol: HTTP
        port: 80
        allowedRoutes:
          namespaces:
            from: All
    
  6. Deploy Gateway di cluster Anda di Namespace istio-ingress:

    kubectl apply -f gateway.yaml
    
  7. Pastikan objek Kubernetes Gateway API telah dibuat:

    kubectl get gateways.gateway.networking.k8s.io -n istio-ingress
    

    Outputnya mirip dengan:

    NAME                                CLASS         ADDRESS         READY   AGE
    asm-gw-gke-servicemesh-cloud-gw     gke-l7-gxlb   34.111.114.64   True    9m40s
    asm-gw-istio-servicemesh-cloud-gw   istio                                 9m44s
    servicemesh-cloud-gw                asm-l7-gxlb                           9m44s
    

Hal berikut akan terjadi saat objek Kubernetes Gateway API ini di-deploy:

  • Load Balancer HTTP(S) eksternal di-deploy dan dikonfigurasi. Mungkin perlu waktu beberapa menit untuk itu untuk muncul tetapi ketika itu terjadi, {i>Gateway<i} akan menunjukkan alamat IP dan akan diberi anotasi dengan nama load balancer Compute Engine resource yang telah dibuat.
  • Deployment gateway masuk Cloud Service Mesh dibuat di istio-ingress namespace. Tindakan ini akan membuat instance proxy Envoy yang akan menerima traffic dari dengan load balancer Jaringan Passthrough Eksternal Regional.
  • Load balancer akan mengenkripsi dan merutekan semua traffic ke Gateway masuk Cloud Service Mesh.

Sekarang Anda memiliki infrastruktur lengkap yang diperlukan untuk menerima lalu lintas internet ke {i>mesh.<i} Perhatikan bahwa ini adalah yang paling sederhana. Di bagian berikut, Anda akan menambahkan kebijakan dan kemampuan tambahan yang akan membuatnya siap diproduksi.

Deployment aplikasi dan perutean

Untuk mendemonstrasikan sepenuhnya kemampuan Anda akan men-deploy aplikasi ke Cloud Service Mesh dan menerima traffic internet melalui Gateway Anda, misalnya tujuan.

  1. Beri label Namespace default untuk mengaktifkan injeksi file bantuan.

    kubectl label namespace default istio-injection=enabled istio.io/rev- --overwrite
    
  2. Simpan manifes Gateway berikut ke file bernama whereami.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: whereami-v1
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: whereami-v1
      template:
        metadata:
          labels:
            app: whereami-v1
        spec:
          containers:
          - name: whereami
            image: us-docker.pkg.dev/google-samples/containers/gke/whereami:v1.2.20
            ports:
              - containerPort: 8080
            env:
            - name: METADATA
              value: "whereami-v1"
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: whereami-v1
    spec:
      selector:
        app: whereami-v1
      ports:
      - port: 8080
        targetPort: 8080
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: whereami-v2
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: whereami-v2
      template:
        metadata:
          labels:
            app: whereami-v2
        spec:
          containers:
          - name: whereami
            image: us-docker.pkg.dev/google-samples/containers/gke/whereami:v1.2.20
            ports:
              - containerPort: 8080
            env:
            - name: METADATA
              value: "whereami-v2"
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: whereami-v2
    spec:
      selector:
        app: whereami-v2
      ports:
      - port: 8080
        targetPort: 8080
    

    Manifes ini membuat Service/whereami-v1, Service/whereami-v2, Deployment/whereami-v1, dan Deployment/whereami-v2 untuk Whereami, sebuah aplikasi sederhana yang menghasilkan JSON untuk menunjukkan identitas dan lokasinya. Anda akan men-deploy dua versi yang berbeda.

  3. Membuat Layanan dan Deployment:

    kubectl apply -f whereami.yaml
    

    Setelah aktif dan berjalan, Anda akan memiliki empat Pod whereami yang berjalan di cluster Anda.

  4. Pastikan keempat Pod berjalan:

    kubectl get pods
    

    Outputnya mirip dengan:

    whereami-v1-7c76d89d55-qg6vs       2/2     Running   0          28s
    whereami-v1-7c76d89d55-vx9nm       2/2     Running   0          28s
    whereami-v2-67f6b9c987-p9kqm       2/2     Running   0          27s
    whereami-v2-67f6b9c987-qhj76       2/2     Running   0          27s
    
  5. Simpan manifes HTTPRoute berikut ke file bernama http-route.yaml:

    kind: HTTPRoute
    apiVersion: gateway.networking.k8s.io/v1beta1
    metadata:
      name: where-route
    spec:
     parentRefs:
     - kind: Gateway
       name: servicemesh-cloud-gw
       namespace: istio-ingress
     hostnames:
     - "where.example.com"
     rules:
     - matches:
       - headers:
         - name: version
           value: v2
       backendRefs:
       - name: whereami-v2
         port: 8080
     - backendRefs:
       - name: whereami-v1
         port: 8080
    
  6. Deploy http-route.yaml ke cluster Anda:

    kubectl apply -f http-route.yaml
    

    HTTPRoute ini mereferensikan servicemesh-cloud-gw, yang berarti bahwa ini akan mengonfigurasi gateway cloud mesh layanan agar dapat mengonfigurasi Cloud Service Mesh yang mendasarinya traffic masuk dengan aturan perutean ini. HTTPRoute melakukan hal yang sama berfungsi sebagai Istio VirtualService tetapi menggunakan Kubernetes Gateway API untuk melakukannya. Karena Gateway API adalah spesifikasi OSS dengan banyak maka ini adalah API terbaik yang cocok untuk menentukan perutean kombinasi load balancer yang berbeda (seperti proxy Cloud Service Mesh load balancer).

  7. Ambil alamat IP dari Gateway agar Anda dapat mengirimkan traffic ke aplikasi Anda:

    VIP=$(kubectl get gateways.gateway.networking.k8s.io asm-gw-gke-servicemesh-cloud-gw -o=jsonpath="{.status.addresses[0].value}" -n istio-ingress)
    

    Outputnya adalah alamat IP.

    echo $VIP
    
    34.111.61.135
    
  8. Kirim traffic ke alamat IP Gateway untuk memvalidasi bahwa penyiapan ini berfungsi dengan benar. Kirim satu permintaan dengan header version: v2 dan satu lagi tanpa ke menentukan bahwa {i>routing<i} dilakukan dengan benar pada kedua versi aplikasi.

    curl ${VIP} -H "host: where.example.com"
    
    {
      "cluster_name": "gke1",
      "host_header": "where.example.com",
      "metadata": "whereami-v1",
      "node_name": "gke-gke1-default-pool-9b3b5b18-hw5z.c.church-243723.internal",
      "pod_name": "whereami-v1-67d9c5d48b-zhr4l",
      "pod_name_emoji": "⚒",
      "project_id": "church-243723",
      "timestamp": "2021-02-08T18:55:01",
      "zone": "us-central1-a"
    }
    
    curl ${VIP} -H "host: where.example.com" -H "version: v2"
    
    {
      "cluster_name": "gke1",
      "host_header": "where.example.com",
      "metadata": "whereami-v2",
      "node_name": "gke-gke1-default-pool-9b3b5b18-hw5z.c.church-243723.internal",
      "pod_name": "whereami-v2-67d9c5d48b-zhr4l",
      "pod_name_emoji": "⚒",
      "project_id": "church-243723",
      "timestamp": "2021-02-08T18:55:01",
      "zone": "us-central1-a"
    }
    

Deployment gateway produksi

Bagian sebelumnya menunjukkan contoh gateway cloud mesh layanan yang sangat sederhana. Langkah-langkah berikut dibuat berdasarkan contoh sederhana untuk menampilkan konfigurasi siap produksi yang menunjukkan keuntungan mendelegasikan beberapa pemilihan rute masuk fungsi dasar ke load balancer.

Pada contoh berikut, Anda akan mengambil servicemesh-cloud-gw dari sebelumnya dan akan menambahkan kemampuan berikut untuk menciptakan dan dapat dikelola:

  • Deploy Gateway dengan alamat IP statis yang akan dipertahankan meskipun perubahan infrastruktur yang mendasarinya.
  • Mengonversi Gateway untuk menerima traffic HTTPS dengan sertifikat yang ditandatangani sendiri.
  1. Buat alamat IP eksternal statis. IP statis berguna karena infrastruktur yang mendasarinya dapat berubah di masa depan tetapi alamat IP dapat dipertahankan.

    gcloud compute addresses create whereami-ip \
        --global \
        --project PROJECT_ID
    
  2. Buat sertifikat yang ditandatangani sendiri untuk domain where-example-com:

    openssl genrsa -out key.pem 2048
    cat <<EOF >ca.conf
    [req]
    default_bits              = 2048
    req_extensions            = extension_requirements
    distinguished_name        = dn_requirements
    prompt                    = no
    [extension_requirements]
    basicConstraints          = CA:FALSE
    keyUsage                  = nonRepudiation, digitalSignature, keyEncipherment
    subjectAltName            = @sans_list
    [dn_requirements]
    0.organizationName        = example
    commonName                = where.example.com
    [sans_list]
    DNS.1                     = where.example.com
    EOF
    
    openssl req -new -key key.pem \
        -out csr.pem \
        -config ca.conf
    
    openssl x509 -req \
        -signkey key.pem \
        -in csr.pem \
        -out cert.pem \
        -extfile ca.conf \
        -extensions extension_requirements \
        -days 365
    
    gcloud compute ssl-certificates create where-example-com \
        --certificate=cert.pem \
        --private-key=key.pem \
        --global \
        --project PROJECT_ID
    

    Ada banyak cara untuk membuat sertifikat TLS. Dapat secara manual yang dihasilkan pada baris perintah, yang dihasilkan menggunakan Sertifikat yang dikelola Google, atau dapat dihasilkan secara internal oleh infrastruktur kunci publik perusahaan Anda (PKI). Dalam contoh ini, Anda secara manual membuat CA {i>root<i}. Meskipun sertifikat yang ditandatangani sendiri biasanya tidak digunakan untuk layanan masyarakat, hal ini menunjukkan konsep-konsep ini dengan lebih mudah.

    Untuk informasi selengkapnya tentang cara membuat sertifikat yang ditandatangani sendiri melalui Rahasia Kubernetes, lihat Mengamankan Gateway.

  3. Update gateway.yaml dengan manifes berikut:

    kind: Gateway
    apiVersion: gateway.networking.k8s.io/v1beta1
    metadata:
      name: servicemesh-cloud-gw
      namespace: istio-ingress
    spec:
      gatewayClassName: asm-l7-gxlb
      listeners:
      - name: http
        protocol: HTTP
        port: 80
        allowedRoutes:
          namespaces:
            from: All
      - name: https
        protocol: HTTPS
        port: 443
        allowedRoutes:
          namespaces:
            from: All
        tls:
          mode: Terminate
          options:
            networking.gke.io/pre-shared-certs: where-example-com
      addresses:
      - type: NamedAddress
        value: whereami-ip
    
  4. Deploy ulang Gateway di cluster Anda:

    kubectl apply -f gateway.yaml
    
  5. Dapatkan alamat IP dari IP statis:

    VIP=$(gcloud compute addresses describe whereami-ip --global --format="value(address)")
    
  6. Gunakan curl untuk mengakses domain Gateway. Karena DNS tidak dikonfigurasi untuk domain ini, gunakan opsi --resolve untuk memberi tahu curl agar me-resolve domain ke alamat IP Gateway:

    curl https://where.example.com --resolve where.example.com:443:${VIP} --cacert cert.pem -v
    

    Setelah selesai, output-nya akan mirip dengan:

    ...
    * TLSv1.2 (OUT), TLS handshake, Client hello (1):
    * TLSv1.2 (IN), TLS handshake, Server hello (2):
    * TLSv1.2 (IN), TLS handshake, Certificate (11):
    * TLSv1.2 (IN), TLS handshake, Server key exchange (12):
    * TLSv1.2 (IN), TLS handshake, Server finished (14):
    * TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
    * TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
    * TLSv1.2 (OUT), TLS handshake, Finished (20):
    * TLSv1.2 (IN), TLS change cipher, Change cipher spec (1):
    * TLSv1.2 (IN), TLS handshake, Finished (20):
    * SSL connection using TLSv1.2 / ECDHE-RSA-CHACHA20-POLY1305
    * ALPN, server accepted to use h2
    * Server certificate:
    *  subject: O=example; CN=where.example.com
    *  start date: Apr 19 15:54:50 2021 GMT
    *  expire date: Apr 19 15:54:50 2022 GMT
    *  common name: where.example.com (matched)
    *  issuer: O=example; CN=where.example.com
    *  SSL certificate verify ok.
    ...
    {
      "cluster_name": "gke1",
      "host_header": "where.example.com",
      "metadata": "where-v1",
      "node_name": "gke-gw-default-pool-51ccbf30-yya8.c.agmsb-k8s.internal",
      "pod_name": "where-v1-84b47c7f58-tj5mn",
      "pod_name_emoji": "😍",
      "project_id": "agmsb-k8s",
      "timestamp": "2021-04-19T16:30:08",
      "zone": "us-west1-a"
    }
    

Output panjang mencakup TLS handshake yang berhasil diikuti dengan respons dari aplikasi seperti output berikut. Ini membuktikan bahwa TLS sedang dihentikan di {i>Gateway<i} dengan benar dan aplikasi merespons klien Anda dengan aman.

Anda telah berhasil men-deploy arsitektur berikut:

Arsitektur ASM

servicemesh-cloud-gw dan GatewayClass asm-l7-gxlb-nya telah memisahkan beberapa komponen infrastruktur internal untuk menyederhanakan pengalaman pengguna. Cloud Load Balancing menghentikan traffic TLS menggunakan sertifikat internal dan juga health check lapisan proxy gateway masuk Cloud Service Mesh. Tujuan whereami-route di-deploy di Aplikasi & Deployment Pemilihan Rute mengonfigurasi Proxy gateway masuk Cloud Service Mesh untuk merutekan traffic ke jalur masuk yang benar dan layanan yang dihosting mesh.

Pada contoh berikut, Anda akan mengambil servicemesh-cloud-gw dari sebelumnya dan akan menambahkan kemampuan berikut untuk menciptakan dan dapat dikelola:

  • Deploy Gateway dengan alamat IP statis yang akan dipertahankan meskipun perubahan infrastruktur yang mendasarinya.
  • Mengonversi Gateway untuk menerima traffic HTTPS dengan sertifikat yang ditandatangani sendiri.
  1. Buat alamat IP eksternal statis. IP statis berguna karena infrastruktur yang mendasarinya dapat berubah di masa depan tetapi alamat IP dapat dipertahankan.

    gcloud compute addresses create whereami-ip \
        --global \
        --project PROJECT_ID
    
  2. Buat sertifikat yang ditandatangani sendiri untuk domain where-example-com:

    openssl genrsa -out key.pem 2048
    cat <<EOF >ca.conf
    [req]
    default_bits              = 2048
    req_extensions            = extension_requirements
    distinguished_name        = dn_requirements
    prompt                    = no
    [extension_requirements]
    basicConstraints          = CA:FALSE
    keyUsage                  = nonRepudiation, digitalSignature, keyEncipherment
    subjectAltName            = @sans_list
    [dn_requirements]
    0.organizationName        = example
    commonName                = where.example.com
    [sans_list]
    DNS.1                     = where.example.com
    EOF
    
    openssl req -new -key key.pem \
        -out csr.pem \
        -config ca.conf
    
    openssl x509 -req \
        -signkey key.pem \
        -in csr.pem \
        -out cert.pem \
        -extfile ca.conf \
        -extensions extension_requirements \
        -days 365
    
    gcloud compute ssl-certificates create where-example-com \
        --certificate=cert.pem \
        --private-key=key.pem \
        --global \
        --project PROJECT_ID
    

    Ada banyak cara untuk membuat sertifikat TLS. Dapat secara manual yang dihasilkan pada baris perintah, yang dihasilkan menggunakan Sertifikat yang dikelola Google, atau dapat dihasilkan secara internal oleh infrastruktur kunci publik perusahaan Anda (PKI). Dalam contoh ini, Anda secara manual membuat CA {i>root<i}. Meskipun sertifikat yang ditandatangani sendiri biasanya tidak digunakan untuk layanan masyarakat, hal ini menunjukkan konsep-konsep ini dengan lebih mudah.

    Untuk informasi selengkapnya tentang cara membuat sertifikat yang ditandatangani sendiri melalui Rahasia Kubernetes, lihat Mengamankan Gateway.

  3. Update gateway.yaml dengan manifes berikut:

    kind: Gateway
    apiVersion: gateway.networking.k8s.io/v1beta1
    metadata:
      name: servicemesh-cloud-gw
      namespace: istio-ingress
    spec:
      gatewayClassName: asm-l7-gxlb
      listeners:
      - name: http
        protocol: HTTP
        port: 80
        allowedRoutes:
          namespaces:
            from: All
      - name: https
        protocol: HTTPS
        port: 443
        allowedRoutes:
          namespaces:
            from: All
        tls:
          mode: Terminate
          options:
            networking.gke.io/pre-shared-certs: where-example-com
      addresses:
      - type: NamedAddress
        value: whereami-ip
    
  4. Deploy ulang Gateway di cluster Anda:

    kubectl apply -f gateway.yaml
    
  5. Dapatkan alamat IP dari IP statis:

    VIP=$(gcloud compute addresses describe whereami-ip --global --format="value(address)")
    
  6. Gunakan curl untuk mengakses domain Gateway. Karena DNS tidak dikonfigurasi untuk domain ini, gunakan opsi --resolve untuk memberi tahu curl agar me-resolve domain ke alamat IP Gateway:

    curl https://where.example.com --resolve where.example.com:443:${VIP} --cacert cert.pem -v
    

    Setelah selesai, output-nya akan mirip dengan:

    ...
    * TLSv1.2 (OUT), TLS handshake, Client hello (1):
    * TLSv1.2 (IN), TLS handshake, Server hello (2):
    * TLSv1.2 (IN), TLS handshake, Certificate (11):
    * TLSv1.2 (IN), TLS handshake, Server key exchange (12):
    * TLSv1.2 (IN), TLS handshake, Server finished (14):
    * TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
    * TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
    * TLSv1.2 (OUT), TLS handshake, Finished (20):
    * TLSv1.2 (IN), TLS change cipher, Change cipher spec (1):
    * TLSv1.2 (IN), TLS handshake, Finished (20):
    * SSL connection using TLSv1.2 / ECDHE-RSA-CHACHA20-POLY1305
    * ALPN, server accepted to use h2
    * Server certificate:
    *  subject: O=example; CN=where.example.com
    *  start date: Apr 19 15:54:50 2021 GMT
    *  expire date: Apr 19 15:54:50 2022 GMT
    *  common name: where.example.com (matched)
    *  issuer: O=example; CN=where.example.com
    *  SSL certificate verify ok.
    ...
    {
      "cluster_name": "gke1",
      "host_header": "where.example.com",
      "metadata": "where-v1",
      "node_name": "gke-gw-default-pool-51ccbf30-yya8.c.agmsb-k8s.internal",
      "pod_name": "where-v1-84b47c7f58-tj5mn",
      "pod_name_emoji": "😍",
      "project_id": "agmsb-k8s",
      "timestamp": "2021-04-19T16:30:08",
      "zone": "us-west1-a"
    }
    

Output panjang mencakup TLS handshake yang berhasil diikuti dengan respons dari aplikasi seperti output berikut. Ini membuktikan bahwa TLS sedang dihentikan di {i>Gateway<i} dengan benar dan aplikasi merespons klien Anda dengan aman.

Anda telah berhasil men-deploy arsitektur berikut:

Arsitektur ASM

servicemesh-cloud-gw dan GatewayClass asm-l7-gxlb-nya telah memisahkan beberapa komponen infrastruktur internal untuk menyederhanakan pengalaman pengguna. Cloud Load Balancing menghentikan traffic TLS menggunakan sertifikat internal dan juga health check lapisan proxy gateway masuk Cloud Service Mesh. Tujuan whereami-route di-deploy di Aplikasi & Deployment Pemilihan Rute mengonfigurasi Proxy gateway masuk Cloud Service Mesh untuk merutekan traffic ke jalur masuk yang benar dan layanan yang dihosting mesh.

Langkah selanjutnya