Aracılığıyla paylaş


Kapsayıcılar için Azure Uygulaması Lication Gateway URL Yeniden Yönlendirmesi - Ağ Geçidi API'si

Kapsayıcılar için Application Gateway, url'nin üç yönüne göre istemciye yeniden yönlendirme yanıtı döndürmenizi sağlar: protokol, ana bilgisayar adı ve yol. Her yeniden yönlendirme için, yeniden yönlendirmenin doğasını tanımlamak için istemciye tanımlı bir HTTP durum kodu döndürülebilir.

Kullanım ayrıntıları

URL yeniden yönlendirmeleri, Kubernetes Ağ Geçidi API'si tarafından tanımlanan RequestRedirect kural filtresini kullanır.

Yönlendirme

Yeniden yönlendirme, yeniden yönlendirmenin amacını anlamak için istemcilere döndürülen yanıt durum kodunu ayarlar. Aşağıdaki yeniden yönlendirme türleri desteklenir:

  • 301 (Kalıcı olarak taşındı): Hedef kaynağa yeni bir kalıcı URI atandığını gösterir. Bu kaynağa yönelik gelecekteki başvurular, kapalı URI'lerden birini kullanır. HTTP'den HTTPS'ye yeniden yönlendirme için 301 durum kodunu kullanın.
  • 302 (Bulundu): Hedef kaynağın geçici olarak farklı bir URI altında olduğunu gösterir. Yeniden yönlendirme zaman zaman değişebileceğinden, istemci gelecekteki istekler için geçerli istek URI'sini kullanmaya devam etmelidir.

Yeniden yönlendirme özellikleri

  • Protokol yeniden yönlendirmesi genellikle istemciye şifrelenmemiş bir trafik düzeninden HTTP'den HTTPS'ye yeniden yönlendirme gibi trafiğe geçişini söylemek için kullanılır.

  • Ana bilgisayar adı yeniden yönlendirmesi, isteğin tam etki alanı adıyla (fqdn) eşleşir. Bu durum genellikle eski bir etki alanı adını yeni bir etki alanı adına yeniden yönlendirmede görülür; gibicontoso.com.fabrikam.com

  • Yol yeniden yönlendirmenin iki farklı değişkeni vardır: prefix ve full.

    • Prefix yeniden yönlendirme türü, tanımlı bir değerle başlayan tüm istekleri yeniden yönlendirir. Örneğin: /shop ön eki /shop ve sonrasındaki tüm metinler ile eşleşir. Örneğin, /shop, /shop/checkout ve /shop/item-a da /shop'a yönlendirilir.
    • Full yeniden yönlendirme türü tam bir değerle eşleşir. Örneğin: /shop /store'a yönlendirebilir, ancak /shop/checkout /store'a yönlendirilmezdi.

Aşağıdaki şekilde, contoso.com/summer-promotion contoso.com/shop/category/5 yönlendirilmesini hedefleyen bir istek örneği gösterilmektedir. Buna ek olarak, http protokolü aracılığıyla contoso.com için başlatılan ikinci bir istek, https değişkenine yeni bir bağlantı başlatmak için bir yeniden yönlendirme döndürülür.

İstemciye yeniden yönlendirme URL'si döndüren Kapsayıcılar için Application Gateway'i gösteren diyagram.

Ö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:

    Yeniden yönlendirme özelliklerini göstermek üzere örnek bir TLS sertifikası dağıtmak 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/https-scenario/ssl-termination/deployment.yaml
    

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

    • adlı bir ad alanı test-infra
    • ad alanında çağrılan echo test-infra bir hizmet
    • ad alanında test-infra adlı echo bir dağıtım
    • ad alanında test-infra adlı listener-tls-secret bir gizli dizi

Gerekli Ağ Geçidi API'sini dağıtma

  1. Ağ Geçidi Oluşturma

    kubectl apply -f - <<EOF
    apiVersion: gateway.networking.k8s.io/v1
    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
      - name: https-listener
        port: 443
        protocol: HTTPS
        allowedRoutes:
          namespaces:
            from: Same
        tls:
          mode: Terminate
          certificateRefs:
          - kind : Secret
            group: ""
            name: listener-tls-secret
    EOF
    

Not

ALB Denetleyicisi ARM'de Kapsayıcılar için Application Gateway kaynaklarını oluşturduğunda, bir ön uç kaynağı için şu adlandırma kuralını kullanır: fe-8< rastgele oluşturulan karakterler>

Azure'da oluşturulan ön ucun adını değiştirmek isterseniz kendi dağıtım stratejinizi getirin seçeneğini uygulamayı göz önünde bulundurun.

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

https aracılığıyla alınan trafiği işleyen bir HTTPRoute kaynağı contoso.com oluşturun.

kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: https-contoso
  namespace: test-infra
