Bagikan melalui


Penerusan jalur, header, dan kueri string dengan Gerbang Aplikasi untuk Kontainer - API Gerbang

Dokumen ini membantu Anda menyiapkan aplikasi contoh yang menggunakan sumber daya dari Gateway API untuk menunjukkan perutean lalu lintas berdasarkan jalur URL, string kueri, dan header. Langkah-langkah disediakan untuk:

  • Buat sumber daya Gateway dengan satu pendengar HTTPS.
  • Buat sumber daya HTTPRoute yang mereferensikan layanan backend.
  • Gunakan HTTPRouteMatch untuk melakukan matches rute tersebut berdasarkan string jalur, header, dan kueri.

Latar Belakang

Gerbang Aplikasi untuk Kontainer memungkinkan pengaturan lalu lintas berdasarkan path URL, string kueri, dan header. Lihat contoh skenario berikut:

Gambar yang memperlihatkan perutean jalur, header, dan string kueri dengan Application Gateway untuk Kontainer.

Prasyarat

  1. Jika mengikuti strategi penyebaran BYO, pastikan Anda telah menyiapkan Application Gateway untuk sumber daya Kontainer dan Pengontrol ALB

  2. Jika mengikuti strategi penyebaran terkelola ALB, pastikan Anda telah memprovisikan Pengontrol ALB dan menyediakan application Gateway untuk sumber daya Kontainer melalui sumber daya kustom ApplicationLoadBalancer.

  3. Sebarkan contoh aplikasi HTTP Terapkan file deployment.yaml berikut pada kluster Anda untuk membuat aplikasi web sampel untuk mendemonstrasikan perutean berbasis jalur, kueri, dan header.

    kubectl apply -f https://raw.githubusercontent.com/MicrosoftDocs/azure-docs/refs/heads/main/articles/application-gateway/for-containers/examples/traffic-split-scenario/deployment.yaml
    

    Perintah ini membuat yang berikut ini pada kluster Anda:

    • sebuah namespace bernama test-infra
    • dua layanan bernama backend-v1 dan backend-v2 di namespace test-infra
    • dua deployment yang dipanggil backend-v1 dan backend-v2 di ruang nama test-infra

Menyebarkan sumber daya API Gateway yang diperlukan

Buat gateway:

kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1beta1
kind: Gateway
metadata:
  name: gateway-01
  namespace: test-infra
  annotations:
    alb.networking.azure.io/alb-namespace: alb-test-infra
    alb.networking.azure.io/alb-name: alb-test
spec:
  gatewayClassName: azure-alb-external
  listeners:
  - name: http-listener
    port: 80
    protocol: HTTP
    allowedRoutes:
      namespaces:
        from: Same
EOF

Nota

Saat Pengontrol ALB membuat Application Gateway untuk sumber daya kontainer di Azure Resource Manager, pengontrol menggunakan konvensi penamaan berikut untuk sumber daya frontend: fe-<eight randomly generated characters>.

Jika Anda ingin mengubah nama sumber daya frontend yang dibuat di Azure, pertimbangkan untuk mengikuti strategi penyebaran bawaan Anda sendiri.

Setelah sumber daya gateway dibuat, pastikan statusnya valid, pendengar diprogram, dan alamat ditetapkan ke gateway.

kubectl get gateway gateway-01 -n test-infra -o yaml

Contoh output pembuatan gateway yang berhasil.

status:
  addresses:
  - type: Hostname
    value: xxxx.yyyy.alb.azure.com
  conditions:
  - lastTransitionTime: "2023-06-19T21:04:55Z"
    message: Valid Gateway
    observedGeneration: 1
    reason: Accepted
    status: "True"
    type: Accepted
  - lastTransitionTime: "2023-06-19T21:04:55Z"
    message: Application Gateway For Containers resource has been successfully updated.
    observedGeneration: 1
    reason: Programmed
    status: "True"
    type: Programmed
  listeners:
  - attachedRoutes: 0
    conditions:
    - lastTransitionTime: "2023-06-19T21:04:55Z"
      message: ""
      observedGeneration: 1
      reason: ResolvedRefs
      status: "True"
      type: ResolvedRefs
    - lastTransitionTime: "2023-06-19T21:04:55Z"
      message: Listener is accepted
      observedGeneration: 1
      reason: Accepted
      status: "True"
      type: Accepted
    - lastTransitionTime: "2023-06-19T21:04:55Z"
      message: Application Gateway For Containers resource has been successfully updated.
      observedGeneration: 1
      reason: Programmed
      status: "True"
      type: Programmed
    name: https-listener
    supportedKinds:
    - group: gateway.networking.k8s.io
      kind: HTTPRoute

