Dela via


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

Med Application Gateway för containrar kan du returnera ett omdirigeringssvar till klientbaserade 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. Framtida referenser till den här resursen använder en av de omslutna 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: ett prefix för /shop skulle matcha /shop och eventuell text efter. Till exempel /shop, /shop/checkout och /shop/item-a skulle alla omdirigeras till /shop också.
    • Full omdirigeringstypen matchar ett exakt värde. Till exempel: /shop kan 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 andra begäran som initieras för att contoso.com via http-protokollet en omdirigering för att initiera en ny anslutning till https-varianten.

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 kontrollerar du att du konfigurerar application gateway för containrar och ALB-styrenhet.

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

  3. Distribuera HTTP-exempelprogram:

    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 som anropas echo test-infra i namnområdet
    • en distribution som anropas echo i test-infra namnområdet
    • en hemlighet som heter listener-tls-secret i test-infra namnområdet

Distribuera de gateway-API-resurser som krävs

  1. Skapa en gateway

    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
    

Kommentar

När ALB-styrenheten skapar Application Gateway for Containers-resurser i ARM använder den följande namngivningskonvention för en klientdelsresurs: fe-8< slumpmässigt genererade tecken>

Om du vill ändra namnet på klientdelen som skapats i Azure kan du överväga att följa din egen distributionsstrategi.

När gatewayresursen har skapats kontrollerar du att statusen är giltig, att lyssnaren är programmerad och att en adress har tilldelats till gatewayen.

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

Exempel på att gatewayen har skapats.

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

Skapa en HTTPRoute-resurs för contoso.com som hanterar trafik som tas emot via 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

När HTTPRoute-resursen har skapats kontrollerar du att HTTPRoute-resursen visar Godkänd och att Application Gateway for Containers-resursen är programmerad.

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

Kontrollera att Application Gateway for Containers-resursen har uppdaterats för varje 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

När gatewayen har skapats skapar du en HTTPRoute-resurs för contoso.com med ett RequestRedirect-filter som omdirigerar http-trafik till 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

När HTTPRoute-resursen har skapats kontrollerar du att HTTPRoute-resursen visar Godkänd och att Application Gateway for Containers-resursen är programmerad.

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

Kontrollera att Application Gateway for Containers-resursen har uppdaterats för varje 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

Skapa en HTTPRoute-resurs för contoso.com som hanterar en omdirigering för sökvägen /summer-promotion till en specifik URL. Genom att eliminera sectionName, som visas i http till https HTTPRoute-resurser, gäller den här omdirigeringsregeln för både HTTP- och HTTPS-begäranden.

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

När HTTPRoute-resursen har skapats kontrollerar du att HTTPRoute-resursen visar Godkänd och att Application Gateway for Containers-resursen är programmerad.

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

Kontrollera att Application Gateway for Containers-resursen har uppdaterats för varje 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

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 gateway gateway-01 -n test-infra -o jsonpath='{.status.addresses[0].value}')

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 Controller, distribuerat ett serverdelsprogram och använt Gateway-API för att konfigurera både en HTTP till HTTPS-omdirigering och sökvägsbaserad omdirigering till specifika klientbegäranden.