Usar agentgateway

agentgateway es un proxy de data plane que se puede usar como alternativa a Envoy. Está diseñado específicamente para el tráfico de agentes de IA y Model Context Protocol (MCP), a la vez que admite enrutamiento de propósito general en la capa 7 (L7). Cuando agentgateway está habilitado, Istio puede programarlo en lugar de Envoy para dos roles en una mesh ambient:

  • como un ingress gateway, que maneja el tráfico norte-sur que entra a la mesh, y
  • como un proxy waypoint, que maneja el procesamiento de capa 7 (L7) este-oeste para un conjunto de workloads.

Esta guía explica cómo funciona la integración, qué APIs son compatibles y cómo instalar Istio y configurar agentgateway para cada rol.

Cómo funciona la integración

Istiod configura agentgateway exclusivamente a través de recursos de la Gateway API de Kubernetes, que entrega al proxy mediante xDS. El proxy es una implementación de data plane distinta de Envoy: cuando un Gateway selecciona una GatewayClass de agentgateway, Istiod aprovisiona y gestiona un Deployment y un Service de agentgateway para él, de la misma manera que gestiona los gateways de Istio basados en Envoy.

Al habilitar agentgateway se registran dos recursos GatewayClass:

GatewayClassControladorRol
istio-agentgatewayistio.io/agentgateway-controllerIngress gateway
istio-agentgateway-waypointistio.io/agentgateway-waypoint-controllerProxy waypoint

Debido a que el data plane se selecciona por Gateway mediante el campo gatewayClassName, agentgateway y los gateways y waypoints basados en Envoy de Istio pueden coexistir en el mismo clúster. Eliges agentgateway para un gateway o waypoint específico simplemente haciendo referencia a una de las clases anteriores.

Configuración compatible y no compatible

Istio admite los siguientes recursos de Gateway API para agentgateway:

  • Gateway (usando la clase istio-agentgateway o istio-agentgateway-waypoint)
  • HTTPRoute, GRPCRoute, TCPRoute y TLSRoute
  • InferencePool, de la Gateway API Inference Extension, para enrutar hacia workloads de inferencia de IA

Antes de empezar

Ten en cuenta que las CRD de la API de Gateway de Kubernetes no vienen instaladas por defecto en la mayoría de los clusteres de Kubernetes, así que asegúrate de que estén instaladas antes de usar la API de Gateway:

$ kubectl get crd gateways.gateway.networking.k8s.io &> /dev/null || \
  kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.6.1/standard-install.yaml

Instalar Istio con agentgateway habilitado

El soporte de agentgateway está controlado por la feature flag PILOT_ENABLE_AGENTGATEWAY en istiod, y está deshabilitado de forma predeterminada. Instala Istio usando el perfil ambient con la flag habilitada. El perfil ambient es necesario para que la GatewayClass de waypoint también se registre:

$ istioctl install --set profile=ambient --set values.pilot.env.PILOT_ENABLE_AGENTGATEWAY=true -y

Confirma que ambos recursos GatewayClass de agentgateway están registrados:

$ kubectl get gatewayclass istio-agentgateway istio-agentgateway-waypoint
NAME                          CONTROLLER                                  ACCEPTED   AGE
istio-agentgateway            istio.io/agentgateway-controller            True       30s
istio-agentgateway-waypoint   istio.io/agentgateway-waypoint-controller   True       30s

Desplegar una aplicación de ejemplo

Despliega la aplicación de ejemplo Bookinfo, que se usa en los ejemplos de esta guía:

Zip
$ kubectl apply -f @samples/bookinfo/platform/kube/bookinfo.yaml@

Configurar agentgateway como un ingress gateway

Para usar agentgateway como un ingress gateway, crea un Gateway que haga referencia a la clase istio-agentgateway. Istiod aprovisiona y gestiona automáticamente el despliegue de agentgateway correspondiente.

$ kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: bookinfo-gateway
  annotations:
    networking.istio.io/service-type: ClusterIP
spec:
  gatewayClassName: istio-agentgateway
  listeners:
  - name: http
    port: 80
    protocol: HTTP
    allowedRoutes:
      namespaces:
        from: Same
EOF

El campo gatewayClassName: istio-agentgateway es lo que selecciona el data plane de agentgateway en lugar de Envoy. De forma predeterminada, Istio crea un servicio LoadBalancer para un gateway; la anotación networking.istio.io/service-type: ClusterIP solicita en su lugar un servicio ClusterIP para que el gateway se pueda alcanzar con kubectl port-forward en esta guía.

