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:

Diagram znázorňující službu Application Gateway for Containers, která přepisuje hlavičku požadavku do back-endu

Požadavky

  1. Pokud sledujete strategii 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 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.

  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 příchozího přenosu dat

Vytvořte prostředek příchozího přenosu dat, který bude naslouchat požadavkům contoso.comna:

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-agentsluž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.