spec:
  parentRefs:
  - name: gateway-01
    sectionName: https-listener
  hostnames:
  - "contoso.com"
  rules:
  - backendRefs:
    - name: echo
      port: 80
EOF

HTTPRoute kaynağı oluşturulduğunda HTTPRoute kaynağının Kabul Edildi ve Kapsayıcılar için Application Gateway kaynağının Programlandığından emin olun.

kubectl get httproute rewrite-example -n test-infra -o yaml

Kapsayıcılar için Application Gateway kaynağının her HTTPRoute için başarıyla güncelleştirildiğinden emin olun.

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

Ağ geçidi oluşturulduktan sonra, http trafiğini https'ye yönlendiren requestRedirect filtresiyle için contoso.com bir HTTPRoute kaynağı oluşturun.

kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: http-to-https-contoso-redirect
  namespace: test-infra
spec:
  parentRefs:
  - name: gateway-01
    sectionName: http-listener
  hostnames:
  - "contoso.com"
  rules:
    - matches:
      filters:
        - type: RequestRedirect
          requestRedirect:
            scheme: https
            statusCode: 301
EOF

HTTPRoute kaynağı oluşturulduğunda HTTPRoute kaynağının Kabul Edildi ve Kapsayıcılar için Application Gateway kaynağının Programlandığından emin olun.

kubectl get httproute rewrite-example -n test-infra -o yaml

Kapsayıcılar için Application Gateway kaynağının her HTTPRoute için başarıyla güncelleştirildiğinden emin olun.

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

/summer-promotion yolunun belirli bir URL'ye yeniden yönlendirmesini işleyen bir HTTPRoute kaynağı contoso.com oluşturun. Http'den http'ye HTTPRoute kaynaklarında gösterildiği gibi sectionName ortadan kaldırılarak, bu yeniden yönlendirme kuralı hem HTTP hem de HTTPS istekleri için geçerlidir.

kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: summer-promotion-redirect
  namespace: test-infra
spec:
  parentRefs:
  - name: gateway-01
    sectionName: https-listener
  hostnames:
  - "contoso.com"
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /summer-promotion
    filters:
      - type: RequestRedirect
        requestRedirect:
          path:
            type: ReplaceFullPath
            replaceFullPath: /shop/category/5
          statusCode: 302
  - backendRefs:
    - name: echo
      port: 80
EOF

HTTPRoute kaynağı oluşturulduğunda HTTPRoute kaynağının Kabul Edildi ve Kapsayıcılar için Application Gateway kaynağının Programlandığından emin olun.

kubectl get httproute rewrite-example -n test-infra -o yaml

Kapsayıcılar için Application Gateway kaynağının her HTTPRoute için başarıyla güncelleştirildiğinden emin olun.

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 sunucu adı göstergesini belirttiğinizde, http://contoso.com Kapsayıcılar için Application Gateway'den 301 yeniden yönlendirmesi https://contoso.comtanımlayan bir üst bilgi içeren bir location yanıt döndürmelidir.

fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com/ -v

Yanıt aracılığıyla şu bilgileri görmemiz gerekir:

* Added contoso.com:80:xxx.xxx.xxx.xxx to DNS cache
* Hostname contoso.com was found in DNS cache
*   Trying xxx.xxx.xxx.xxx:80...
* Connected to contoso.com (xxx.xxx.xxx.xxx) port 80 (#0)
> GET / HTTP/1.1
> Host: contoso.com
> User-Agent: curl/7.81.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 301 Moved Permanently
< location: https://contoso.com/
< date: Mon, 26 Feb 2024 22:56:23 GMT
< server: Microsoft-Azure-Application-LB/AGC
< content-length: 0
<
* Connection #0 to host contoso.com left intact

Curl komutunu kullanarak sunucu adı göstergesini belirttiğinizde Kapsayıcılar https://contoso.com/summer-promotion için Application Gateway 302 yeniden yönlendirmesi https://contoso.com/shop/category/5döndürmelidir.

fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:443:$fqdnIp https://contoso.com/summer-promotion -v

Yanıt aracılığıyla şu bilgileri görmemiz gerekir:

> GET /summer-promotion HTTP/2
> Host: contoso.com
> user-agent: curl/7.81.0
> accept: */*
>
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* old SSL session ID is stale, removing
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
* TLSv1.2 (IN), TLS header, Supplemental data (23):
< HTTP/2 302
< location: https://contoso.com/shop/category/5
< date: Mon, 26 Feb 2024 22:58:43 GMT
< server: Microsoft-Azure-Application-LB/AGC
<
* Connection #0 to host contoso.com left intact

Tebrikler, ALB Denetleyicisi'ni yüklediniz, bir arka uç uygulaması dağıttınız ve ağ geçidi API'sini kullanarak hem HTTP'den HTTPS'ye yönlendirmeyi hem de belirli istemci isteklerine yol tabanlı yeniden yönlendirmeyi yapılandırdıysanız.