Aracılığıyla paylaş


Kapsayıcılar için Azure Uygulaması Lication Gateway IÇIN URL Yeniden Yazma - Ağ Geçidi API'si

Kapsayıcılar için Application Gateway, isteklerin ana bilgisayar adı ve/veya yolu da dahil olmak üzere bir istemci isteğinin URL'sini yeniden yazmanızı sağlar. Kapsayıcılar için Application Gateway arka uç hedefine yönelik isteği başlattığında, istek isteği başlatmak için yeni yeniden yazılan URL'yi içerir.

Kullanım ayrıntıları

URL Yeniden Yazma, Kubernetes Ağ Geçidi API'si tarafından tanımlanan filtrelerden yararlanıyor.

Background

URL yeniden yazma, bir arka uç hedefine başlatıldığında gelen isteği farklı bir URL'ye çevirmenizi sağlar.

Aşağıdaki şekilde, contoso.com/shop contoso.com/ecommerce'a yeniden yazılmasını hedefleyen bir istek örneği gösterilmektedir. İstek, Kapsayıcılar için Application Gateway tarafından arka uç hedefine başlatılır:

A diagram showing the Application Gateway for Containers rewriting a URL to the backend.

Ö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ı 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 kubectl apply -f https://trafficcontrollerdocs.blob.core.windows.net/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 bir test-infra hizmet
    • Ad alanında çağrılan echo bir test-infra dağıtım
    • Ad alanında çağrılan listener-tls-secret bir test-infra 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
    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

Ağ geçidi oluşturulduktan sonra için contoso.combir HTTPRoute kaynağı oluşturun. Bu örnek, 'a contoso.com/shop gönderilen trafiğin arka uç hedefine olarak contoso.com/ecommerce başlatılmasını sağlar.

kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: rewrite-example
  namespace: test-infra
spec:
  parentRefs:
  - name: gateway-01
  hostnames:
  - "contoso.com"
  rules:
    - matches:
        - path:
            type: PathPrefix
            value: /shop
      filters:
        - type: URLRewrite
          urlRewrite:
            path:
              type: ReplacePrefixMatch
              replacePrefixMatch: /ecommerce
      backendRefs:
        - name: backend-v1
          port: 8080
    - backendRefs:
        - name: backend-v2
          port: 8080
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, contoso.com/shop arka uç-v1 hizmetinden istenen arka uç hedef yolunun gösterildiği contoso.com/ecommercebir yanıt döndürmelidir.

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

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

{
 "path": "/ecommerce",
 "host": "contoso.com",
 "method": "GET",
 "proto": "HTTP/1.1",
 "headers": {
  "Accept": [
   "*/*"
  ],
  "User-Agent": [
   "curl/7.81.0"
  ],
  "X-Forwarded-For": [
   "xxx.xxx.xxx.xxx"
  ],
  "X-Forwarded-Proto": [
   "http"
  ],
  "X-Request-Id": [
   "dcd4bcad-ea43-4fb6-948e-a906380dcd6d"
  ]
 },
 "namespace": "test-infra",
 "ingress": "",
 "service": "",
 "pod": "backend-v1-5b8fd96959-f59mm"
}

Curl komutunu kullanarak sunucu adı göstergesini belirttiğinizde, contoso.com backend-v2 hizmetinden bir yanıt döndürmelidir.

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

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

{
 "path": "/",
 "host": "contoso.com",
 "method": "GET",
 "proto": "HTTP/1.1",
 "headers": {
  "Accept": [
   "*/*"
  ],
  "User-Agent": [
   "curl/7.81.0"
  ],
  "X-Forwarded-For": [
   "xxx.xxx.xxx.xxx"
  ],
  "X-Forwarded-Proto": [
   "http"
  ],
  "X-Request-Id": [
   "adae8cc1-8030-4d95-9e05-237dd4e3941b"
  ]
 },
 "namespace": "test-infra",
 "ingress": "",
 "service": "",
 "pod": "backend-v2-594bd59865-ppv9w"
}

Tebrikler, Kapsayıcılar için Application Gateway'de trafik hedefe ayarlanmadan önce ALB Denetleyicisi'ni yüklediniz, bir arka uç uygulaması dağıttınız ve istenen istemci URL'sini yeniden yazmak için filtrelemeyi kullandınız.