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:
- Maak een gatewayresource met één HTTPS-listener.
- Maak een HTTPRoute-resource die verwijst naar een back-endservice.
- Gebruik HTTPRouteMatch om die route uit te voeren
matches
op basis van pad, header en querytekenreeks.
Achtergrond
Application Gateway for Containers maakt verkeersroutering mogelijk op basis van URL-pad, queryreeks en header. Zie het volgende voorbeeldscenario:
Vereisten
Als u de BYO-implementatiestrategie volgt, moet u ervoor zorgen dat u uw Application Gateway for Containers-resources en DE ALB-controller hebt ingesteld
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.
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
enbackend-v2
in detest-infra
naamruimte - twee implementaties die worden aangeroepen
backend-v1
enbackend-v2
in detest-infra
naamruimte
- een naamruimte met de naam
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:
- Als het pad /bar is, wordt verkeer doorgestuurd naar de back-end-v2-service op poort 8080 OF
- 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.
- 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.