División del tráfico con Puerta de enlace de aplicaciones para contenedores: API de puerta de enlace

Este documento ayuda a configurar una aplicación de ejemplo que usa los siguientes recursos de la API de puerta de enlace:

  • Puerta de enlace: creación de una puerta de enlace con un cliente de escucha HTTP
  • HTTPRoute: creación de una ruta HTTP que hace referencia a dos servicios de back-end que tienen pesos diferentes

Fondo

La Puerta de enlace de aplicaciones para contenedores le permite establecer pesos y desplazar el tráfico entre distintos destinos de back-end. Consulte el siguiente escenario de ejemplo:

A figure showing traffic splitting with Application Gateway for Containers.

Requisitos previos

  1. Si sigue la estrategia de implementación BYO, asegúrese de configurar los recursos de Puerta de enlace de aplicaciones para contenedores y el controlador de ALB.

  2. Si sigue la estrategia de implementación administrada de ALB, asegúrese de que ha aprovisionado el controlador de ALB y los recursos de puerta de enlace de aplicaciones para contenedores a través del recurso personalizado ApplicationLoadBalancer.

  3. Despliegue la aplicación HTTP de ejemplo:
    Aplique el siguiente archivo deployment.yaml en el clúster para crear una aplicación web de ejemplo para demostrar la compatibilidad con el tráfico dividido o round robin ponderado.

    kubectl apply -f https://raw.githubusercontent.com/MicrosoftDocs/azure-docs/refs/heads/main/articles/application-gateway/for-containers/examples/traffic-split-scenario/deployment.yaml
    

    Este comando crea lo siguiente en el clúster:

    • Un espacio de nombres denominado test-infra
    • Dos servicios llamados backend-v1 y backend-v2 en el espacio de nombres test-infra
    • Dos implementaciones llamadas backend-v1 y backend-v2 en el espacio de nombres test-infra

Implementación de los recursos necesarios de la API de puerta de enlace

Cree una puerta de enlace:

kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
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:

Cuando el controlador de ALB cree los recursos de Puerta de enlace de aplicaciones para contenedores en ARM, usará las siguientes convenciones de nomenclatura para un recurso de frontend: fe-<8 caracteres generados aleatoriamente>

Si desea cambiar el nombre del frontend creado en Azure, considere la posibilidad de seguir la estrategia Traiga su propia implementación.

Una vez creado el recurso de puerta de enlace, asegúrese de que el estado sea válido, de que el cliente de escucha se haya programado y de que se haya asignado una dirección a la puerta de enlace.

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

Salida de ejemplo de la creación correcta de la puerta de enlace.

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: gateway-01-http
    supportedKinds:
    - group: gateway.networking.k8s.io
      kind: HTTPRoute

Una vez creada la puerta de enlace, cree una instancia de HTTPRoute

kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
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

Una vez creado el recurso HTTPRoute, asegúrese de que la ruta se haya aceptado y de que el recurso de Puerta de enlace de aplicaciones para contenedores se haya programado.

kubectl get httproute traffic-split-route -n test-infra -o yaml

Compruebe que el estado del recurso de Puerta de enlace de aplicaciones para contenedores se haya actualizado correctamente.

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

Prueba de acceso a la aplicación

Ahora, estamos listos para enviar tráfico a nuestra aplicación de ejemplo mediante el FQDN asignado al frontend. Utilice el siguiente comando para obtener el FQDN:

fqdn=$(kubectl get gateway gateway-01 -n test-infra -o jsonpath='{.status.addresses[0].value}')

La consulta de este FQDN debería devolver respuestas de los backend o los pods tal y como está configurado en 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

Enhorabuena, ha instalado el controlador de ALB, ha implementado una aplicación de back-end y enrutado el tráfico a la aplicación a través de la entrada en una puerta de enlace de aplicaciones para contenedores.