Ponowne zapisywanie nagłówka dla bramy aplikacja systemu Azure dla kontenerów — interfejs API ruchu przychodzącego
Usługa Application Gateway for Containers umożliwia ponowne zapisywanie nagłówków HTTP żądań klientów i odpowiedzi z obiektów docelowych zaplecza.
Szczegóły użycia
Ponowne zapisywanie nagłówka korzysta z usługi Application Gateway dla zasobu niestandardowego IngressExtension kontenera.
Tło
Ponowne zapisywanie nagłówków umożliwia modyfikowanie nagłówków żądań i odpowiedzi do i z obiektów docelowych zaplecza.
Na poniższej ilustracji przedstawiono przykład żądania z ponownym zapisem określonego agenta użytkownika do uproszczonej wartości wywoływanej rewritten-user-agent
po zainicjowaniu żądania do obiektu docelowego zaplecza przez usługę Application Gateway for Containers:
Wymagania wstępne
Jeśli wykonasz strategię wdrażania byo, upewnij się, że skonfigurowaliśmy usługę Application Gateway dla zasobów kontenerów i kontroler usługi ALB
Jeśli wykonano strategię wdrażania zarządzanego usługi ALB, upewnij się, że aprowizowaliśmy kontroler usługi ALB i aprowizowaliśmy zasoby usługi Application Gateway for Containers za pośrednictwem zasobu niestandardowego ApplicationLoadBalancer.
Wdróż przykładową aplikację HTTP Zastosuj następujący plik deployment.yaml w klastrze, aby utworzyć przykładową aplikację internetową, aby zademonstrować ponowne zapisywanie nagłówka.
kubectl apply -f https://raw.githubusercontent.com/MicrosoftDocs/azure-docs/refs/heads/main/articles/application-gateway/for-containers/examples/traffic-split-scenario/deployment.yaml
To polecenie tworzy następujące polecenie w klastrze:
- przestrzeń nazw o nazwie
test-infra
- dwie usługi o nazwie
backend-v1
ibackend-v2
wtest-infra
przestrzeni nazw - dwa wdrożenia o nazwie
backend-v1
ibackend-v2
wtest-infra
przestrzeni nazw
- przestrzeń nazw o nazwie
Wdrażanie wymaganych zasobów interfejsu API ruchu przychodzącego
Utwórz zasób ruchu przychodzącego, aby nasłuchiwać żądań do 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
Uwaga
Gdy kontroler usługi ALB tworzy bramę Application Gateway dla zasobów kontenerów w usłudze ARM, użyje następującej konwencji nazewnictwa dla zasobu frontonu: fe-8< losowo wygenerowanych znaków>
Jeśli chcesz zmienić nazwę frontonu utworzonego na platformie Azure, rozważ zastosowanie własnej strategii wdrażania.
Po utworzeniu zasobu ruchu przychodzącego upewnij się, że stan zawiera nazwę hosta modułu równoważenia obciążenia i że oba porty nasłuchują żądań.
kubectl get ingress ingress-01 -n test-infra -o yaml
Przykładowe dane wyjściowe pomyślnego utworzenia ruchu przychodzącego.
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
Po utworzeniu ruchu przychodzącego należy zdefiniować rozszerzenie IngressExtension przy użyciu reguł ponownego zapisywania nagłówka.
W tym przykładzie ustawimy statycznego agenta użytkownika z wartością rewritten-user-agent
.
W tym przykładzie pokazano również dodanie nowego nagłówka o nazwie AGC-Header-Add
z wartością AGC-value
i usunięcie nagłówka żądania o nazwie client-custom-header
.
Napiwek
W tym przykładzie, chociaż możemy użyć wartości HTTPHeaderMatch "Exact" dla dopasowania ciągu, demonstracja jest używana w wyrażeniu regularnym w celu zilustrowania dalszych możliwości.
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 utworzeniu zasobu IngressExtension upewnij się, że zasób zwraca wartość Brak błędów walidacji i jest prawidłowy.
kubectl get IngressExtension header-rewrite -n test-infra -o yaml
Sprawdź, czy stan zasobu usługi Application Gateway dla kontenerów został pomyślnie zaktualizowany.
Testowanie dostępu do aplikacji
Teraz możemy wysłać jakiś ruch do naszej przykładowej aplikacji za pośrednictwem nazwy FQDN przypisanej do frontonu. Użyj następującego polecenia, aby uzyskać nazwę FQDN.
fqdn=$(kubectl get ingress ingress-01 -n test-infra -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
Jeśli określisz wskaźnik nazwy serwera przy użyciu polecenia curl, contoso.com
dla nazwy FQDN frontonu zostanie zwrócona odpowiedź z usługi backend-v1.
fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com
W odpowiedzi powinna zostać wyświetlona następująca odpowiedź:
{
"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"
}
Określenie nagłówka user-agent z wartością my-user-agent
powinno zwrócić odpowiedź z usługi zaplecza elementu rewritten-user-agent
:
fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com -H "user-agent: my-user-agent"
W odpowiedzi powinna zostać wyświetlona następująca odpowiedź:
{
"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"
}
Określenie client-custom-header
nagłówka z wartością moo
powinno zostać usunięte z żądania, gdy usługa Application Gateway dla kontenerów inicjuje połączenie z usługą zaplecza:
fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com -H "client-custom-header: moo"
W odpowiedzi powinna zostać wyświetlona następująca odpowiedź:
{
"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"
}
Gratulacje, zainstalowano kontroler usługi ALB, wdrożono aplikację zaplecza i zmodyfikowano wartości nagłówków za pośrednictwem interfejsu API ruchu przychodzącego w usłudze Application Gateway for Containers.