Delen via


Pad-, header- en queryreeksroutering met Application Gateway for Containers - Gateway-API

Dit document helpt u bij het instellen van een voorbeeldtoepassing die gebruikmaakt van de resources van de Gateway-API om verkeersroutering te demonstreren op basis van URL-pad, queryreeks en header. Er worden stappen gegeven voor:

Achtergrond

Application Gateway for Containers maakt verkeersroutering mogelijk op basis van URL-pad, queryreeks en header. Zie het volgende voorbeeldscenario:

Een afbeelding met pad-, header- en queryreeksroutering met Application Gateway for Containers.

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 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 gateway-API-resources implementeren

Een gateway maken:

kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1beta1
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: Hostname
    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 om twee verschillende overeenkomsten te definiëren en een standaardservice om verkeer naar te routeren.

De manier waarop de volgende regels worden gelezen, zijn als volgt:

  1. Als het pad /bar is, wordt verkeer doorgestuurd naar de back-end-v2-service op poort 8080 OF
  2. Als de aanvraag een HTTP-header bevat met de naammagie en de waarde foo, bevat de URL een queryreeks die de naam definieert die de naam geweldig is met een waarde van bijvoorbeeld EN het pad is /some/thing, wordt de aanvraag verzonden naar back-end-v2 op poort 8080.
  3. Anders worden alle andere aanvragen doorgestuurd naar de back-end-v1-service op poort 8080.
kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
  name: http-route
  namespace: test-infra
spec:
  parentRefs:
  - name: gateway-01
    namespace: test-infra
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /bar
    backendRefs:
    - name: backend-v2
      port: 8080
  - matches:
    - headers:
      - type: Exact
        name: magic
        value: foo
      queryParams:
      - type: Exact
        name: great
        value: example
      path:
        type: PathPrefix
        value: /some/thing
      method: GET
    backendRefs:
    - name: backend-v2
      port: 8080
  - backendRefs:
    - name: backend-v1
      port: 8080
EOF

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

kubectl get httproute http-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}')

Met behulp van de curl-opdracht kunnen we drie verschillende scenario's valideren:

Routering op basis van pad

In dit scenario wordt de clientaanvraag die naar http://frontend-fqdn/bar wordt verzonden, doorgestuurd naar de back-end-v2-service.

Voer de volgende opdracht uit:

curl http://$fqdn/bar

U ziet dat de container die de aanvraag verwerkt, back-end-v2 is.

Querytekenreeks + header + padroutering

In dit scenario wordt de clientaanvraag die wordt http://frontend-fqdn/some/thing?great=example verzonden met een headersleutel/waardegedeelte van 'magic: foo' doorgestuurd naar de back-end-v2-service.

Voer de volgende opdracht uit:

curl http://$fqdn/some/thing?great=example -H "magic: foo"

U ziet dat de container die de aanvraag verwerkt, back-end-v2 is.

Standaardroute

Als aan geen van de eerste twee scenario's wordt voldaan, stuurt Application Gateway for Containers alle andere aanvragen naar de back-end-v1-service.

Voer de volgende opdracht uit:

curl http://$fqdn/

U ziet dat de container die de aanvraag verwerkt, back-end-v1 is.

Gefeliciteerd, u hebt EEN ALB-controller geïnstalleerd, een back-endtoepassing geïmplementeerd en verkeer naar de toepassing gerouteerd via gateway-API op Application Gateway for Containers.