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
enfull
.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.
Vereisten
Als u de BYO-implementatiestrategie volgt, moet u ervoor zorgen dat u uw Application Gateway for Containers-resources en DE ALB-controller instelt.
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.
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 detest-infra
naamruimte - één implementatie aangeroepen
echo
in detest-infra
naamruimte - één geheim dat in de
test-infra
naamruimte wordt aangeroepenlistener-tls-secret
- een naamruimte met de naam
De vereiste gateway-API-resources implementeren
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.com
wordt 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/5
retourneren.
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.