Header herschrijven voor Azure-toepassing Gateway for Containers - Gateway-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 filters zoals gedefinieerd door de Kubernetes Gateway-API.
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 aanvraag waarbij een specifieke gebruikersagent opnieuw wordt geschreven naar een vereenvoudigde waarde met de naam SearchEngine-BingBot 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 instelt
Als u de beheerde IMPLEMENTATIEstrategie van ALB volgt, moet u ervoor zorgen dat de ALB-controller de Application Gateway for Containers-resources inricht 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 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
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: 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
Zodra de gateway is gemaakt, maakt u een HTTPRoute die luistert naar hostnaam contoso.com en overschrijft u de waarde van de gebruikersagent naar SearchEngine-BingBot.
In dit voorbeeld zoeken we naar de gebruikersagent die wordt gebruikt door de Bing-zoekmachine en vereenvoudigen we de header naar SearchEngine-BingBot voor eenvoudigere back-endparsering.
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: 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
Zodra de HTTPRoute-resource is gemaakt, controleert u of de route wordt geaccepteerd en of de Application Gateway for Containers-resource is geprogrammeerd.
kubectl get httproute header-rewrite-route -n test-infra -o yaml
Controleer of de status van de Application Gateway for Containers-resource is bijgewerkt.
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}')
Als u de servernaamindicator opgeeft met behulp van de curl-opdracht, contoso.com
moet de uitvoer voor de front-end-FQDN een antwoord retourneren van de back-end-v1-service.
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 een gebruikersagent met de waarde '' opgeeft, moet een antwoord worden geretourneerd van de back-endservice van 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/"
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-v2-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-v2-5b8fd96959-f59mm"
}
Gefeliciteerd, u hebt EEN ALB-controller geïnstalleerd, een back-endtoepassing geïmplementeerd en headerwaarden gewijzigd via gateway-API in Application Gateway for Containers.