Sdílet prostřednictvím


Přepsání adresy URL pro bránu Aplikace Azure lication pro kontejnery – rozhraní API pro příchozí přenos dat

Application Gateway for Containers umožňuje přepsat adresu URL požadavku klienta, včetně názvu hostitele požadavků nebo cesty. Když služba Application Gateway for Containers zahájí požadavek na back-endový cíl, požadavek obsahuje nově přepsanou adresu URL, která požadavek zahájí.

Podrobnosti využití

Přepsání adres URL využívá vlastní prostředek IngressExtension služby Application Gateway pro kontejnery.

Pozadí

Přepsání adresy URL umožňuje přeložit příchozí požadavek na jinou adresu URL při zahájení do back-endového cíle.

Následující obrázek znázorňuje požadavek určený pro contoso.com/shop přepsání na contoso.com/ecommerce při zahájení požadavku do back-endového cíle službou Application Gateway for Containers:

Diagram znázorňující službu Application Gateway for Containers, která přepisuje adresu URL na back-end

Požadavky

  1. Pokud sledujete strategii nasazení BYO, ujistěte se, že jste nastavili prostředky služby Application Gateway pro kontejnery a řadič ALB.
  2. Pokud sledujete strategii nasazení spravovaného albem, ujistěte se, že zřídíte kontroler ALB a zřídíte prostředky Application Gateway pro kontejnery prostřednictvím vlastního prostředku ApplicationLoadBalancer.
  3. Nasazení ukázkové aplikace HTTP:
    Pomocí následujícího souboru deployment.yaml v clusteru vytvořte ukázkovou webovou aplikaci pro předvedení cesty, dotazu a směrování na základě hlaviček.
kubectl apply -f https://raw.githubusercontent.com/MicrosoftDocs/azure-docs/refs/heads/main/articles/application-gateway/for-containers/examples/traffic-split-scenario/deployment.yaml

Tento příkaz vytvoří v clusteru následující:

  • Obor názvů s názvem test-infra
  • Dvě volané backend-v1 služby a backend-v2 v test-infra oboru názvů
  • Volali backend-v1 se dvě nasazení a backend-v2 v test-infra oboru názvů

Nasazení požadovaných prostředků rozhraní API příchozího přenosu dat

  1. Vytvoření příchozího přenosu dat, který zachytí veškerý provoz a trasy do back-end-v2
kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-01
  namespace: test-infra
  annotations:
    alb.networking.azure.io/alb-name: alb-test
    alb.networking.azure.io/alb-namespace: alb-test-infra
spec:
  ingressClassName: azure-alb-external
  rules:
    - host: contoso.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: backend-v2
                port:
                  number: 8080
EOF
  1. Vytvoření příchozího přenosu dat, který odpovídá předponě /shopu, která směruje na back-end-v1
kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-02
  namespace: test-infra
  annotations:
    alb.networking.azure.io/alb-name: alb-test
    alb.networking.azure.io/alb-namespace: alb-test-infra
    alb.networking.azure.io/alb-ingress-extension: url-rewrite
spec:
  ingressClassName: azure-alb-external
  rules:
    - host: contoso.com
      http:
        paths:
          - path: /shop
            pathType: Prefix
            backend:
              service:
                name: backend-v1
                port:
                  number: 8080
EOF

Poznámka:

Když kontroler ALB vytvoří prostředky Application Gateway pro kontejnery v ARM, použije pro front-endový prostředek následující zásady vytváření názvů: fe-8< náhodně vygenerované znaky.>

Pokud chcete změnit název front-endu vytvořeného v Azure, zvažte použití vlastní strategie nasazení.

Po vytvoření každého prostředku příchozího přenosu dat se ujistěte, že je stav platný, naprogramuje se naslouchací proces a brána má přiřazenou adresu.

kubectl get ingress ingress-01 -n test-infra -o yaml
kubectl get ingress ingress-02 -n test-infra -o yaml

Příklad výstupu jednoho z prostředků příchozího přenosu dat

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.networking.azure.io/alb-frontend: FRONTEND_NAME
    alb.networking.azure.io/alb-id: /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/yyyyyyyy/providers/Microsoft.ServiceNetworking/trafficControllers/zzzzzz
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"networking.k8s.io/v1","kind":"Ingress","metadata":{"annotations":{"alb.networking.azure.io/alb-frontend":"FRONTEND_NAME","alb.networking.azure.io/alb-id":"/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/yyyyyyyy/providers/Microsoft.ServiceNetworking/trafficControllers/zzzzzz"},"name"
:"ingress-01","namespace":"test-infra"},"spec":{"ingressClassName":"azure-alb-external","rules":[{"host":"contoso.com","http":{"paths":[{"backend":{"service":{"name":"backend-v2","port":{"number":8080}}},"path":"/","pathType":"Prefix"}]}}]}}
  creationTimestamp: "2023-07-22T18:02:13Z"
  generation: 2
  name: ingress-01
  namespace: test-infra
  resourceVersion: "278238"
  uid: 17c34774-1d92-413e-85ec-c5a8da45989d
spec:
  ingressClassName: azure-alb-external
  rules:
  - host: contoso.com
    http:
      paths:
      - backend:
          service:
            name: backend-v2
            port:
              number: 8080
        path: /
        pathType: Prefix
status:
  loadBalancer:
    ingress:
    - hostname: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.fzyy.alb.azure.com
      ports:
      - port: 80
        protocol: TCP

Při vytvoření příchozího přenosu dat vytvořte prostředek IngressExtension pro contoso.com. Tento příklad zajišťuje, že se provoz odesílaný contoso.com/shop do back-endového cíle inicializoval contoso.com/ecommerce .

kubectl apply -f - <<EOF
apiVersion: alb.networking.azure.io/v1
kind: IngressExtension
metadata:
  name: url-rewrite
  namespace: test-infra
spec:
  rules:
    - host: contoso.com
      rewrites:
      - type: URLRewrite
        urlRewrite:
          path:
            type: ReplacePrefixMatch
            replacePrefixMatch: /ecommerce
EOF

Po vytvoření prostředku IngressExtension se ujistěte, že prostředek IngressExtension zobrazuje akceptovaný prostředek a naprogramuje se prostředek Application Gateway for Containers.

kubectl get IngressExtension url-rewrite -n test-infra -o yaml

Ověřte, že se prostředek Application Gateway for Containers úspěšně aktualizoval pro ingressExtension.

Otestování přístupu k aplikaci

Teď jsme připraveni odeslat nějaký provoz do ukázkové aplikace prostřednictvím plně kvalifikovaného názvu domény přiřazeného front-endu. K získání plně kvalifikovaného názvu domény použijte následující příkaz.

fqdn=$(kubectl get ingress ingress-01 -n test-infra -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')

Pokud zadáte indikátor contoso.com/shop názvu serveru pomocí příkazu curl, vrátí se odpověď ze služby back-end-v1 s požadovanou cestou k cílovému back-endu.contoso.com/ecommerce

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

Prostřednictvím odpovědi bychom měli vidět:

{
 "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"
}

Pokud pomocí příkazu curl zadáte indikátor contoso.com názvu serveru, vrátí se odpověď ze služby back-end-v2, jak je znázorněno.

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

Měla by se zobrazit následující odpověď:

{
 "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"
}

Blahopřejeme, nainstalovali jste kontroler ALB, nasadili back-endovou aplikaci a použili ingressExtension k přepsání požadované adresy URL klienta před nastavením provozu na cíl ve službě Application Gateway for Containers.