Adjunta un HTTPRoute para exponer el servicio productpage a través del gateway:

$ kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: bookinfo
spec:
  parentRefs:
  - name: bookinfo-gateway
  rules:
  - matches:
    - path:
        type: Exact
        value: /productpage
    - path:
        type: PathPrefix
        value: /static
    - path:
        type: Exact
        value: /login
    - path:
        type: PathPrefix
        value: /api/v1/products
    backendRefs:
    - name: productpage
      port: 9080
EOF

Confirma que el gateway se ha aprovisionado y está programado. La columna CLASS muestra la clase de agentgateway:

$ kubectl get gateway bookinfo-gateway
NAME               CLASS                ADDRESS                                      PROGRAMMED   AGE
bookinfo-gateway   istio-agentgateway   bookinfo-gateway.default.svc.cluster.local   True         30s

Ahora puedes acceder a la aplicación a través del ingress gateway de agentgateway. Reenvía un puerto local al servicio del gateway y abre http://localhost:8080/productpage en tu navegador:

$ kubectl port-forward svc/bookinfo-gateway 8080:80

Configurar agentgateway como un waypoint

Un proxy waypoint agrega procesamiento de capa 7 (L7) a un conjunto de workloads en una mesh ambient. Para usar agentgateway en este rol, despliega un Gateway que haga referencia a la clase istio-agentgateway-waypoint.

Primero, confirma que el namespace está inscrito en el data plane ambient:

$ kubectl label namespace default istio.io/dataplane-mode=ambient
namespace/default labeled

Despliega el waypoint. Como todos los waypoints, debe definir un único listener llamado mesh en el puerto 15008 usando el protocolo HBONE; la única diferencia con un waypoint de Envoy es el gatewayClassName:

$ kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: agentgateway-waypoint
  labels:
    istio.io/waypoint-for: service
spec:
  gatewayClassName: istio-agentgateway-waypoint
  listeners:
  - name: mesh
    port: 15008
    protocol: HBONE
EOF

Confirma que el waypoint está programado:

$ kubectl get gateway agentgateway-waypoint
NAME                    CLASS                         ADDRESS        PROGRAMMED   AGE
agentgateway-waypoint   istio-agentgateway-waypoint   10.96.15.112   True         30s

Inscribe un servicio para usar el waypoint agregando la etiqueta istio.io/use-waypoint con el nombre del waypoint. Por ejemplo, para enviar el tráfico destinado al servicio reviews a través del waypoint de agentgateway:

$ kubectl label service reviews istio.io/use-waypoint=agentgateway-waypoint
service/reviews labeled

Las solicitudes de los workloads en la mesh ambient hacia el servicio reviews ahora se enrutan a través del waypoint de agentgateway para el procesamiento de capa 7 (L7). Para obtener más información sobre cómo inscribir namespaces, servicios y pods, y cómo los waypoints manejan los diferentes tipos de tráfico, consulta Configurar proxies waypoint.

Para aplicar una política de enrutamiento de capa 7 (L7) en el waypoint, adjunta una ruta de la Gateway API al Service usando una parentRef cuyo kind sea Service. Por ejemplo, el siguiente HTTPRoute envía el 90% del tráfico del servicio reviews a reviews-v1 y el 10% a reviews-v2:

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: reviews
spec:
  parentRefs:
  - group: ""
    kind: Service
    name: reviews
    port: 9080
  rules:
  - backendRefs:
    - name: reviews-v1
      port: 9080
      weight: 90
    - name: reviews-v2
      port: 9080
      weight: 10

Limpieza

Elimina el ingress gateway y su ruta:

$ kubectl delete httproute bookinfo
$ kubectl delete gateway bookinfo-gateway

Elimina el waypoint y desinscribe el servicio reviews:

$ kubectl label service reviews istio.io/use-waypoint-
$ kubectl delete gateway agentgateway-waypoint

Elimina la aplicación de ejemplo y la etiqueta ambient:

Zip
$ kubectl delete -f @samples/bookinfo/platform/kube/bookinfo.yaml@
$ kubectl label namespace default istio.io/dataplane-mode-

Desinstala Istio:

$ istioctl uninstall --purge -y
$ kubectl delete namespace istio-system

Elimina las CRD de la API de Gateway de Kubernetes:

$ kubectl delete -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.6.1/standard-install.yaml
¿Fue útil esta información?
¿Tienes alguna sugerencia para mejorar?

¡Gracias por tus comentarios!