Umleiten von URLs für Azure Application Gateway für Container – Gateway 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 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. Künftige 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 betrifft den 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
zufabrikam.com
.Bei der Pfadumleitung gibt es zwei verschiedene Varianten:
prefix
undfull
.- 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“ als auch „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.
- Der Umleitungstyp
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.
Voraussetzungen
Wenn Sie der BYO-Bereitstellungsstrategie folgen, stellen Sie sicher, dass Sie Ihre Ressourcen für Application Gateway für Container und den ALB-Controller eingerichtet haben.
Wenn Sie der ALB-verwalteten Bereitstellungsstrategie folgen, stellen Sie sicher, dass Sie den ALB-Controller und die Ressourcen für Application Gateway für Container über die benutzerdefinierte ApplicationLoadBalancer-Ressource bereitstellen.
Bereitstellen einer Beispiel-HTTP-Anwendung:
Wenden Sie die folgende Datei „deployment.yaml“ auf Ihrem Cluster an, um ein TLS-Beispielzertifikat bereitzustellen und die Umleitungsfunktionen zu demonstrieren.
kubectl apply -f https://trafficcontrollerdocs.blob.core.windows.net/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
alsecho
bezeichnet wird - eine Bereitstellung, die im Namespace
test-infra
alsecho
bezeichnet wird - ein Geheimnis, das im Namespace
test-infra
alslistener-tls-secret
bezeichnet wird
- Ein Namespace mit dem Namen
Bereitstellen der erforderlichen Gateway-API-Ressourcen
Erstellen eines Gateways
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
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.
Nachdem die Gatewayressource erstellt wurde, stellen Sie sicher, dass der Status gültig ist, dass der Listener programmiert ist und dem Gateway eine Adresse zugewiesen wird.
kubectl get gateway gateway-01 -n test-infra -o yaml
Beispielausgabe einer erfolgreichen Gatewayerstellung.
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
Erstellen Sie eine HTTPRoute-Ressource für contoso.com
, die HTTPS-Datenverkehr verarbeitet.
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
Wenn die HTTPRoute-Ressource erstellt wird, stellen Sie sicher, dass sowohl HTTPRoute-Ressourcen akzeptiert als auch die Application Gateway für Container-Ressource programmiert sind.
kubectl get httproute rewrite-example -n test-infra -o yaml
Überprüfen Sie, ob die Application Gateway for Containers-Ressource für jede HTTPRoute erfolgreich aktualisiert wurde.
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
Nachdem das Gateway erstellt wurde, erstellen Sie eine HTTPRoute-Ressource für contoso.com
mit einem RequestRedirect-Filter, um HTTP-Datenverkehr zu HTTPS umzuleiten.
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
Wenn die HTTPRoute-Ressource erstellt wird, stellen Sie sicher, dass sowohl HTTPRoute-Ressourcen akzeptiert als auch die Application Gateway für Container-Ressource programmiert sind.
kubectl get httproute rewrite-example -n test-infra -o yaml
Überprüfen Sie, ob die Application Gateway for Containers-Ressource für jede HTTPRoute erfolgreich aktualisiert wurde.
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
Erstellen Sie eine HTTPRoute-Ressource für contoso.com
, die eine Umleitung für den Pfad „/summer-promotion“ zu einer bestimmten URL verarbeitet. Durch das Löschen von „sectionName“, das in den HTTPRoute-Ressourcen von HTTP zu HTTPS veranschaulicht wurde, gilt diese Umleitungsregel sowohl für HTTP- als auch für HTTPS-Anforderungen.
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
Wenn die HTTPRoute-Ressource erstellt wird, stellen Sie sicher, dass sowohl HTTPRoute-Ressourcen akzeptiert als auch die Application Gateway für Container-Ressource programmiert sind.
kubectl get httproute rewrite-example -n test-infra -o yaml
Überprüfen Sie, ob die Application Gateway for Containers-Ressource für jede HTTPRoute erfolgreich aktualisiert wurde.
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
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 gateway gateway-01 -n test-infra -o jsonpath='{.status.addresses[0].value}')
Wenn Sie den Servernamenindikator mit dem Befehl „curl“ angeben, sollte http://contoso.com
eine Antwort von Application Gateway für Container mit einem location
-Header zurückgeben, der eine Umleitung vom Typ 301 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 Befehl „curl“ angeben, sollte https://contoso.com/summer-promotion
eine Antwort von Application Gateway für Container mit einer Umleitung vom Typ 302 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 Gateway API verwendet, um sowohl eine Umleitung von HTTP zu HTTPS als auch eine pfadbasierte Umleitung zu bestimmten Clientanforderungen zu konfigurieren.