Setelah gateway dibuat, buat HTTPRoute untuk menentukan dua kecocokan yang berbeda dan layanan default untuk merutekan lalu lintas.

Cara membaca aturan berikut adalah sebagai berikut:

  1. Jika jalur adalah /bar, lalu lintas dirutekan ke layanan backend-v2 pada port 8080 OR
  2. Jika permintaan berisi header HTTP dengan nama magic dan nilai foo, serta URL berisi string kueri yang mendefinisikan nama great dengan nilai example, dan jalurnya /some/thing, maka permintaan dikirim ke backend-v2 pada port 8080.
  3. Jika tidak, semua permintaan lainnya dirutekan ke layanan backend-v1 pada port 8080.
kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
  name: http-route
  namespace: test-infra
spec:
  parentRefs:
  - name: gateway-01
    namespace: test-infra
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /bar
    backendRefs:
    - name: backend-v2
      port: 8080
  - matches:
    - headers:
      - type: Exact
        name: magic
        value: foo
      queryParams:
      - type: Exact
        name: great
        value: example
      path:
        type: PathPrefix
        value: /some/thing
      method: GET
    backendRefs:
    - name: backend-v2
      port: 8080
  - backendRefs:
    - name: backend-v1
      port: 8080
EOF

Petunjuk / Saran

Application Gateway untuk Container mendukung pencocokan ekspresi reguler untuk headers, queryParams, dan path aturan dengan sintaks Ekspresi Reguler 2 (RE2). Informasi selengkapnya dapat ditemukan dalam spesifikasi API Gateway.

Setelah sumber daya HTTPRoute dibuat, pastikan rute telah Diterima dan sumber daya Application Gateway for Containers telah Diprogram.

kubectl get httproute http-route -n test-infra -o yaml

Verifikasi status sumber daya Application Gateway for Containers telah berhasil diperbarui.

status:
  parents:
  - conditions:
    - lastTransitionTime: "2023-06-19T22:18:23Z"
      message: ""
      observedGeneration: 1
      reason: ResolvedRefs
      status: "True"
      type: ResolvedRefs
    - lastTransitionTime: "2023-06-19T22:18:23Z"
      message: Route is Accepted
      observedGeneration: 1
      reason: Accepted
      status: "True"
      type: Accepted
    - lastTransitionTime: "2023-06-19T22:18:23Z"
      message: Application Gateway For Containers resource has been successfully updated.
      observedGeneration: 1
      reason: Programmed
      status: "True"
      type: Programmed
    controllerName: alb.networking.azure.io/alb-controller
    parentRef:
      group: gateway.networking.k8s.io
      kind: Gateway
      name: gateway-01
      namespace: test-infra

Menguji akses ke aplikasi

Sekarang kami siap untuk mengarahkan lalu lintas ke aplikasi sampel kami, melalui FQDN yang diberikan ke frontend. Gunakan perintah berikut untuk mendapatkan FQDN.

fqdn=$(kubectl get gateway gateway-01 -n test-infra -o jsonpath='{.status.addresses[0].value}')

Dengan menggunakan perintah curl, kita dapat memvalidasi tiga skenario berbeda:

Perutean berbasis jalur

Dalam skenario ini, permintaan klien yang dikirim ke http://frontend-fqdn/bar dirutekan ke layanan backend-v2.

Jalankan perintah berikut:

curl http://$fqdn/bar

Perhatikan bahwa kontainer yang melayani permintaan adalah backend-v2.

String kueri + header + perutean jalur

Dalam skenario ini, permintaan klien yang dikirim ke http://frontend-fqdn/some/thing?great=example dengan bagian header kunci/nilai "magic: foo" diteruskan ke layanan backend-v2.

Jalankan perintah berikut:

curl http://$fqdn/some/thing?great=example -H "magic: foo"

Perhatikan bahwa kontainer yang melayani permintaan adalah backend-v2.

Rute default

Jika tidak ada satu pun dari dua skenario pertama yang terpenuhi, Application Gateway untuk Kontainer akan merutekan semua permintaan lainnya ke layanan backend-v1.

Jalankan perintah berikut:

curl http://$fqdn/

Perhatikan bahwa kontainer yang melayani permintaan adalah backend-v1.

Selamat, Anda telah menginstal Pengontrol ALB, menyebarkan aplikasi backend, dan merutekan lalu lintas ke aplikasi melalui API Gateway di Application Gateway untuk Kontainer.