Freigeben über


Umleiten von URLs für Azure Application Gateway für Container – Gateway API

Mit Application Gateway für Container können Sie für die drei clientbasierten Aspekte einer URL – Protokoll, Hostname und Pfad – eine Umleitungsantwort zurückgeben. Für jede Umleitung kann ein definierter HTTP-Statuscode an den Client zurückgegeben werden, mit dem die Art der Umleitung definiert wird.

Nutzungsdetails

URL-Umleitungen nutzen den Filter der RequestRedirect-Regel, der von Kubernetes Gateway API definiert wird.

Umleitung

Eine Umleitung legt den Antwortstatuscode fest, der an den Client zurückgegeben wird, um über den Zweck der Umleitung zu informieren. Die folgenden Umleitungstypen werden unterstützt:

  • 301 (Permanent verschoben): Gibt an, dass der Zielressource ein neuer dauerhafter URI zugewiesen wird. Künftige Verweise auf diese Ressource verwenden einen der beigefügten URIs. Verwenden Sie den Statuscode 301 für die HTTP-HTTPS-Umleitung.
  • 302 Found (302 Gefunden) : Gibt an, dass sich die Zielressource vorübergehend unter einem anderen URI befindet. Da sich die Umleitung gelegentlich ändern kann, sollte der Client weiterhin den effektiven Anforderungs-URI für künftige Anforderungen verwenden.

Umleitungsfunktionen

  • Die Protokollumleitung wird häufig verwendet, damit der Client von einem Schema mit unverschlüsseltem Datenverkehr zu verschlüsseltem Datenverkehr wechselt, wie z. B. die Umleitung von HTTP zu HTTPS.

  • Die Hostnamenumleitung betrifft den vollqualifizierten Domänennamen (FQDN) der Anforderung. Sie wird häufig verwendet, um einen alten Domänennamen zu einem neuen umzuleiten, wie z. B. contoso.com zu fabrikam.com.

  • Bei der Pfadumleitung gibt es zwei verschiedene Varianten: prefix und full.

    • Der Umleitungstyp Prefix leitet alle Anforderungen um, die mit einem definierten Wert beginnen. Beispiel: Das Präfix „/shop“ betrifft sowohl „/shop“ als auch jeden nachfolgenden Text. So werden etwa „/shop“, „/shop/checkout“ als auch „shop/item-a“ jeweils zu „/shop“ umgeleitet.
    • Der Umleitungstyp Full betrifft einen exakten Wert. So kann etwa „/shop“ zu „/store“ umgeleitet werden, „shop/checkout“ jedoch nicht.

Die folgende Abbildung zeigt ein Beispiel für eine Anforderung, die an contoso.com/summer-promotion gerichtet ist und zu contoso.com/shop/category/5 umgeleitet wird. Darüber hinaus gibt eine zweite Anforderung, die über das HTTP-Protokoll an „contoso.com“ gerichtet ist, eine Umleitung zurück, um eine neue Verbindung über HTTPS zu initiieren.

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

Voraussetzungen

  1. Wenn Sie der BYO-Bereitstellungsstrategie folgen, stellen Sie sicher, dass Sie Ihre Ressourcen für Application Gateway für Container und den ALB-Controller eingerichtet haben.

  2. Wenn Sie der ALB-verwalteten Bereitstellungsstrategie folgen, stellen Sie sicher, dass Sie den ALB-Controller und die Ressourcen für Application Gateway für Container über die benutzerdefinierte ApplicationLoadBalancer-Ressource bereitstellen.

  3. Bereitstellen einer Beispiel-HTTP-Anwendung:

    Wenden Sie die folgende Datei „deployment.yaml“ auf Ihrem Cluster an, um ein TLS-Beispielzertifikat bereitzustellen und die Umleitungsfunktionen zu demonstrieren.

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

    Mit diesem Befehl wird Folgendes in Ihrem Cluster erstellt:

    • Ein Namespace mit dem Namen test-infra
    • ein Dienst, der im Namespace test-infra als echo bezeichnet wird
    • eine Bereitstellung, die im Namespace test-infra als echo bezeichnet wird
    • ein Geheimnis, das im Namespace test-infra als listener-tls-secret bezeichnet wird

