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

Application Gateway pro kontejnery umožňuje vrátit odpověď přesměrování klientovi na základě tří aspektů adresy URL: protokol, název hostitele a cesta. Pro každé přesměrování se může klientovi vrátit definovaný stavový kód HTTP, který definuje povahu přesměrování.

Podrobnosti využití

Přesměrování adres URL využívají filtr pravidel RequestRedirect definovaný rozhraním API brány Kubernetes.

Přesměrování

Přesměrování nastaví stavový kód odpovědi vrácený klientům, aby porozuměl účelu přesměrování. Podporují se následující typy přesměrování:

  • 301 (přesunuto trvale): Označuje, že cílový prostředek má přiřazen nový trvalý identifikátor URI. Budoucí odkazy na tento prostředek používají jednu z uzavřených identifikátorů URI. Použijte stavový kód 301 pro přesměrování HTTP na HTTPS.
  • 302 (nalezeno): Označuje, že cílový prostředek je dočasně pod jiným identifikátorem URI. Vzhledem k tomu, že přesměrování se může občas změnit, měl by klient dál používat efektivní identifikátor URI požadavku pro budoucí požadavky.

Možnosti přesměrování

  • Přesměrování protokolu se běžně používá k tomu, aby klientovi řekl, aby se přesměroval z nešifrovaného schématu provozu na provoz, jako je přesměrování HTTP na HTTPS.

  • Přesměrování názvu hostitele odpovídá plně kvalifikovanému názvu domény (fqdn) požadavku. To se běžně vyskytuje při přesměrování starého názvu domény na nový název domény; contoso.com například do fabrikam.com.

  • Přesměrování cesty má dvě různé varianty: prefix a full.

    • Prefix Typ přesměrování přesměruje všechny požadavky začínající definovanou hodnotou. Například: předpona /shop by odpovídala /shop a jakýkoli text za. Například /shop, /shop/checkout a /shop/item-a by se všechny přesměrovaly na /shop.
    • Full typ přesměrování odpovídá přesné hodnotě. Například: /shop by mohl přesměrovat na /store, ale /shop/checkout by nepřesměrovává na /store.

Následující obrázek znázorňuje příklad požadavku určeného pro přesměrování contoso.com/summer-promotion na contoso.com/shop/category/5. Kromě toho se vrátí druhý požadavek iniciovaný na contoso.com přes protokol HTTP, který zahájí nové připojení ke své variantě https.

A diagram showing the Application Gateway for Containers returning a redirect URL to a client.

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 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
      - name: https-listener
        port: 443
        protocol: HTTPS
        allowedRoutes:
          namespaces:
            from: Same
        tls:
          mode: Terminate
          certificateRefs:
          - kind : Secret
            group: ""
            name: listener-tls-secret
    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

Vytvořte prostředek HTTPRoute, který contoso.com zpracovává provoz přijatý přes https.

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

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

Po vytvoření brány vytvořte prostředek HTTPRoute pro contoso.com filtr RequestRedirect, který přesměruje provoz HTTP na https.

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

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

Vytvořte prostředek HTTPRoute, který contoso.com zpracovává přesměrování cesty /summer-promotion na konkrétní adresu URL. Odstraněním názvu oddílu, který je ukázaný v prostředcích HTTPRoute http na https, se toto pravidlo přesměrování vztahuje na požadavky HTTP i HTTPS.

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

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ž zadáte indikátor názvu serveru pomocí příkazu curl, http://contoso.com měla by vrátit odpověď ze služby Application Gateway for Containers s hlavičkou location definující přesměrování https://contoso.comna adresu 301 .

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

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

* 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

Při zadání indikátoru názvu serveru pomocí příkazu https://contoso.com/summer-promotion curl by služba Application Gateway pro kontejnery měla vrátit přesměrování https://contoso.com/shop/category/5na adresu 302 .

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

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

> 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

Blahopřejeme, nainstalovali jste kontroler ALB, nasadili back-endovou aplikaci a pomocí rozhraní API brány nakonfigurovali přesměrování HTTP na HTTPS a přesměrování na základě cest na konkrétní požadavky klientů.