Přepsání hlaviček pro bránu Aplikace Azure 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:

A diagram showing the Application Gateway for Containers rewriting a request header to the backend.

Požadavky

  1. Pokud se řídí strategií nasazení BYO, ujistěte se, že jste nastavili službu Application Gateway pro prostředky kontejnerů a kontroler ALB.

  2. 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.

  3. 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 a backend-v2 v test-infra oboru názvů
    • dvě volaná backend-v1 nasazení a backend-v2 v test-infra oboru názvů

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 používá v regulárním výrazu pro neistenci dalších schopností.

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ž AGC zahájí 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.