Dela via


Sökväg, sidhuvud och frågesträngsroutning med Application Gateway för containrar – Gateway-API

Det här dokumentet hjälper dig att konfigurera ett exempelprogram som använder resurserna från Gateway-API:et för att demonstrera trafikroutning baserat på URL-sökväg, frågesträng och sidhuvud. Steg tillhandahålls för att:

  • Skapa en gatewayresurs med en HTTPS-lyssnare.
  • Skapa en HTTPRoute-resurs som refererar till en serverdelstjänst.
  • Använd HTTPRouteMatch för att utföra matches den vägen baserat på sökväg, sidhuvud och frågesträng.

Bakgrund

Application Gateway för containrar möjliggör trafikroutning baserat på URL-sökväg, frågesträng och sidhuvud. Se följande exempelscenario:

En bild som visar sökväg, sidhuvud och frågesträngsroutning med Application Gateway för containrar.

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 sökväg, fråga och rubrikbaserad routning.

    kubectl apply -f https://trafficcontrollerdocs.blob.core.windows.net/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 de gateway-API-resurser som krävs

Skapa en gateway:

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

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 gatewayresursen har skapats kontrollerar du att statusen är giltig, att lyssnaren är programmerad och att en adress har tilldelats till gatewayen.

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

Exempel på att gatewayen har skapats.

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

När gatewayen har skapats skapar du en HTTPRoute för att definiera två olika matchningar och en standardtjänst att dirigera trafik till.

Så här lyder följande regler:

  1. Om sökvägen är /bar dirigeras trafiken till backend-v2-tjänsten på port 8080 OR
  2. Om begäran innehåller ett HTTP-huvud med namnmagi och värde-foo innehåller URL:en frågesträng som definierar namnet bra med ett exempelvärde, OCH sökvägen är /some/thing, skickas begäran till backend-v2 på port 8080.
  3. Annars dirigeras alla andra begäranden till backend-v1-tjänsten på port 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

När HTTPRoute-resursen har skapats kontrollerar du att vägen har godkänts och att Application Gateway for Containers-resursen har programmerats.

kubectl get httproute http-route -n test-infra -o yaml

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

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

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

Med hjälp av curl-kommandot kan vi verifiera tre olika scenarier:

Sökvägsbaserad routning

I det här scenariot dirigeras klientbegäran som skickas till http://frontend-fqdn/bar backend-v2-tjänsten.

Kör följande kommando:

curl http://$fqdn/bar

Observera att containern som betjänar begäran är backend-v2.

Frågesträng + rubrik + sökvägsroutning

I det här scenariot dirigeras klientbegäran som skickas till http://frontend-fqdn/some/thing?great=example med en huvudnyckel/värde-del av "magic: foo" till backend-v2-tjänsten.

Kör följande kommando:

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

Observera att containern som betjänar begäran är backend-v2.

Standardväg

Om inget av de två första scenarierna är uppfyllt dirigerar Application Gateway for Containers alla andra begäranden till backend-v1-tjänsten.

Kör följande kommando:

curl http://$fqdn/

Observera att containern som betjänar begäran är backend-v1.

Grattis, du har installerat ALB Controller, distribuerat ett serverdelsprogram och dirigerat trafik till programmet via Gateway-API:et på Application Gateway för containrar.