Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Gateway applicativo per contenitori consente di riscrivere le intestazioni HTTP delle richieste client e delle risposte dalle destinazioni back-end.
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, assicurarsi di configurare l'Application Gateway per le risorse di Container e il Controller ALB (componente aggiuntivo o Helm)
Se si segue la strategia di distribuzione gestita di ALB, assicurarsi di fornire al controller ALB (componente aggiuntivo o Helm) le risorse del gateway applicazione 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.yamlQuesto comando crea gli elementi seguenti nel cluster:
- uno spazio dei nomi denominato
test-infra - due servizi denominati
backend-v1ebackend-v2nello spazio dei nomitest-infra - due distribuzioni denominate
backend-v1ebackend-v2nello 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
Note
Quando il controller ALB crea il gateway applicazione per le risorse dei contenitori in Azure Resource Manager, usa la convenzione di denominazione seguente per una risorsa front-end: fe-<eight randomly generated characters>.
Per modificare il nome della risorsa front-end creata in Azure, valutare la possibilità di seguire la strategia di distribuzione BYO.
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 con il valore "Exact" per una corrispondenza di stringa, viene dimostrato l'uso di un'espressione regolare per illustrare ulteriori 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
Note
La modifica dell'intestazione Host non è supportata con una requestHeaderModifier regola. Per eseguire l'override del valore Host specificato nella destinazione back-end, usare un filtro URLRewrite.
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 lo stato della risorsa del Gateway applicativo per contenitori sia stato aggiornato correttamente.
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 l’FQDN 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.