Riscrittura intestazioni per il Gateway applicativo per contenitori di Azure - API gateway
Gateway applicativo per contenitori consente di riscrivere le intestazioni HTTP delle richieste client e delle risposte dalle destinazioni back-end.
Usage details (Dettagli di utilizzo)
Le riscritture delle intestazioni sfruttano i filtri definiti dall'API gateway Kubernetes.
Background
Le riscritture delle intestazioni consentono di modificare le richieste e le intestazione della risposta da e verso le destinazioni back-end.
La figura seguente illustra una richiesta con un agente utente specifico riscritto in un valore semplificato denominato SearchEngine-BingBot quando la richiesta viene avviata alla destinazione back-end dal Gateway applicativo per contenitori:
Prerequisiti
Se si segue la strategia di distribuzione BYO (Bring Your Own Deployment), assicurarsi di aver configurato le risorse Gateway applicativo per contenitori e il Controller ALB
Se si segue la strategia di distribuzione gestita ALB, assicurarsi di aver effettuato il provisioning del Controller ALB delle risorse Gateway applicativo per contenitori tramite la risorsa personalizzata ApplicationLoadBalancer.
Distribuire l'applicazione HTTP di esempio Applicare il file deployment.yaml seguente nel cluster per creare un'applicazione Web di esempio per illustrare la riscrittura delle intestazioni.
kubectl apply -f https://raw.githubusercontent.com/MicrosoftDocs/azure-docs/refs/heads/main/articles/application-gateway/for-containers/examples/traffic-split-scenario/deployment.yaml
Questo comando crea gli elementi seguenti nel cluster:
- uno spazio dei nomi denominato
test-infra
- due servizi denominati
backend-v1
ebackend-v2
nello spazio dei nomitest-infra
- due distribuzioni denominate
backend-v1
ebackend-v2
nello spazio dei nomitest-infra
- uno spazio dei nomi denominato
Distribuire le risorse necessarie per l'API gateway
Creare un 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
EOF
Nota
Quando il Controller ALB crea le risorse Gateway applicativo per contenitori in ARM, userà la convenzione di denominazione seguente per una risorsa front-end: fe-<8 caratteri generati in modo casuale>
Se si vuole modificare il nome del front-end creato in Azure, valutare la possibilità di seguire la strategia di distribuzione personalizzata (Bring Your Own Deployment).
Dopo aver creato la risorsa gateway, verificare che lo stato sia valido, che il listener sia programmato e che al gateway sia assegnato un indirizzo.
kubectl get gateway gateway-01 -n test-infra -o yaml
Output di esempio della corretta creazione del gateway.
status:
addresses:
- type: IPAddress
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
Dopo aver creato il gateway, creare un HTTPRoute in ascolto del nome host contoso.com ed eseguire l'override del valore dell'agente utente in SearchEngine-BingBot.
In questo esempio si cerca l'agente utente usato dal motore di ricerca Bing e si semplifica l'intestazione in SearchEngine-BingBot per semplificare l'analisi back-end.
Questo esempio illustra anche l'aggiunta di una nuova intestazione denominata AGC-Header-Add
con un valore di AGC-value
e la rimozione di un'intestazione della richiesta denominata client-custom-header
.
Suggerimento
Per questo esempio, mentre è possibile usare HTTPHeaderMatch di "Exact" per una corrispondenza di stringa, viene usata una dimostrazione nell'espressione regolare per illustrare altre funzionalità.
kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: header-rewrite-route
namespace: test-infra
spec:
parentRefs:
- name: gateway-01
namespace: test-infra
hostnames:
- "contoso.com"
rules:
- matches:
- headers:
- name: user-agent
value: Mozilla/5\.0 AppleWebKit/537\.36 \(KHTML, like Gecko; compatible; bingbot/2\.0; \+http://www\.bing\.com/bingbot\.htm\) Chrome/
type: RegularExpression
filters:
- type: RequestHeaderModifier
requestHeaderModifier:
set:
- name: user-agent
value: SearchEngine-BingBot
add:
- name: AGC-Header-Add
value: AGC-value
remove: ["client-custom-header"]
backendRefs:
- name: backend-v2
port: 8080
- backendRefs:
- name: backend-v1
port: 8080
EOF
Dopo aver creato la risorsa HTTPRoute, verificare che la route sia accettata e che lo stato della risorsa Gateway applicativo per contenitori sia programmato.
kubectl get httproute header-rewrite-route -n test-infra -o yaml
Verificare che l'aggiornamento dello stato della risorsa Gateway applicativo per contenitori sia riuscito.
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
Testare l'accesso all'applicazione
A questo punto, è possibile inviare traffico all'applicazione di esempio tramite il nome di dominio completo assegnato al front-end. Usare il comando seguente per ottenere il nome di dominio completo:
fqdn=$(kubectl get gateway gateway-01 -n test-infra -o jsonpath='{.status.addresses[0].value}')
Se si specifica l'indicatore del nome del server usando il comando curl, contoso.com
per il nome di dominio completo del front-end, l'output deve restituire una risposta dal servizio back-end-v1.
fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com
Tramite la risposta si osserverà quanto segue:
{
"path": "/",
"host": "contoso.com",
"method": "GET",
"proto": "HTTP/1.1",
"headers": {
"Accept": [
"*/*"
],
"User-Agent": [
"curl/7.81.0"
],
"X-Forwarded-For": [
"xxx.xxx.xxx.xxx"
],
"X-Forwarded-Proto": [
"http"
],
"X-Request-Id": [
"dcd4bcad-ea43-4fb6-948e-a906380dcd6d"
]
},
"namespace": "test-infra",
"ingress": "",
"service": "",
"pod": "backend-v1-5b8fd96959-f59mm"
}
Se si specifica un'intestazione dell'agente utente con il valore ``, il servizio back-end restituirà la risposta di SearchEngine-BingBot:
fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com -H "user-agent: Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm) Chrome/"
Tramite la risposta si osserverà quanto segue:
{
"path": "/",
"host": "fabrikam.com",
"method": "GET",
"proto": "HTTP/1.1",
"headers": {
"Accept": [
"*/*"
],
"User-Agent": [
"curl/7.81.0"
],
"X-Forwarded-For": [
"xxx.xxx.xxx.xxx"
],
"X-Forwarded-Proto": [
"http"
],
"X-Request-Id": [
"adae8cc1-8030-4d95-9e05-237dd4e3941b"
]
},
"namespace": "test-infra",
"ingress": "",
"service": "",
"pod": "backend-v2-5b8fd96959-f59mm"
}
Specificare un'intestazione client-custom-header
con il valore moo
deve essere rimossa dalla richiesta quando gateway applicazione per contenitori avvia la connessione al servizio back-end:
fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com -H "client-custom-header: moo"
Tramite la risposta si osserverà quanto segue:
{
"path": "/",
"host": "fabrikam.com",
"method": "GET",
"proto": "HTTP/1.1",
"headers": {
"Accept": [
"*/*"
],
"User-Agent": [
"curl/7.81.0"
],
"X-Forwarded-For": [
"xxx.xxx.xxx.xxx"
],
"X-Forwarded-Proto": [
"http"
],
"X-Request-Id": [
"kd83nc84-4325-5d22-3d23-237dd4e3941b"
]
},
"namespace": "test-infra",
"ingress": "",
"service": "",
"pod": "backend-v2-5b8fd96959-f59mm"
}
Congratulazioni, il controller ALB è stato installato, è stata distribuita un'applicazione back-end e sono stati modificati i valori delle intestazioni tramite l'API gateway nel Gateway applicativo per contenitori.