Udostępnij przez


Ponowne zapisywanie nagłówka dla usługi Azure Application Gateway 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

Przepisywanie nagłówków korzysta z filtrów zdefiniowanych przez Kubernetes Gateway API.

Background

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:

Diagram przedstawiający usługę Application Gateway for Containers ponownie zapisującą nagłówek żądania do zaplecza.

Prerequisites

  1. Jeśli wykonasz strategię wdrażania BYO, upewnij się, że skonfigurujesz usługę Application Gateway dla zasobów kontenerów i kontrolera ALB

  2. Jeśli korzystasz ze strategii wdrażania zarządzanego przez ALB, upewnij się, że zarówno Kontroler ALB, jak i zasoby Application Gateway for Containers są aprowizowane za pośrednictwem zasobu niestandardowego ApplicationLoadBalancer.

  3. 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 w klastrze następujące elementy:

    • przestrzeń nazw o nazwie test-infra
    • dwie usługi o nazwie backend-v1 i backend-v2 w test-infra przestrzeni nazw
    • dwa wdrożenia o nazwie backend-v1 i backend-v2 w test-infra przestrzeni nazw

Wdróż wymagane zasoby Gateway API

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

Note

Gdy kontroler usługi ALB tworzy zasoby usługi Application Gateway for Containers w usłudze Azure Resource Manager, używa następującej konwencji nazewnictwa dla zasobu frontonu: fe-<eight randomly generated characters>.

Jeśli chcesz zmienić nazwę zasobu interfejsu frontowego utworzonego w Azure, rozważ zastosowanie strategii wdrożenia 'bring-your-own'.

Po utworzeniu zasobu bramy upewnij się, że stan jest prawidłowy, nasłuchiwacz jest zaprogramowany, a do bramy przypisano adres.

kubectl get gateway gateway-01 -n test-infra -o yaml

Przykładowy wynik pomyślnie utworzonej 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 HTTPRoute, która nasłuchuje nazwę hosta contoso.com i zastępuje wartość user-agent na SearchEngine-BingBot.

W tym przykładzie szukamy agenta użytkownika, jakiego używa wyszukiwarka Bing i upraszczamy jego nagłówek na SearchEngine-BingBot, ułatwiając przetwarzanie po stronie serwera.

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.

Tip

W tym przykładzie, chociaż możemy użyć wartości HTTPHeaderMatch "Exact" do dopasowania ciągu, demonstracja jest przedstawiona przy użyciu wyrażeń regularnych, aby zilustrować dalsze 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

Note

Modyfikowanie nagłówka Host nie jest obsługiwane za pomocą requestHeaderModifier reguły. Aby zastąpić Host wartość określoną dla docelowego systemu backend, użyj filtru URLRewrite.

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 jesteśmy gotowi wysłać ruch do naszej przykładowej aplikacji za pośrednictwem FQDN przypisanego do frontend. Użyj następującego polecenia, aby uzyskać 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 FQDN frontendu, dane wyjściowe powinny zawierać odpowiedź z usługi backend-v1.

fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com

W odpowiedzi powinniśmy zobaczyć:

{
 "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 powinniśmy zobaczyć:

{
 "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 powinniśmy zobaczyć:

{
 "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 ALB, wdrożono aplikację zaplecza i zmodyfikowano wartości nagłówków za pomocą Gateway API w usłudze Application Gateway for Containers.