Aracılığıyla paylaş


Kapsayıcılar için Uygulama Ağ Geçidi ile yol, üst bilgi ve sorgu dizesi yönlendirmesi - Gateway API

Bu belge URL yolunu, sorgu dizesini ve üst bilgiyi temel alan trafik yönlendirmesini göstermek için Ağ Geçidi API'sindeki kaynakları kullanan örnek bir uygulama ayarlamanıza yardımcı olur. Aşağıdaki amaçlar için adımlar sağlanmıştır:

  • Bir HTTPS dinleyicisi ile bir Ağ Geçidi kaynağı oluşturun.
  • Arka uç hizmetine başvuran bir HTTPRoute kaynağı oluşturun.
  • HTTPRouteMatch kullanarak yolu, üst bilgiyi ve sorgu dizesini temel alarak yönlendirme yapın.

Arka plan

Kapsayıcılar için Application Gateway, URL yolu, sorgu dizesi ve üst bilgi temelinde trafik yönlendirmesini etkinleştirir. Aşağıdaki örnek senaryoya bakın:

Application Gateway for Containers ile yol, üst bilgi ve sorgu dizesi yönlendirmesini gösteren bir şekil.

Önkoşullar

  1. BYO dağıtım stratejisini izliyorsanız Kapsayıcılar için Application Gateway kaynaklarınızı ve ALB Denetleyicisi'ni ayarladığınızdan emin olun

  2. ALB yönetilen dağıtım stratejisini izliyorsanız, ALB Denetleyicinizi sağladığınızdan ve ApplicationLoadBalancer özel kaynağı aracılığıyla Kapsayıcılar için Application Gateway kaynaklarını sağladığınızdan emin olun.

  3. Örnek HTTP uygulamasını dağıtma Yol, sorgu ve üst bilgi tabanlı yönlendirmeyi göstermek üzere örnek bir web uygulaması oluşturmak için kümenize aşağıdaki deployment.yaml dosyasını uygulayın.

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

    Bu komut kümenizde aşağıdakileri oluşturur:

    • adlı bir ad alanı test-infra
    • backend-v1 ad alanındaki backend-v2 ve test-infra adlı iki hizmet
    • backend-v1 ve backend-v2 adlı iki dağıtım, test-infra ad alanında

Gerekli Ağ Geçidi API kaynaklarını dağıtın.

Ağ geçidi oluşturma:

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

Uyarı

ALB Denetleyicisi Azure Resource Manager'da Kapsayıcılar için Application Gateway kaynaklarını oluşturduğunda, bir ön uç kaynağı için aşağıdaki adlandırma kuralını kullanır: fe-<eight randomly generated characters>.

Azure'da oluşturulan ön uç kaynağının adını değiştirmek istiyorsanız , kendi dağıtım stratejinizi getirin seçeneğini izleyin.

Ağ geçidi kaynağı oluşturulduktan sonra durumun geçerli olduğundan, dinleyicinin Programlandığından ve ağ geçidine bir adres atandığından emin olun.

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

Başarılı ağ geçidi oluşturma işleminin örnek çıktısı.

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

Ağ geçidi oluşturulduktan sonra, iki farklı eşleşme tanımlamak için bir HTTPRoute ve trafiğin yönlendirildiği varsayılan bir hizmet oluşturun.

Aşağıdaki kuralların okunma şekli aşağıdaki gibidir:

  1. Yol /bar ise, trafik 8080 numaralı bağlantı noktası üzerinden backend-v2 hizmetine yönlendirilir.
  2. İstekte magic adı ve foo değerini içeren bir HTTP üst bilgisi varsa, URL bir sorgu dizesi içerecek şekilde great adı example değeriyle tanımlanmışsa ve yol /some/thing ise, istek 8080 numaralı bağlantı noktasında backend-v2'ye gönderilir.
  3. Aksi takdirde, diğer tüm istekler 8080 numaralı bağlantı noktasındaki backend-v1 hizmetine yönlendirilir.
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

Tip

Kapsayıcılar için Application Gateway, headers, queryParams ve path kuralları için Normal İfade 2 (RE2) söz dizimini kullanarak normal ifade eşleştirmeyi destekler. Daha fazla bilgi Ağ Geçidi API belirtiminde bulunabilir.

HTTPRoute kaynağı oluşturulduktan sonra yolun Kabul Edildi ve Kapsayıcılar için Uygulama Ağ Geçidi kaynağının Programlandığından emin olun.

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

Kapsayıcılar için Application Gateway kaynağının durumunun başarıyla güncelleştirildiğini doğrulayın.

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

Uygulamaya erişimi test etme

Artık ön uçta atanan FQDN aracılığıyla örnek uygulamamıza trafik göndermeye hazırız. FQDN'yi almak için aşağıdaki komutu kullanın.

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

curl komutunu kullanarak üç farklı senaryoyu doğrulayabiliriz:

Yol tabanlı yönlendirme

Bu senaryoda, gönderilen http://frontend-fqdn/bar istemci isteği backend-v2 hizmetine yönlendirilir.

Aşağıdaki komutu çalıştırın:

curl http://$fqdn/bar

İsteği sunan kapsayıcının backend-v2 olduğuna dikkat edin.

Sorgu dizesi + üst bilgi + yol yönlendirme

Bu senaryoda, "magic: foo" öğesinin üst bilgi anahtarı/değer bölümüyle gönderilen http://frontend-fqdn/some/thing?great=example istemci isteği backend-v2 hizmetine yönlendirilir.

Aşağıdaki komutu çalıştırın:

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

İsteği sunan kapsayıcının backend-v2 olduğuna dikkat edin.

Varsayılan yol

İlk iki senaryodan hiçbiri karşılanmazsa, Kapsayıcılar için Application Gateway diğer tüm istekleri backend-v1 hizmetine yönlendirir.

Aşağıdaki komutu çalıştırın:

curl http://$fqdn/

İsteği sunan kapsayıcının backend-v1 olduğuna dikkat edin.

Tebrikler, ALB Denetleyicisi'ni yüklediniz, bir arka uç uygulaması dağıttınız ve kapsayıcılar için Application Gateway'de Ağ Geçidi API'sini kullanarak trafiği uygulamaya yönlendirdiniz.