Přepsání hlaviček pro bránu Aplikace Azure lication pro kontejnery – rozhraní API brány
Application Gateway pro kontejnery umožňuje přepisovat hlavičky HTTP požadavků klientů a odpovědí z back-endových cílů.
Podrobnosti využití
Přepsání hlaviček využívá filtry definované rozhraním API brány Kubernetes.
Pozadí
Přepsání hlaviček umožňuje upravit hlavičky požadavků a odpovědí do a z back-endových cílů.
Následující obrázek znázorňuje požadavek s přepsaným konkrétním uživatelským agentem na zjednodušenou hodnotu s názvem SearchEngine-BingBot při inicializování požadavku do back-endového cíle službou Application Gateway for Containers:
Požadavky
Pokud se řídí strategií nasazení BYO, ujistěte se, že jste nastavili službu Application Gateway pro prostředky kontejnerů a kontroler ALB.
Pokud sledujete strategii nasazení spravovaného ALB, ujistěte se, že prostřednictvím vlastního prostředku ApplicationLoadBalancer zřídíte kontroler ALB pro prostředky Application Gateway pro kontejnery.
Nasaďte ukázkovou aplikaci HTTP Pomocí následujícího souboru deployment.yaml ve vašem clusteru vytvořte ukázkovou webovou aplikaci, která předvede přepsání hlaviček.
kubectl apply -f https://raw.githubusercontent.com/MicrosoftDocs/azure-docs/refs/heads/main/articles/application-gateway/for-containers/examples/traffic-split-scenario/deployment.yaml
Tento příkaz vytvoří v clusteru následující:
- obor názvů s názvem
test-infra
- dvě volané
backend-v1
služby abackend-v2
vtest-infra
oboru názvů - dvě volaná
backend-v1
nasazení abackend-v2
vtest-infra
oboru názvů
- obor názvů s názvem
Nasazení požadovaných prostředků rozhraní API brány
Vytvoření brány:
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
Poznámka:
Když kontroler ALB vytvoří prostředky Application Gateway pro kontejnery v ARM, použije pro front-endový prostředek následující zásady vytváření názvů: fe-8< náhodně vygenerované znaky.>
Pokud chcete změnit název front-endu vytvořeného v Azure, zvažte použití vlastní strategie nasazení.
Po vytvoření prostředku brány se ujistěte, že je stav platný, naprogramuje se naslouchací proces a brána má přiřazenou adresu.
kubectl get gateway gateway-01 -n test-infra -o yaml
Příklad výstupu úspěšného vytvoření brány
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
Po vytvoření brány vytvořte httpRoute, který naslouchá názvu hostitele contoso.com a přepíše hodnotu uživatelského agenta na SearchEngine-BingBot.
V tomto příkladu vyhledáme uživatelského agenta používaného vyhledávacím webem Bingu a zjednodušíme hlavičku searchEngine-BingBot, abychom usnadnili analýzu back-endu.
Tento příklad také ukazuje přidání nové hlavičky volané AGC-Header-Add
s hodnotou AGC-value
a odebere hlavičku požadavku volaného client-custom-header
.
Tip
V tomto příkladu můžeme použít httpHeaderMatch "Exact" pro shodu řetězce, ukázka se v regulárním výrazu používá pro ilustraci dalších funkcí.
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
Po vytvoření prostředku HTTPRoute se ujistěte, že je trasa přijata a naprogramuje se prostředek Služby Application Gateway pro kontejnery.
kubectl get httproute header-rewrite-route -n test-infra -o yaml
Ověřte, že se úspěšně aktualizoval stav prostředku služby Application Gateway for Containers.
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
Otestování přístupu k aplikaci
Teď jsme připraveni odeslat nějaký provoz do ukázkové aplikace prostřednictvím plně kvalifikovaného názvu domény přiřazeného front-endu. K získání plně kvalifikovaného názvu domény použijte následující příkaz:
fqdn=$(kubectl get gateway gateway-01 -n test-infra -o jsonpath='{.status.addresses[0].value}')
Pokud zadáte indikátor názvu serveru pomocí příkazu curl, contoso.com
pro plně kvalifikovaný název domény front-endu by výstup měl vrátit odpověď ze služby back-end-v1.
fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com
Prostřednictvím odpovědi bychom měli vidět:
{
"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"
}
Zadání hlavičky uživatelského agenta s hodnotou '' by mělo vrátit odpověď z back-endové služby 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/"
Prostřednictvím odpovědi bychom měli vidět:
{
"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"
}
Zadání client-custom-header
hlavičky s hodnotou moo
by mělo být z požadavku odebráno, když služba Application Gateway pro kontejnery inicializuje připojení k back-endové službě:
fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com -H "client-custom-header: moo"
Prostřednictvím odpovědi bychom měli vidět:
{
"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"
}
Blahopřejeme, nainstalovali jste kontroler ALB, nasadili back-endovou aplikaci a upravili hodnoty hlaviček prostřednictvím rozhraní API brány ve službě Application Gateway for Containers.