Freigeben über


URL-Umleitung für Application Gateway für Container – Eingangs-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 der 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. Alle künftigen 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 entspricht dem 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“ und „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.

Ein Diagramm, das den Application Gateway für Container zeigt, das eine Umleitungs-URL an einen Client zurückgibt.

Voraussetzungen

  1. Wenn Sie der BYO-Bereitstellungsstrategie folgen, müssen Sie Ihre Application Gateway für Container-Ressourcen und den ALB-Controller einrichten.

  2. Wenn Sie der Strategie der durch ALB verwalteten Bereitstellung folgen, müssen Sie den ALB-Controller und die Application Gateway für Container-Ressourcen über die benutzerdefinierte ApplicationLoadBalancer-Ressource bereitstellen.

  3. Bereitstellen einer HTTP-Beispielanwendung:

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

    kubectl apply -f https://raw.githubusercontent.com/MicrosoftDocs/azure-docs/refs/heads/main/articles/application-gateway/for-containers/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 IngressExtension-Ressourcen

  1. Erstellen einer IngressExtension-Ressource zum Verarbeiten der Umleitung von HTTP zu HTTPS für contoso.com

    kubectl apply -f - <<EOF
    apiVersion: alb.networking.azure.io/v1
    kind: IngressExtension
    metadata:
      name: http-to-https
      namespace: test-infra
    spec:
      rules:
        - host: contoso.com
          requestRedirect:
            statusCode: 301
            scheme: https
    EOF
    
  2. Erstellen Sie eine IngressExtension-Ressource, um eine pfadbasierte Umleitung von contoso.com/summer-promotion zu contoso.com/shop/category/5 zu verarbeiten.

    kubectl apply -f - <<EOF
    apiVersion: alb.networking.azure.io/v1
    kind: IngressExtension
    metadata:
      name: summer-promotion-redirect
      namespace: test-infra
    spec:
      rules:
        - host: contoso.com
          requestRedirect:
            statusCode: 302
            path:
              type: ReplaceFullPath
              replaceFullPath: /shop/category/5
    EOF
    

Bereitstellen der erforderlichen Eingangsressource

  1. Erstellen Sie die erste Eingangsressource, um HTTPS-Anforderungen zu lauschen.

    kubectl apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: ingress-https
      namespace: test-infra
      annotations:
        alb.networking.azure.io/alb-namespace: alb-test-infra
        alb.networking.azure.io/alb-name: alb-test
        alb.networking.azure.io/alb-frontend: ingress-fe
    spec:
      ingressClassName: azure-alb-external
      tls:
        - hosts:
            - contoso.com
          secretName: listener-tls-secret
      rules:
        - host: contoso.com
          http:
            paths:
              - path: /
                pathType: Prefix
                backend:
                  service:
                    name: echo
                    port:
                      number: 80
    EOF
    
  2. Erstellen Sie die zweite Eingangsressource, um Port 80 zu lauschen und zu HTTPS umzuleiten.

    kubectl apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: ingress-http
      namespace: test-infra
      annotations:
        alb.networking.azure.io/alb-namespace: alb-test-infra
        alb.networking.azure.io/alb-name: alb-test
        alb.networking.azure.io/alb-frontend: ingress-fe
        alb.networking.azure.io/alb-ingress-extension: http-to-https
    spec:
      ingressClassName: azure-alb-external
      rules:
        - host: contoso.com
          http:
            paths:
              - path: /
                pathType: Prefix
                backend:
                  service:
                    name: echo
                    port:
                      number: 80
    EOF
    
  3. Erstellen Sie eine dritte Eingangsressource, um Port 80 und 443 für contoso.com/summer-promotion zu lauschen und zu contoso.com/shop/category/5 umzuleiten.

    kubectl apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: ingress-summer-promotion-redirect
      namespace: test-infra
      annotations:
        alb.networking.azure.io/alb-namespace: alb-test-infra
        alb.networking.azure.io/alb-name: alb-test
        alb.networking.azure.io/alb-frontend: ingress-fe
        alb.networking.azure.io/alb-ingress-extension: summer-promotion-redirect
    spec:
      ingressClassName: azure-alb-external
      tls:
        - hosts:
            - contoso.com
          secretName: listener-tls-secret
      rules:
        - host: contoso.com
          http:
            paths:
              - path: /summer-promotion
                pathType: Prefix
                backend:
                  service:
                    name: ignored-for-redirect
                    port:
                      number: 80
    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.

Stellen Sie für jede Eingangsressource sicher, dass der Status gültig ist, der Listener programmiert ist und der Eingangsressource eine Adresse zugewiesen wird. Für alle drei Eingangsressourcen sollte in diesem Beispiel derselbe Hostname angezeigt werden.

kubectl get ingress ingress-https -n test-infra -o yaml

Beispielausgabe einer erfolgreichen Eingangserstellung.

status:
  loadBalancer:
    ingress:
    - hostname: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.fzyy.alb.azure.com
      ports:
      - port: 443
        protocol: TCP

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 ingress ingress-http -n test-infra -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')

Wenn Sie den Servernamenindikator mit dem cURL-Befehl angeben, sollte http://contoso.com eine Antwort von Application Gateway für Container mit einem location-Header zurückgeben, der eine 301-Umleitung 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 cURL-Befehl angeben, sollte https://contoso.com/summer-promotion eine Antwort von Application Gateway für Container mit einer 302-Umleitung 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 die Eingangs-API verwendet, um sowohl eine Umleitung von HTTP zu HTTPS als auch eine pfadbasierte Umleitung zu bestimmten Clientanforderungen zu konfigurieren.