Dela via


URL-omskrivning för Azure Application Gateway för containrar – Ingress-API

Med Application Gateway för containrar kan du skriva om URL:en för en klientbegäran, inklusive begärandenas värdnamn och/eller sökväg. När Application Gateway for Containers initierar begäran till serverdelsmålet innehåller begäran den nyligen omskrivna URL:en för att initiera begäran.

Användningsinformation

URL-omskrivningar drar nytta av Application Gateway för containrars anpassade resurs IngressExtension.

Bakgrund

Med URL-omskrivning kan du omvandla en inkommande begäran till en annan URL när den skickas till ett backend-mål.

Följande bild illustrerar en begäran som är avsedd för contoso.com/shop som skrivs om till contoso.com/ecommerce när begäran initieras till backend-målet av Application Gateway for Containers:

Ett diagram som visar applikationsgatewayen för containrar som skriver om en URL till backend.

Förutsättningar

  1. Om du följer BYO-distributionsstrategin, kontrollera att du konfigurerar Applikationsgateway i containrar och ALB-styrenhet.
  2. Om du följer ALB-strategin för hanterad distribution, se till att du etablerar din ALB-styrenhet och etablerar resurser för Application Gateway för containrar via den anpassade resursen ApplicationLoadBalancer.
  3. Distribuera ett HTTP-exempelprogram:
    Använd följande deployment.yaml-fil i klustret för att skapa ett exempelwebbprogram för att demonstrera sökväg, fråga och rubrikbaserad routning.
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 kallade backend-v1 och backend-v2 i test-infra namnområdet
  • Två driftsättningar kallas backend-v1 och backend-v2 i test-infra-namnområdet

Distribuera nödvändiga INGRESS API-resurser

  1. Skapa en ingress som fångar upp all trafik och alla vägar till backend-v2
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
spec:
  ingressClassName: azure-alb-external
  rules:
    - host: contoso.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: backend-v2
                port:
                  number: 8080
EOF
  1. Skapa en ingress som matchar prefixet /shop som dirigerar till backend-v1
kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-02
  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: url-rewrite
spec:
  ingressClassName: azure-alb-external
  rules:
    - host: contoso.com
      http:
        paths:
          - path: /shop
            pathType: Prefix
            backend:
              service:
                name: backend-v1
                port:
                  number: 8080
EOF

Kommentar

När ALB-styrenheten skapar Application Gateway for Containers-resurser i Azure Resource Manager använder den följande namngivningskonvention för en klientdelsresurs: fe-<eight randomly generated characters>.

Om du vill ändra namnet på den frontend-resurs som skapats i Azure kan du överväga att följa en egen distributionsstrategi.

När varje ingressresurs skapas kontrollerar du att statusen är giltig, att lyssnaren är programmerad och att en adress har tilldelats till gatewayen.

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

Exempel på utdata från en av ingressresurserna.

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"},"name"
:"ingress-01","namespace":"test-infra"},"spec":{"ingressClassName":"azure-alb-external","rules":[{"host":"contoso.com","http":{"paths":[{"backend":{"service":{"name":"backend-v2","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:
      - backend:
          service:
            name: backend-v2
            port:
              number: 8080
        path: /
        pathType: Prefix
status:
  loadBalancer:
    ingress:
    - hostname: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.fzyy.alb.azure.com
      ports:
      - port: 80
        protocol: TCP

När ingressen har skapats skapar du en IngressExtension-resurs för contoso.com. Det här exemplet säkerställer att trafik som skickas till contoso.com/shop påbörjas som contoso.com/ecommerce till målet i backend.

kubectl apply -f - <<EOF
apiVersion: alb.networking.azure.io/v1
kind: IngressExtension
metadata:
  name: url-rewrite
  namespace: test-infra
spec:
  rules:
    - host: contoso.com
      rewrites:
      - type: URLRewrite
        urlRewrite:
          path:
            type: ReplacePrefixMatch
            replacePrefixMatch: /ecommerce
EOF

När Resursen IngressExtension har skapats kontrollerar du att IngressExtension-resursen visar Godkänd och att Application Gateway for Containers-resursen är programmerad.

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

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

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 contoso.com/shop för servernamn med hjälp av curl-kommandot returneras ett svar från backend-v1-tjänsten med den begärda sökvägen till serverdelsmålet som visar contoso.com/ecommerce.

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

Via svaret bör vi se:

{
 "path": "/ecommerce",
 "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 indikatorn contoso.com för servernamn med hjälp av curl-kommandot returneras ett svar från backend-v2-tjänsten som visas.

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

Följande svar bör visas:

{
 "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": [
   "adae8cc1-8030-4d95-9e05-237dd4e3941b"
  ]
 },
 "namespace": "test-infra",
 "ingress": "",
 "service": "",
 "pod": "backend-v2-594bd59865-ppv9w"
}

Grattis, du har installerat ALB Controller, distribuerat en backend-applikation och använt IngressExtension för att skriva om den begärda URL:en innan trafiken dirigeras till målet via Application Gateway för containrar.