Přepsání adresy URL pro bránu Aplikace Azure pro kontejnery – rozhraní API brány

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á filtry definované rozhraním API brány Kubernetes.

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 příklad požadavku určeného k přepsání contoso.com/shop na contoso.com/ecommerce. Požadavek se zahájí do back-endového cíle službou Application Gateway pro kontejnery:

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

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 nasaďte ukázkový certifikát TLS, který předvede možnosti přesměrování.

    kubectl apply -f kubectl apply -f https://trafficcontrollerdocs.blob.core.windows.net/examples/https-scenario/ssl-termination/deployment.yaml
    

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

    • Obor názvů s názvem test-infra
    • Jedna služba volaná echo v test-infra oboru názvů
    • Jedno nasazení volané echo v test-infra oboru názvů
    • Jeden tajný klíč volaný listener-tls-secret v test-infra oboru názvů

Nasazení požadovaných prostředků rozhraní API brány

  1. Vytvoření brány

    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
    

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í prostředku brány se ujistěte, že je stav platný, naprogramuje se naslouchací proces a brána má přiřazenou adresu.

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

Příklad výstupu úspěšného vytvoření brány

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

Po vytvoření brány vytvořte prostředek HTTPRoute 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: 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

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

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

Ověřte, že se prostředek Služby Application Gateway pro kontejnery úspěšně aktualizoval pro každou službu HTTPRoute.

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

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 gateway gateway-01 -n test-infra -o jsonpath='{.status.addresses[0].value}')

Když pomocí příkazu curl zadáte indikátor názvu serveru, contoso.com/shop měla by vrátit 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"
}

Když zadáte indikátor názvu serveru pomocí příkazu curl, contoso.com měla by vrátit odpověď ze služby back-end-v2.

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

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

{
 "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 pomocí filtrování přepsali požadovanou adresu URL klienta před nastavením provozu na cíl ve službě Application Gateway for Containers.