Delen via


Header herschrijven voor Azure-toepassing Gateway for Containers - Toegangsbeheer-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 application gateway voor aangepaste ingressExtension-resource van container.

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 voorbeeld van een aanvraag waarbij een specifieke gebruikersagent wordt herschreven naar een vereenvoudigde waarde die wordt aangeroepen rewritten-user-agent 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 hebt ingesteld

  2. Als u de beheerde IMPLEMENTATIEstrategie van ALB volgt, moet u ervoor zorgen dat u uw ALB-controller hebt ingericht en de Application Gateway for Containers-resources hebt ingericht 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 api-resources voor inkomend verkeer implementeren

Maak een toegangsbeheerobjectresource om te luisteren naar aanvragen naar contoso.com:

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

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 toegangsbeheerresource is gemaakt, controleert u of de status de hostnaam van uw load balancer weergeeft en of beide poorten naar aanvragen luisteren.

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

Voorbeeld van een geslaagde uitvoer van het maken van inkomend verkeer.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.networking.azure.io/alb-frontend: FRONTEND_NAME
    alb.networking.azure.io/alb-id: /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/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/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/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

Zodra het inkomend verkeer is gemaakt, moeten we vervolgens een IngressExtension definiëren met de regels voor het herschrijven van de header.

In dit voorbeeld stellen we een statische gebruikersagent in met de waarde .rewritten-user-agent

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: 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

Zodra de IngressExtension-resource is gemaakt, moet u ervoor zorgen dat de resource geen validatiefouten retourneert en geldig is.

kubectl get IngressExtension header-rewrite -n test-infra -o yaml

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

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 ingress ingress-01 -n test-infra -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')

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

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 de gebruikersagent met de waarde my-user-agent opgeeft, moet er een antwoord worden geretourneerd van de back-endservice van rewritten-user-agent:

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

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-v1-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-v1-5b8fd96959-f59mm"
}

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