Header herschrijven voor Azure-toepassing Gateway for Containers - Toegangsbeheer-API
Met Application Gateway voor containers kunt u HTTP-headers van clientaanvragen en antwoorden van back-enddoelen herschrijven.
Gebruiksgegevens
Herschrijven van headers maken gebruik van application gateway voor aangepaste ingressExtension-resource van container.
Achtergrond
Met herschrijven van headers kunt u de aanvraag- en antwoordheaders wijzigen van en naar uw back-enddoelen.
In de volgende afbeelding ziet u een voorbeeld van een aanvraag waarbij een specifieke gebruikersagent wordt herschreven naar een vereenvoudigde waarde die wordt aangeroepen rewritten-user-agent
wanneer de aanvraag wordt gestart naar het back-enddoel door Application Gateway for Containers:
Vereisten
Als u de BYO-implementatiestrategie volgt, moet u ervoor zorgen dat u uw Application Gateway for Containers-resources en DE ALB-controller hebt ingesteld
Als u de beheerde IMPLEMENTATIEstrategie van ALB volgt, moet u ervoor zorgen dat u uw ALB-controller hebt ingericht en de Application Gateway for Containers-resources hebt ingericht via de aangepaste applicationLoadBalancer-resource.
Implementeer de voorbeeld-HTTP-toepassing Pas het volgende bestand deployment.yaml toe op uw cluster om een voorbeeldwebtoepassing te maken om het herschrijven van de header te demonstreren.
kubectl apply -f https://raw.githubusercontent.com/MicrosoftDocs/azure-docs/refs/heads/main/articles/application-gateway/for-containers/examples/traffic-split-scenario/deployment.yaml
Met deze opdracht maakt u het volgende op uw cluster:
- een naamruimte met de naam
test-infra
- twee services die worden aangeroepen
backend-v1
enbackend-v2
in detest-infra
naamruimte - twee implementaties die worden aangeroepen
backend-v1
enbackend-v2
in detest-infra
naamruimte
- een naamruimte met de naam
De vereiste api-resources voor inkomend verkeer implementeren
Maak een toegangsbeheerobjectresource om te luisteren naar aanvragen naar contoso.com
:
kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-01
namespace: test-infra
annotations:
alb.networking.azure.io/alb-name: alb-test
alb.networking.azure.io/alb-namespace: alb-test-infra
alb.networking.azure.io/alb-ingress-extension: header-rewrite
spec:
ingressClassName: azure-alb-external
rules:
- host: contoso.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: backend-v1
port:
number: 8080
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 toegangsbeheerresource is gemaakt, controleert u of de status de hostnaam van uw load balancer weergeeft en of beide poorten naar aanvragen luisteren.
kubectl get ingress ingress-01 -n test-infra -o yaml
Voorbeeld van een geslaagde uitvoer van het maken van inkomend verkeer.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
alb.networking.azure.io/alb-frontend: FRONTEND_NAME
alb.networking.azure.io/alb-id: /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/yyyyyyyy/providers/Microsoft.ServiceNetworking/trafficControllers/zzzzzz
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"networking.k8s.io/v1","kind":"Ingress","metadata":{"annotations":{"alb.networking.azure.io/alb-frontend":"FRONTEND_NAME","alb.networking.azure.io/alb-id":"/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/yyyyyyyy/providers/Microsoft.ServiceNetworking/trafficControllers/zzzzzz", "alb.networking.azure.io/alb-ingress-extension":"header-rewrite"},"name"
:"ingress-01","namespace":"test-infra"},"spec":{"ingressClassName":"azure-alb-external","rules":[{"host":"contoso.com","http":{"paths":[{"backend":{"service":{"name":"backend-v1","port":{"number":8080}}},"path":"/","pathType":"Prefix"}]}}]}}
creationTimestamp: "2023-07-22T18:02:13Z"
generation: 2
name: ingress-01
namespace: test-infra
resourceVersion: "278238"
uid: 17c34774-1d92-413e-85ec-c5a8da45989d
spec:
ingressClassName: azure-alb-external
rules:
- host: contoso.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: backend-v1
port:
number: 8080
status:
loadBalancer:
ingress:
- hostname: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.fzyy.alb.azure.com
ports:
- port: 80
protocol: TCP
Zodra het inkomend verkeer is gemaakt, moeten we vervolgens een IngressExtension definiëren met de regels voor het herschrijven van de header.
In dit voorbeeld stellen we een statische gebruikersagent in met de waarde .rewritten-user-agent
In dit voorbeeld wordt ook het toevoegen van een nieuwe header gedemonstreert die wordt aangeroepen AGC-Header-Add
met een waarde van AGC-value
en verwijdert u een aanvraagheader met de naam client-custom-header
.
Tip
In dit voorbeeld kunnen we de HTTPHeaderMatch van 'Exact' gebruiken voor een tekenreeksovereenkomst, maar er wordt een demonstratie gebruikt in de reguliere expressie voor illustratie van verdere mogelijkheden.
kubectl apply -f - <<EOF
apiVersion: alb.networking.azure.io/v1
kind: IngressExtension
metadata:
name: header-rewrite
namespace: test-infra
spec:
rules:
- host: contoso.com
rewrites:
- type: RequestHeaderModifier
requestHeaderModifier:
set:
- name: "user-agent"
value: "rewritten-user-agent"
add:
- name: "AGC-Header-Add"
value: "AGC-value"
remove:
- "client-custom-header"
EOF
Zodra de IngressExtension-resource is gemaakt, moet u ervoor zorgen dat de resource geen validatiefouten retourneert en geldig is.
kubectl get IngressExtension header-rewrite -n test-infra -o yaml
Controleer of de status van de Application Gateway for Containers-resource is bijgewerkt.
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 ingress ingress-01 -n test-infra -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
Als u de servernaamindicator opgeeft met behulp van de curl-opdracht, contoso.com
wordt voor de front-end-FQDN een antwoord van de back-end-v1-service geretourneerd.
fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com
Via het antwoord moeten we het volgende zien:
{
"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"
}
Als u een header van de gebruikersagent met de waarde my-user-agent
opgeeft, moet er een antwoord worden geretourneerd van de back-endservice van rewritten-user-agent
:
fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com -H "user-agent: my-user-agent"
Via het antwoord moeten we het volgende zien:
{
"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-v1-5b8fd96959-f59mm"
}
Het opgeven van een client-custom-header
header met de waarde moo
moet worden verwijderd uit de aanvraag wanneer Application Gateway voor Containers de verbinding met de back-endservice start:
fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com -H "client-custom-header: moo"
Via het antwoord moeten we het volgende zien:
{
"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-v1-5b8fd96959-f59mm"
}
Gefeliciteerd, u hebt EEN ALB-controller geïnstalleerd, een back-endtoepassing geïmplementeerd en headerwaarden gewijzigd via de API voor inkomend verkeer in Application Gateway for Containers.