Dela via


URL-omdirigering för Azure Application Gateway för containrar – Ingress-API

Med Application Gateway for containers kan du returnera ett omdirigeringssvar till klienten baserat på tre aspekter av en URL: protokoll, värdnamn och sökväg. För varje omdirigering kan en definierad HTTP-statuskod returneras till klienten för att definiera omdirigeringens karaktär.

Användningsinformation

URL-omdirigeringar använder regelfiltret RequestRedirect enligt definitionen i Kubernetes Gateway-API:et.

Omdirigering

En omdirigering anger svarsstatuskoden som returneras till klienter för att förstå syftet med omdirigeringen. Följande typer av omdirigering stöds:

  • 301 (flyttas permanent): Anger att målresursen har tilldelats en ny permanent URI. Eventuella framtida referenser till den här resursen använder en av de omgivna URI:erna. Använd 301-statuskod för HTTP till HTTPS-omdirigering.
  • 302 (hittades): Anger att målresursen tillfälligt är under en annan URI. Eftersom omdirigeringen kan ändras ibland bör klienten fortsätta att använda den effektiva begärande-URI:n för framtida begäranden.

Omdirigeringsfunktioner

  • Protokollomdirigering används ofta för att instruera klienten att gå från ett okrypterat trafikschema till trafik, till exempel HTTP till HTTPS-omdirigering.

  • Omdirigering av värdnamn matchar det fullständigt kvalificerade domännamnet (fqdn) för begäran. Detta observeras ofta vid omdirigering av ett gammalt domännamn till ett nytt domännamn. till exempel contoso.com till fabrikam.com.

  • Sökvägsomdirigering har två olika varianter: prefix och full.

    • Prefix omdirigeringstypen omdirigerar alla begäranden som börjar med ett definierat värde. Till exempel skulle ett prefix av /shop matcha /shop och vilken text som helst därefter. Till exempel /shop, /shop/checkout och /shop/item-a skulle alla omdirigeras till /shop också.
    • Full omdirigeringstypen matchar ett exakt värde. Till exempel kan /shop omdirigeras till /store, men /shop/checkout omdirigeras inte till /store.

Följande bild illustrerar ett exempel på en begäran som är avsedd för contoso.com/summer-promotion omdirigeras till contoso.com/shop/category/5. Dessutom returneras en omdirigering för att initiera en ny anslutning till https-varianten efter att en andra begäran har initierats genom http-protokollet till contoso.com.

Ett diagram som visar Application Gateway för containrar som returnerar en omdirigerings-URL till en klient.

Förutsättningar

  1. Om du följer BYO-distributionsstrategin, säkerställer du att du har konfigurerat Application Gateway för containrar och ALB Controller.

  2. Om du följer ALB-strategin för hanterad distribution, se till att du etablerar din ALB-styrenhet och etablerar resurser för Application Gateway för containrar via den anpassade resursen ApplicationLoadBalancer.

  3. Distribuera testapplikationen för HTTP:

    Använd följande deployment.yaml-fil i klustret för att distribuera ett TLS-exempelcertifikat för att demonstrera omdirigeringsfunktioner.

    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
    

    Det här kommandot skapar följande i klustret:

    • ett namnområde med namnet test-infra
    • en tjänst kallad echo i test-infra namnrymden
    • en implementering som anropas echo i test-infra namnrymden
    • en hemlighet som heter listener-tls-secret i test-infra namnområdet

Distribuera nödvändiga IngressExtension-resurser

  1. Skapa en IngressExtension-resurs för att hantera HTTP till HTTPS-omdirigering 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. Skapa en IngressExtension-resurs för att hantera en sökvägsbaserad omdirigering från contoso.com/summer-promotion till contoso.com/shop/category/5.

    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
    

Distribuera de inkommande resurser som krävs

  1. Skapa den första ingressresursen för att lyssna efter HTTPS-begäranden.

    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. Skapa den andra ingressresursen för att lyssna på port 80 och omdirigera till HTTPS.

    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. Skapa en tredje ingressresurs för att lyssna på port 80 och 443 för contoso.com/summer-promotion och omdirigera till contoso.com/shop/category/5.

    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
    

Note

När ALB-styrenheten skapar Application Gateway for Containers-resurser i Azure Resource Manager använder den följande namngivningskonvention för en klientdelsresurs: fe-<eight randomly generated characters>.

Om du vill ändra namnet på den frontend-resurs som skapats i Azure kan du överväga att följa en egen distributionsstrategi.

För varje ingressresurs kontrollerar du att statusen är giltig, att lyssnaren är programmerad och att en adress tilldelas till ingressresursen. För alla tre ingressresurser bör du se samma värdnamn i det här exemplet.

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

Exempelutdata från ett lyckat skapande av Ingress.

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

Testa åtkomsten till programmet

Nu är vi redo att skicka trafik till vårt exempelprogram via det FQDN som tilldelats klientdelen. Använd följande kommando för att hämta FQDN.

fqdn=$(kubectl get ingress ingress-http -n test-infra -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')

När du anger indikatorn för servernamn med hjälp av curl-kommandot http://contoso.com bör du returnera ett svar från Application Gateway för containrar med en location rubrik som definierar en 301-omdirigering till https://contoso.com.

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

Via svaret bör vi se:

* 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

När du anger indikatorn för servernamn med hjälp av curl-kommandot https://contoso.com/summer-promotion ska Application Gateway for Containers returnera en 302-omdirigering till https://contoso.com/shop/category/5.

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

Via svaret bör vi se:

> 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

Grattis, du har installerat ALB-styrenheten, distribuerat ett serverdelsprogram och använt ingress-API för att konfigurera både en HTTP till HTTPS-omdirigering och sökvägsbaserad omdirigering till specifika klientbegäranden.