Přepsání hlaviček pro bránu Aplikace Azure pro kontejnery – rozhraní API příchozího přenosu dat
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á službu Application Gateway pro vlastní prostředek IngressExtension kontejneru.
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 příklad požadavku s přepsaným konkrétním uživatelským agentem na zjednodušenou hodnotu, která se volá rewritten-user-agent
při inicializování požadavku do back-endového cíle službou Application Gateway pro kontejnery:
Požadavky
Pokud sledujete strategii 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 albem, ujistěte se, že jste zřídili kontroler ALB a zřídili prostředky Application Gateway for Containers prostřednictvím vlastního prostředku ApplicationLoadBalancer.
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://trafficcontrollerdocs.blob.core.windows.net/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 příchozího přenosu dat
Vytvořte prostředek příchozího přenosu dat, který bude naslouchat požadavkům contoso.com
na:
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
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 příchozího přenosu dat se ujistěte, že stav zobrazuje název hostitele vašeho nástroje pro vyrovnávání zatížení a že oba porty naslouchají požadavkům.
kubectl get ingress ingress-01 -n test-infra -o yaml
Příklad výstupu úspěšného vytvoření příchozího přenosu dat
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
alb.networking.azure.io/alb-frontend: FRONTEND_NAME
alb.networking.azure.io/alb-id: /subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/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/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/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
Po vytvoření příchozího přenosu dat musíme definovat ingressExtension pomocí pravidel přepsání hlaviček.
V tomto příkladu nastavíme statický uživatelský agent s hodnotou rewritten-user-agent
.
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 používá v regulárním výrazu pro neistenci dalších schopností.
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
Po vytvoření prostředku IngressExtension se ujistěte, že prostředek nevrátí žádné chyby ověření a je platný.
kubectl get IngressExtension header-rewrite -n test-infra -o yaml
Ověřte, že se úspěšně aktualizoval stav prostředku služby Application Gateway for Containers.
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 ingress ingress-01 -n test-infra -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
Pokud pomocí příkazu curl zadáte indikátor názvu serveru, contoso.com
vrátí se pro front-endový plně kvalifikovaný název domény 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 my-user-agent
by mělo vrátit odpověď z back-endové rewritten-user-agent
služby :
fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com -H "user-agent: my-user-agent"
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-v1-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-v1-5b8fd96959-f59mm"
}
Blahopřejeme, nainstalovali jste kontroler ALB, nasadili back-endovou aplikaci a upravili hodnoty hlaviček prostřednictvím rozhraní API příchozího přenosu dat ve službě Application Gateway for Containers.