Delen via


Header herschrijven voor Azure-toepassing Gateway for Containers - Gateway-API

Met Application Gateway voor containers kunt u HTTP-headers van clientaanvragen en antwoorden van back-enddoelen herschrijven.

Gebruiksgegevens

Herschrijven van headers maken gebruik van filters zoals gedefinieerd door de Kubernetes Gateway-API.

Achtergrond

Met herschrijven van headers kunt u de aanvraag- en antwoordheaders wijzigen van en naar uw back-enddoelen.

In de volgende afbeelding ziet u een aanvraag waarbij een specifieke gebruikersagent opnieuw wordt geschreven naar een vereenvoudigde waarde met de naam SearchEngine-BingBot wanneer de aanvraag wordt gestart naar het back-enddoel door Application Gateway for Containers:

Een diagram waarin de Application Gateway for Containers een aanvraagheader herschrijft naar de back-end.

Vereisten

  1. Als u de BYO-implementatiestrategie volgt, moet u ervoor zorgen dat u uw Application Gateway for Containers-resources en DE ALB-controller instelt

  2. Als u de beheerde IMPLEMENTATIEstrategie van ALB volgt, moet u ervoor zorgen dat de ALB-controller de Application Gateway for Containers-resources inricht via de aangepaste applicationLoadBalancer-resource.

  3. Implementeer de voorbeeld-HTTP-toepassing Pas het volgende bestand deployment.yaml toe op uw cluster om een voorbeeldwebtoepassing te maken om het herschrijven van de header te demonstreren.

    kubectl apply -f https://raw.githubusercontent.com/MicrosoftDocs/azure-docs/refs/heads/main/articles/application-gateway/for-containers/examples/traffic-split-scenario/deployment.yaml
    

    Met deze opdracht maakt u het volgende op uw cluster:

    • een naamruimte met de naam test-infra
    • twee services die worden aangeroepen backend-v1 en backend-v2 in de test-infra naamruimte
    • twee implementaties die worden aangeroepen backend-v1 en backend-v2 in de test-infra naamruimte

De vereiste gateway-API-resources implementeren

Een gateway maken:

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

Notitie

Wanneer de ALB-controller de Application Gateway for Containers-resources in ARM maakt, wordt de volgende naamconventie gebruikt voor een front-endresource: fe-8< willekeurig gegenereerde tekens>

Als u de naam van de front-end die in Azure is gemaakt, wilt wijzigen, kunt u overwegen om uw eigen implementatiestrategie te volgen.

Zodra de gatewayresource is gemaakt, controleert u of de status geldig is, wordt de listener geprogrammeerd en wordt er een adres toegewezen aan de gateway.

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

Voorbeelduitvoer van geslaagde gateway maken.

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

Zodra de gateway is gemaakt, maakt u een HTTPRoute die luistert naar hostnaam contoso.com en overschrijft u de waarde van de gebruikersagent naar SearchEngine-BingBot.

In dit voorbeeld zoeken we naar de gebruikersagent die wordt gebruikt door de Bing-zoekmachine en vereenvoudigen we de header naar SearchEngine-BingBot voor eenvoudigere back-endparsering.

In dit voorbeeld wordt ook het toevoegen van een nieuwe header gedemonstreert die wordt aangeroepen AGC-Header-Add met een waarde van AGC-value en verwijdert u een aanvraagheader met de naam client-custom-header.

Tip

In dit voorbeeld kunnen we de HTTPHeaderMatch van 'Exact' gebruiken voor een tekenreeksovereenkomst, maar er wordt een demonstratie gebruikt in de reguliere expressie voor illustratie van verdere mogelijkheden.

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

Zodra de HTTPRoute-resource is gemaakt, controleert u of de route wordt geaccepteerd en of de Application Gateway for Containers-resource is geprogrammeerd.

kubectl get httproute header-rewrite-route -n test-infra -o yaml

Controleer of de status van de Application Gateway for Containers-resource is bijgewerkt.

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

Toegang tot de toepassing testen

Nu zijn we klaar om verkeer naar onze voorbeeldtoepassing te verzenden, via de FQDN die is toegewezen aan de front-end. Gebruik de volgende opdracht om de FQDN op te halen:

fqdn=$(kubectl get gateway gateway-01 -n test-infra -o jsonpath='{.status.addresses[0].value}')

Als u de servernaamindicator opgeeft met behulp van de curl-opdracht, contoso.com moet de uitvoer voor de front-end-FQDN een antwoord retourneren van de back-end-v1-service.

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

Via het antwoord moeten we het volgende zien:

{
 "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"
}

Als u een header van een gebruikersagent met de waarde '' opgeeft, moet een antwoord worden geretourneerd van de back-endservice van 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/"

Via het antwoord moeten we het volgende zien:

{
 "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"
}

Het opgeven van een client-custom-header header met de waarde moo moet worden verwijderd uit de aanvraag wanneer Application Gateway voor Containers de verbinding met de back-endservice start:

fqdnIp=$(dig +short $fqdn)
curl -k --resolve contoso.com:80:$fqdnIp http://contoso.com -H "client-custom-header: moo"

Via het antwoord moeten we het volgende zien:

{
 "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"
}

Gefeliciteerd, u hebt EEN ALB-controller geïnstalleerd, een back-endtoepassing geïmplementeerd en headerwaarden gewijzigd via gateway-API in Application Gateway for Containers.