Sdílet prostřednictvím


Přepsání adresy URL pro bránu Aplikace Azure lication 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:

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, která předvede podporu rozdělení provozu nebo váženého kruhového dotazová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
    

    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 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 ovladač ALB a nasadili jste back-endovou aplikaci, která zahrnuje filtrování pro přepsání požadované adresy URL klienta. Cíl ve službě Application Gateway pro kontejnery je připravený přijímat provoz.