Delen via


URL herschrijven voor Azure-toepassing Gateway for Containers - Api voor inkomend verkeer

Met Application Gateway for Containers kunt u de URL van een clientaanvraag herschrijven, inclusief de hostnaam en/of het pad van de aanvragen. Wanneer Application Gateway for Containers de aanvraag initieert naar het back-enddoel, bevat de aanvraag de zojuist herschreven URL om de aanvraag te initiëren.

Gebruiksgegevens

URL-herschrijven maken gebruik van de aangepaste resource inGressExtension van Application Gateway voor containers.

Achtergrond

Met URL-herschrijven kunt u een binnenkomende aanvraag vertalen naar een andere URL wanneer deze wordt gestart naar een back-enddoel.

In de volgende afbeelding ziet u een aanvraag die is bestemd voor contoso.com/shop worden herschreven naar contoso.com/ecommerce wanneer de aanvraag wordt gestart naar het back-enddoel door Application Gateway for Containers:

Een diagram waarin de Application Gateway for Containers een URL 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 u uw ALB-controller inricht en de Application Gateway for Containers-resources inricht via de aangepaste applicationLoadBalancer-resource.
  3. Voorbeeld-HTTP-toepassing implementeren:
    Pas het volgende bestand deployment.yaml toe op uw cluster om een voorbeeldwebtoepassing te maken om pad-, query- en headergebaseerde routering 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

  1. Een inkomend verkeer maken dat al het verkeer en routes naar back-end-v2 onderschept
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. Een inkomend verkeer maken dat overeenkomt met het voorvoegsel /shop dat wordt gerouteerd naar back-end-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

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.

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

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

Voorbeelduitvoer van een van de toegangsbeheerobjectbronnen.

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

Wanneer het inkomend verkeer wordt gemaakt, maakt u een IngressExtension-resource voor contoso.com. Dit voorbeeld zorgt ervoor dat verkeer dat naar contoso.com/shop wordt verzonden, wordt gestart als contoso.com/ecommerce het back-enddoel.

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

Wanneer de IngressExtension-resource is gemaakt, controleert u of de ingressExtension-resource Geaccepteerd wordt weergegeven en of de Application Gateway for Containers-resource is geprogrammeerd.

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

Controleer of de Application Gateway for Containers-resource is bijgewerkt voor de IngressExtension.

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 contoso.com/shop opgeeft met behulp van de curl-opdracht, wordt een antwoord van de back-end-v1-service geretourneerd met het aangevraagde pad naar het back-enddoel.contoso.com/ecommerce

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

Via het antwoord moeten we het volgende zien:

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

Als u de servernaamindicator contoso.com opgeeft met behulp van de curl-opdracht, wordt er een antwoord geretourneerd van de back-end-v2-service, zoals wordt weergegeven.

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

Het volgende antwoord moet worden weergegeven:

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

Gefeliciteerd, u hebt EEN ALB-controller geïnstalleerd, een back-endtoepassing geïmplementeerd en de IngressExtension gebruikt om de aangevraagde URL van de client opnieuw te schrijven voordat verkeer wordt ingesteld op het doel op Application Gateway for Containers.