Delen via


URL-omleiding voor Azure-toepassing Gateway for Containers - Gateway-API

Met Application Gateway for Containers kunt u een omleidingsreactie retourneren naar de client op basis van drie aspecten van een URL: protocol, hostnaam en pad. Voor elke omleiding kan een gedefinieerde HTTP-statuscode worden geretourneerd naar de client om de aard van de omleiding te definiëren.

Gebruiksgegevens

URL-omleidingen maken gebruik van het requestRedirect-regelfilter zoals gedefinieerd door de Kubernetes Gateway-API.

Omleiding

Met een omleiding wordt de antwoordstatuscode ingesteld die wordt geretourneerd aan clients om inzicht te hebben in het doel van de omleiding. De volgende typen omleiding worden ondersteund:

  • 301 (permanent verplaatst): Geeft aan dat aan de doelresource een nieuwe permanente URI is toegewezen. Toekomstige verwijzingen naar deze resource maken gebruik van een van de ingesloten URI's. Gebruik 301-statuscode voor HTTP-naar-HTTPS-omleiding.
  • 302 (Gevonden): Geeft aan dat de doelresource tijdelijk onder een andere URI valt. Omdat de omleiding af en toe kan veranderen, moet de client de effectieve aanvraag-URI blijven gebruiken voor toekomstige aanvragen.

Omleidingsmogelijkheden

  • Protocolomleiding wordt vaak gebruikt om de client te laten weten dat ze van een niet-versleuteld verkeersschema naar verkeer moeten overstappen, zoals HTTP naar HTTPS-omleiding.

  • Hostnaamomleiding komt overeen met de volledig gekwalificeerde domeinnaam (fqdn) van de aanvraag. Dit wordt vaak waargenomen bij het omleiden van een oude domeinnaam naar een nieuwe domeinnaam; zoals contoso.com fabrikam.com.

  • Padomleiding heeft twee verschillende varianten: prefix en full.

    • Prefix Het omleidingstype leidt alle aanvragen om vanaf een gedefinieerde waarde. Bijvoorbeeld: een voorvoegsel van /shop komt overeen met /shop en tekst erna. Bijvoorbeeld: /shop, /shop/checkout, en /shop/item-a zou ook allemaal omleiden naar /shop.
    • Full omleidingstype komt overeen met een exacte waarde. Bijvoorbeeld: /shop kan omleiden naar /store, maar /shop/checkout zou niet omleiden naar /store.

In de volgende afbeelding ziet u een voorbeeld van een aanvraag die is bestemd voor contoso.com/summer-promotion die wordt omgeleid naar contoso.com/shop/category/5. Daarnaast wordt een tweede aanvraag die is geïnitieerd om te contoso.com via http-protocol, een omleiding geretourneerd om een nieuwe verbinding met de https-variant te initiëren.

Een diagram met de Application Gateway for Containers die een omleidings-URL retourneert naar een client.

Vereisten

  1. Als u de BYO-implementatiestrategie volgt, moet u ervoor zorgen dat u uw Application Gateway for Containers-resources en DE ALB-controller instelt.

  2. Als u de beheerde IMPLEMENTATIEstrategie van ALB volgt, moet u ervoor zorgen dat u uw ALB-controller inricht en de Application Gateway for Containers-resources inricht via de aangepaste applicationLoadBalancer-resource.

  3. Voorbeeld-HTTP-toepassing implementeren:

    Pas het volgende bestand deployment.yaml toe op uw cluster om een voorbeeld van een TLS-certificaat te implementeren om omleidingsmogelijkheden te demonstreren.

    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
    

    Met deze opdracht maakt u het volgende op uw cluster:

    • een naamruimte met de naam test-infra
    • één service die is aangeroepen echo in de test-infra naamruimte
    • één implementatie aangeroepen echo in de test-infra naamruimte
    • één geheim dat in de test-infra naamruimte wordt aangeroepen listener-tls-secret

De vereiste gateway-API-resources implementeren

  1. Een gateway maken

    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
    

Notitie

Wanneer de ALB-controller de Application Gateway for Containers-resources in ARM maakt, wordt de volgende naamconventie gebruikt voor een front-endresource: fe-8< willekeurig gegenereerde tekens>

Als u de naam van de front-end die in Azure is gemaakt, wilt wijzigen, kunt u overwegen om uw eigen implementatiestrategie te volgen.

Zodra de gatewayresource is gemaakt, controleert u of de status geldig is, wordt de listener geprogrammeerd en wordt er een adres toegewezen aan de gateway.

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

Voorbeelduitvoer van geslaagde gateway maken.

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

Maak een HTTPRoute-resource voor contoso.com die verkeer verwerkt dat via https wordt ontvangen.

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

Wanneer de HTTPRoute-resource is gemaakt, controleert u of de HTTPRoute-resource Geaccepteerd wordt weergegeven en of de Application Gateway for Containers-resource is geprogrammeerd.

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

Controleer of de Application Gateway for Containers-resource is bijgewerkt voor elke 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

Zodra de gateway is gemaakt, maakt u een HTTPRoute-resource voor contoso.com met een RequestRedirect-filter waarmee http-verkeer wordt omgeleid naar 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

Wanneer de HTTPRoute-resource is gemaakt, controleert u of de HTTPRoute-resource Geaccepteerd wordt weergegeven en of de Application Gateway for Containers-resource is geprogrammeerd.

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

Controleer of de Application Gateway for Containers-resource is bijgewerkt voor elke 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

Maak een HTTPRoute-resource voor contoso.com die een omleiding voor het pad /zomerpromotie naar een specifieke URL verwerkt. Door sectionName te elimineren, gedemonstreerd in de http-naar-https HTTPRoute-resources, is deze omleidingsregel van toepassing op zowel HTTP- als HTTPS-aanvragen.

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

Wanneer de HTTPRoute-resource is gemaakt, controleert u of de HTTPRoute-resource Geaccepteerd wordt weergegeven en of de Application Gateway for Containers-resource is geprogrammeerd.

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

Controleer of de Application Gateway for Containers-resource is bijgewerkt voor elke 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

Toegang tot de toepassing testen

Nu zijn we klaar om verkeer naar onze voorbeeldtoepassing te verzenden, via de FQDN die is toegewezen aan de front-end. Gebruik de volgende opdracht om de FQDN op te halen.

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

Wanneer u de servernaamindicator opgeeft met behulp van de curl-opdracht, http://contoso.com moet er een antwoord worden geretourneerd van de Application Gateway for Containers met een header waarmee een location 301-omleiding naar https://contoso.comwordt gedefinieerd.

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

Via het antwoord moeten we het volgende zien:

* 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

Wanneer u de servernaamindicator opgeeft met behulp van de curl-opdracht, https://contoso.com/summer-promotion moet Application Gateway for Containers een 302-omleiding naar https://contoso.com/shop/category/5retourneren.

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

Via het antwoord moeten we het volgende zien:

> 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

Gefeliciteerd, u hebt EEN ALB-controller geïnstalleerd, een back-endtoepassing geïmplementeerd en de Gateway-API gebruikt om zowel een HTTP-naar-HTTPS-omleiding als padgebaseerde omleiding naar specifieke clientaanvragen te configureren.