Ponowne zapisywanie nagłówka dla bramy aplikacja systemu Azure dla kontenerów — interfejs API bramy
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łówków korzysta z filtrów zdefiniowanych przez interfejs API bramy Kubernetes.
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 żądanie z ponownym zapisem określonego agenta użytkownika do uproszczonej wartości o nazwie SearchEngine-BingBot 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 kontrolera usługi ALB
Jeśli korzystasz ze strategii wdrażania zarządzanego przez usługę ALB, upewnij się, że aprowizacja kontrolera usługi ALB zasobów 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 bramy
Utwórz bramę:
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
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 bramy upewnij się, że stan jest prawidłowy, odbiornik jest zaprogramowany, a adres jest przypisany do bramy.
kubectl get gateway gateway-01 -n test-infra -o yaml
Przykładowe dane wyjściowe pomyślnego utworzenia bramy.
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 utworzeniu bramy utwórz usługę HTTPRoute, która nasłuchuje nazwy hosta contoso.com i zastępuje wartość user-agent do elementu SearchEngine-BingBot.
W tym przykładzie szukamy agenta użytkownika używanego przez wyszukiwarkę Bing i upraszczamy nagłówek searchEngine-BingBot, aby ułatwić analizowanie zaplecza.
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: 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 utworzeniu zasobu usługi HTTPRoute upewnij się, że trasa jest zaakceptowana , a zasób Application Gateway for Containers jest zaprogramowany.
kubectl get httproute header-rewrite-route -n test-infra -o yaml
Sprawdź, czy stan zasobu usługi Application Gateway dla kontenerów został pomyślnie zaktualizowany.
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
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 gateway gateway-01 -n test-infra -o jsonpath='{.status.addresses[0].value}')
Jeśli określisz wskaźnik nazwy serwera przy użyciu polecenia curl, contoso.com
dla nazwy FQDN frontonu dane wyjściowe powinny zwrócić 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 o wartości "" powinno zwrócić odpowiedź z usługi zaplecza 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/"
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-v2-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-v2-5b8fd96959-f59mm"
}
Gratulacje, zainstalowano kontroler usługi ALB, wdrożono aplikację zaplecza i zmodyfikowano wartości nagłówków za pośrednictwem interfejsu API bramy w usłudze Application Gateway for Containers.