Dela via


Rubrikomskrivning för Azure Application Gateway för containrar – API för ingress

Med Application Gateway för containrar kan du skriva om HTTP-huvuden för klientbegäranden och svar från serverdelsmål.

Användningsinformation

Sidhuvudomskrivningar drar nytta av Application Gateway för containerns anpassade resurs IngressExtension.

Bakgrund

Med sidhuvudomskrivningar kan du ändra begärande- och svarshuvudena till och från dina serverdelsmål.

Följande bild illustrerar ett exempel på en begäran med en specifik användaragent som skrivs om till ett förenklat värde som anropas rewritten-user-agent när begäran initieras till serverdelsmålet av Application Gateway för containrar:

Ett diagram som visar application gatewayen för containrar som skriver om ett begärandehuvud till serverdelen.

Förutsättningar

  1. Om du följer BYO-distributionsstrategin kontrollerar du att du har konfigurerat application gateway för containrar-resurser och ALB-styrenhet

  2. Om du följer den hanterade distributionsstrategin för ALB kontrollerar du att du har etablerat ALB-styrenheten och etablerat Application Gateway for Containers-resurserna via den anpassade resursen ApplicationLoadBalancer.

  3. Distribuera HTTP-exempelprogrammet Använd följande deployment.yaml-fil i klustret för att skapa ett exempelwebbprogram för att demonstrera sidhuvudomskrivningen.

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

    Det här kommandot skapar följande i klustret:

    • ett namnområde med namnet test-infra
    • två tjänster anropas backend-v1 och backend-v2 i test-infra namnområdet
    • två distributioner anropas backend-v1 och backend-v2 i test-infra namnområdet

Distribuera nödvändiga INGRESS API-resurser

Skapa en ingressresurs för att lyssna efter begäranden till 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

Kommentar

När ALB-styrenheten skapar Application Gateway for Containers-resurser i ARM använder den följande namngivningskonvention för en klientdelsresurs: fe-8< slumpmässigt genererade tecken>

Om du vill ändra namnet på klientdelen som skapats i Azure kan du överväga att följa din egen distributionsstrategi.

När ingressresursen har skapats kontrollerar du att statusen visar värdnamnet för lastbalanseraren och att båda portarna lyssnar efter begäranden.

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

Exempel på utdata från skapande av inkommande.

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

När ingressen har skapats måste vi sedan definiera en IngressExtension med omskrivningsreglerna för huvudet.

I det här exemplet anger vi en statisk användaragent med värdet rewritten-user-agent.

Det här exemplet visar också tillägg av en ny rubrik med AGC-Header-Add namnet med värdet AGC-value och tar bort en begäranderubrik med namnet client-custom-header.

Dricks

I det här exemplet kan vi använda HTTPHeaderMatch för "Exact" för en strängmatchning, men en demonstration används i reguljära uttryck för att illustrera ytterligare funktioner.

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

När Resursen IngressExtension har skapats kontrollerar du att resursen returnerar Inga valideringsfel och är giltig.

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

Kontrollera att statusen för Application Gateway for Containers-resursen har uppdaterats.

Testa åtkomsten till programmet

Nu är vi redo att skicka trafik till vårt exempelprogram via det FQDN som tilldelats klientdelen. Använd följande kommando för att hämta FQDN.

fqdn=$(kubectl get ingress ingress-01 -n test-infra -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')

Om du anger indikatorn för servernamn med hjälp av curl-kommandot contoso.com returneras ett svar från backend-v1-tjänsten för klientdelens FQDN.

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

Via svaret bör vi se:

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

Om du anger ett användaragenthuvud med värdet my-user-agent ska ett svar returneras från serverdelstjänsten för rewritten-user-agent:

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

Via svaret bör vi se:

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

Om du anger en client-custom-header rubrik med värdet moo ska du ta bort från begäran när Application Gateway for Containers initierar anslutningen till serverdelstjänsten:

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

Via svaret bör vi se:

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

Grattis, du har installerat ALB-styrenheten, distribuerat ett serverdelsprogram och ändrat rubrikvärden via ingress-API på Application Gateway för containrar.