Divisione del traffico con il Gateway applicativo per contenitori - API gateway (anteprima)
Questo documento illustra come configurare un'applicazione di esempio che usa le risorse seguenti dell'API gateway:
- Gateway: creazione di un gateway con un listener HTTP
- HTTPRoute: creazione di una route HTTP che faccia riferimento a due servizi back-end con pesi diversi
Background
Il Gateway applicazione per contenitori consente di impostare pesi e spostare il traffico tra destinazioni back-end diverse. Vedere lo scenario di esempio seguente:
Prerequisiti
Importante
Il Gateway applicativo per contenitori è al momento disponibile in ANTEPRIMA.
Vedere le condizioni per l'utilizzo supplementari per le anteprime di Microsoft Azure per termini legali aggiuntivi che si applicano a funzionalità di Azure in versione beta, in anteprima o in altro modo non ancora disponibili a livello generale.
- Se si segue la strategia di distribuzione personalizzata BYO (Bring Your Own), assicurarsi di aver configurato le risorse Gateway applicativo per contenitori e il controller ALB
- Se si segue la strategia di distribuzione gestita di ALB, assicurarsi di aver effettuato il provisioning del controller ALB e delle risorse Gateway applicativo per contenitori tramite la risorsa personalizzata ApplicationLoadBalancer.
- Per distribuire l'applicazione di esempio HTTP, applicare il file deployment.yaml seguente nel cluster in modo da creare un'applicazione Web di esempio per illustrare il supporto del round robin ponderato o divisione del traffico.
kubectl apply -f https://trafficcontrollerdocs.blob.core.windows.net/examples/traffic-split-scenario/deployment.yaml
Questo comando crea gli elementi seguenti nel cluster:
- uno spazio dei nomi denominato
test-infra
- due servizi denominati
backend-v1
ebackend-v2
nello spazio dei nomitest-infra
- due distribuzioni denominate
backend-v1
ebackend-v2
nello spazio dei nomitest-infra
Distribuire le risorse necessarie per l'API gateway
Creare un 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
port: 80
protocol: HTTP
allowedRoutes:
namespaces:
from: Same
EOF
Nota
Quando il controller ALB crea le risorse Gateway applicativo per contenitori in ARM, userà la convenzione di denominazione seguente per una risorsa front-end: fe-<8 caratteri generati in modo casuale>
Se si vuole modificare il nome del front-end creato in Azure, valutare la possibilità di seguire la strategia di distribuzione BYO (Bring Your Own).
Dopo aver creato la risorsa gateway, verificare che lo stato sia valido, che il listener sia programmato e che al gateway sia assegnato un indirizzo.
kubectl get gateway gateway-01 -n test-infra -o yaml
Output di esempio della corretta creazione del gateway.
status:
addresses:
- type: IPAddress
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: gateway-01-http
supportedKinds:
- group: gateway.networking.k8s.io
kind: HTTPRoute
Dopo aver creato il gateway, creare una route HTTP
kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
name: traffic-split-route
namespace: test-infra
spec:
parentRefs:
- name: gateway-01
rules:
- backendRefs:
- name: backend-v1
port: 8080
weight: 50
- name: backend-v2
port: 8080
weight: 50
EOF
Dopo aver creato la risorsa HTTPRoute, verificare che la route sia accettata e che lo stato della risorsa Gateway applicativo per contenitori sia programmato.
kubectl get httproute traffic-split-route -n test-infra -o yaml
Verificare che l'aggiornamento dello stato della risorsa Gateway applicativo per contenitori sia riuscito.
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
Testare l'accesso all'applicazione
A questo punto, è possibile inviare traffico all'applicazione di esempio tramite il nome di dominio completo assegnato al front-end. Usare il comando seguente per ottenere il nome di dominio completo.
fqdn=$(kubectl get gateway gateway-01 -n test-infra -o jsonpath='{.status.addresses[0].value}')
Il curling di questo nome di dominio completo deve restituire risposte dai back-end/pod come configurato in HTTPRoute.
# this curl command will return 50% of the responses from backend-v1
# and the remaining 50% of the responses from backend-v2
watch -n 1 curl http://$fqdn
Congratulazioni. Il controller ALB è stato installato, è stata distribuita un'applicazione back-end e il traffico è stato instradato all'applicazione tramite la route in ingresso nel Gateway applicativo per contenitori.