Bereitstellen der erforderlichen Gateway-API-Ressourcen

  1. Erstellen eines Gateways

    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
    

Hinweis

Wenn der ALB-Controller die Application Gateway für Container-Ressourcen in ARM erstellt, verwendet er die folgende Benennungskonvention für eine Frontend-Ressource: „fe-<8 zufällig generierte Zeichen>“.

Wenn Sie den Namen des in Azure erstellten Frontends ändern möchten, sollten Sie die BYO-Bereitstellungsstrategie (Bring Your Own) befolgen.

Nachdem die Gatewayressource erstellt wurde, stellen Sie sicher, dass der Status gültig ist, dass der Listener programmiert ist und dem Gateway eine Adresse zugewiesen wird.

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

Beispielausgabe einer erfolgreichen Gatewayerstellung.

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

Erstellen Sie eine HTTPRoute-Ressource für contoso.com, die HTTPS-Datenverkehr verarbeitet.

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

Wenn die HTTPRoute-Ressource erstellt wird, stellen Sie sicher, dass sowohl HTTPRoute-Ressourcen akzeptiert als auch die Application Gateway für Container-Ressource programmiert sind.

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

Überprüfen Sie, ob die Application Gateway for Containers-Ressource für jede HTTPRoute erfolgreich aktualisiert wurde.

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

Nachdem das Gateway erstellt wurde, erstellen Sie eine HTTPRoute-Ressource für contoso.com mit einem RequestRedirect-Filter, um HTTP-Datenverkehr zu HTTPS umzuleiten.

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

Wenn die HTTPRoute-Ressource erstellt wird, stellen Sie sicher, dass sowohl HTTPRoute-Ressourcen akzeptiert als auch die Application Gateway für Container-Ressource programmiert sind.

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

Überprüfen Sie, ob die Application Gateway for Containers-Ressource für jede HTTPRoute erfolgreich aktualisiert wurde.

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

Erstellen Sie eine HTTPRoute-Ressource für contoso.com, die eine Umleitung für den Pfad „/summer-promotion“ zu einer bestimmten URL verarbeitet. Durch das Löschen von „sectionName“, das in den HTTPRoute-Ressourcen von HTTP zu HTTPS veranschaulicht wurde, gilt diese Umleitungsregel sowohl für HTTP- als auch für HTTPS-Anforderungen.

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

Wenn die HTTPRoute-Ressource erstellt wird, stellen Sie sicher, dass sowohl HTTPRoute-Ressourcen akzeptiert als auch die Application Gateway für Container-Ressource programmiert sind.

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

Überprüfen Sie, ob die Application Gateway for Containers-Ressource für jede HTTPRoute erfolgreich aktualisiert wurde.

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

Testen des Zugriffs auf die Anwendung

Jetzt können wir über den FQDN, der dem Frontend zugewiesen ist, einige Datenverkehrsdaten an unsere Beispielanwendung senden. Verwenden Sie den folgenden Befehl, um den FQDN abzurufen.

fqdn=$(kubectl get gateway gateway-01 -n test-infra -o jsonpath='{.status.addresses[0].value}')

Wenn Sie den Servernamenindikator mit dem Befehl „curl“ angeben, sollte http://contoso.com eine Antwort von Application Gateway für Container mit einem location-Header zurückgeben, der eine Umleitung vom Typ 301 zu https://contoso.com definiert.

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

Über die Antwort sollten wir Folgendes sehen:

* 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

Wenn Sie den Servernamenindikator mit dem Befehl „curl“ angeben, sollte https://contoso.com/summer-promotion eine Antwort von Application Gateway für Container mit einer Umleitung vom Typ 302 zu https://contoso.com/shop/category/5 zurückgeben.

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

Über die Antwort sollten wir Folgendes sehen:

> 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

Herzlichen Glückwunsch! Sie haben den ALB-Controller installiert, eine Back-End-Anwendung bereitgestellt und Gateway API verwendet, um sowohl eine Umleitung von HTTP zu HTTPS als auch eine pfadbasierte Umleitung zu bestimmten Clientanforderungen zu konfigurieren.