Todos los productos
Search
Centro de documentos

Alibaba Cloud Service Mesh:Manage LLM traffic with ASM

Última actualización: Sep 05, 2026

Las aplicaciones que invocan API de Large Language Model (LLM) suelen gestionar protocolos específicos del proveedor, credenciales y configuración de TLS directamente en el código. Al cambiar de proveedor o dirigir distintos niveles de usuarios a diferentes modelos, estos cambios se propagan por toda la base de código. Alibaba Cloud Service Mesh (ASM) traslada esta complejidad a la infraestructura de malla: configure dos recursos personalizados de Kubernetes — LLMProvider y LLMRoute — y el sidecar de ASM se encarga automáticamente de la conversión de protocolo, la inyección de claves de API, la actualización de TLS y el enrutamiento de tráfico. Su aplicación envía solicitudes HTTP simples sin lógica específica del proveedor.

Con la gestión de tráfico de LLM en ASM, puede implementar acceso canary, enrutamiento ponderado y capacidades de observability:

  • Enrutamiento por encabezado de solicitud: Dirija las solicitudes a distintos modelos según los encabezados; por ejemplo, envíe a los suscriptores a un modelo premium mientras otros usuarios utilizan un modelo estándar.

  • División de tráfico por peso: Distribuya las solicitudes entre varios proveedores de LLM para realizar una migración gradual o comparaciones A/B.

  • Monitoreo de tráfico de LLM: Realice un seguimiento de métricas específicas de LLM mediante los paneles integrados de observability de ASM.

Funcionamiento

ASM introduce dos definiciones de recursos personalizados (CRD) que trabajan en conjunto para gestionar el tráfico de LLM:

Resource

Role

Applied to

LLMProvider

Define un servicio backend de LLM: host, ruta de API, modelo y clave de API

Plano de control de ASM (--kubeconfig=${PATH_TO_ASM_KUBECONFIG})

LLMRoute

Controla la distribución de solicitudes entre proveedores, con compatibilidad para coincidencia basada en encabezados y enrutamiento ponderado

Plano de control de ASM (--kubeconfig=${PATH_TO_ASM_KUBECONFIG})

Flujo de solicitud: Cuando un pod envía una solicitud HTTP simple al nombre de host de un proveedor de LLM, el sidecar de ASM intercepta la solicitud y automáticamente:

  1. La convierte al formato de finalización de chat compatible con OpenAI.

  2. Inyecta la clave de API desde la configuración de LLMProvider.

  3. Actualiza la conexión de HTTP a HTTPS.

  4. Reenvía la solicitud al endpoint del proveedor.

Esto significa que su aplicación envía una solicitud HTTP POST mínima, sin ruta de API, sin credenciales y sin configuración de TLS. El sidecar completa todos los campos necesarios a partir de la especificación de LLMProvider.

Requisitos previos

Antes de empezar, asegúrese de contar con lo siguiente:

Configuración del entorno de prueba

Despliegue un cliente de prueba y configure un proveedor básico de LLM antes de ejecutar cualquiera de los escenarios.

Paso 1: Desplegar la aplicación de prueba sleep

El pod sleep funciona como cliente para enviar solicitudes de prueba a los proveedores de LLM a través de la malla.

  1. Guarde el siguiente contenido como sleep.yaml:

    Contenido YAML

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: sleep
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: sleep
      labels:
        app: sleep
        service: sleep
    spec:
      ports:
      - port: 80
        name: http
      selector:
        app: sleep
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: sleep
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: sleep
      template:
        metadata:
          labels:
            app: sleep
        spec:
          terminationGracePeriodSeconds: 0
          serviceAccountName: sleep
          containers:
          - name: sleep
            image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/curl:asm-sleep
            command: ["/bin/sleep", "infinity"]
            imagePullPolicy: IfNotPresent
            volumeMounts:
            - mountPath: /etc/sleep/tls
              name: secret-volume
          volumes:
          - name: secret-volume
            secret:
              secretName: sleep-secret
              optional: true
    ---
  2. Aplique el manifiesto a su clúster de ACK:

    kubectl apply -f sleep.yaml

Paso 2: Configurar el proveedor de Model Studio

Cree un recurso LLMProvider que indique a ASM cómo conectarse a Alibaba Cloud Model Studio (DashScope).

  1. Guarde el siguiente contenido como LLMProvider.yaml. Reemplace <your-dashscope-api-key> con su clave de API de Model Studio.

    apiVersion: istio.alibabacloud.com/v1beta1
    kind: LLMProvider
    metadata:
      name: dashscope-qwen
    spec:
      host: dashscope.aliyuncs.com
      path: /compatible-mode/v1/chat/completions
      configs:
        defaultConfig:
          openAIConfig:
            model: qwen1.5-72b-chat  # Qwen open-source series model
            apiKey: <your-dashscope-api-key>

    Para consultar la lista completa de modelos de código abierto Qwen disponibles, véase Text generation - Qwen open-source models.

  2. Aplique el manifiesto a su instancia de ASM:

    kubectl --kubeconfig=${PATH_TO_ASM_KUBECONFIG} apply -f LLMProvider.yaml
  3. Compruebe la configuración mediante el envío de una solicitud de prueba desde el pod sleep:

    kubectl exec deployment/sleep -it -- curl --location 'http://dashscope.aliyuncs.com' \
      --header 'Content-Type: application/json' \
      --data '{
        "messages": [
          {"role": "user", "content": "Please introduce yourself."}
        ]
      }'

    Una respuesta exitosa tiene el siguiente aspecto:

    {
      "choices": [
        {
          "message": {
            "role": "assistant",
            "content": "Hello! I am Qwen, a pre-trained language model developed by Alibaba Cloud..."
          },
          "finish_reason": "stop",
          "index": 0
        }
      ],
      "model": "qwen1.5-72b-chat",
      "usage": {
        "prompt_tokens": 12,
        "completion_tokens": 130,
        "total_tokens": 142
      }
    }

    La solicitud se dirige a http://dashscope.aliyuncs.com sin especificar ruta, modelo ni clave de API. El sidecar de ASM completa estos campos desde la configuración de LLMProvider, actualiza la conexión a HTTPS y reenvía la solicitud a DashScope. Dado que Model Studio es compatible con el protocolo de OpenAI, la respuesta sigue el formato estándar de finalización de chat.

Escenario 1: Enrutamiento de solicitudes a distintos modelos por encabezado

Dirija a los usuarios de nivel suscriptor al modelo qwen-turbo, mientras que el resto utiliza el modelo predeterminado qwen1.5-72b-chat. La decisión de enrutamiento se basa en el encabezado de solicitud user-type.

Creación de la regla de enrutamiento

  1. Guarde el siguiente contenido como LLMRoute.yaml:

    apiVersion: istio.alibabacloud.com/v1beta1
    kind: LLMRoute
    metadata:
      name: dashscope-route
    spec:
      host: dashscope.aliyuncs.com  # Must match the LLMProvider host
      rules:
      - name: vip-route
        matches:
        - headers:
            user-type:
              exact: subscriber  # Match requests with this header value
        backendRefs:
        - providerHost: dashscope.aliyuncs.com
      - backendRefs:
        - providerHost: dashscope.aliyuncs.com

    La primera regla coincide con las solicitudes que incluyen un encabezado user-type: subscriber y las enruta mediante la regla de enrutamiento vip-route. La segunda regla actúa como captura predeterminada para todas las demás solicitudes.

  2. Aplique la regla de enrutamiento a su instancia de ASM:

    kubectl --kubeconfig=${PATH_TO_ASM_KUBECONFIG} apply -f LLMRoute.yaml

Asignación de un modelo a cada ruta

Actualice LLMProvider para especificar distintos modelos para la ruta predeterminada y para vip-route:

  1. Actualice LLMProvider.yaml con el siguiente contenido:

    apiVersion: istio.alibabacloud.com/v1beta1
    kind: LLMProvider
    metadata:
      name: dashscope-qwen
    spec:
      host: dashscope.aliyuncs.com
      path: /compatible-mode/v1/chat/completions
      configs:
        defaultConfig:
          openAIConfig:
            model: qwen1.5-72b-chat  # Default: open-source model
            apiKey: <your-dashscope-api-key>
        routeSpecificConfigs:
          vip-route:                  # Override for subscriber requests
            openAIConfig:
              model: qwen-turbo       # Subscribers use qwen-turbo
              apiKey: <your-dashscope-api-key>
  2. Aplique la actualización:

    kubectl --kubeconfig=${PATH_TO_ASM_KUBECONFIG} apply -f LLMProvider.yaml

Prueba del enrutamiento

Envíe dos solicitudes: una sin el encabezado (ruta predeterminada) y otra con el encabezado user-type: subscriber (ruta VIP):

# Default route: uses qwen1.5-72b-chat
kubectl exec deployment/sleep -it -- curl --location 'http://dashscope.aliyuncs.com' \
  --header 'Content-Type: application/json' \
  --data '{
    "messages": [
      {"role": "user", "content": "Please introduce yourself."}
    ]
  }'

# Subscriber route: uses qwen-turbo
kubectl exec deployment/sleep -it -- curl --location 'http://dashscope.aliyuncs.com' \
  --header 'Content-Type: application/json' \
  --header 'user-type: subscriber' \
  --data '{
    "messages": [
      {"role": "user", "content": "Please introduce yourself."}
    ]
  }'

Salida esperada:

{"choices":[{"message":{"role":"assistant","content":"Hello! I am Qwen, a pre-trained language model developed by Alibaba Cloud. My purpose is to assist users in generating various types of text, such as articles, stories, poems, and answering questions by leveraging my extensive knowledge and understanding of context. Although I'm an AI, I don't have a physical body or personal experiences like human beings do, but I've been trained on a vast corpus of text data, which allows me to engage in conversations, provide information, or help with various tasks to the best of my abilities. So, feel free to ask me anything, and I'll do my best to provide helpful and informative responses!"},"finish_reason":"stop","index":0,"logprobs":null}],"object":"chat.completion","usage":{"prompt_tokens":12,"completion_tokens":130,"total_tokens":142},"created":1720680044,"system_fingerprint":null,"model":"qwen1.5-72b-chat","id":"chatcmpl-1c33b950-3220-9bfe-9066-xxxxxxxxxxxx"}
{"choices":[{"message":{"role":"assistant","content":"Hello, I'm Qwen, a large language model from Alibaba Cloud. As an AI assistant, my goal is to help users get accurate and useful information, and to solve their problems and confusions. I can provide knowledge in various fields, engage in conversation, and even create text. Please note that all the content I provide is based on the data I was trained on and may not include the latest events or personal information. If you have any questions, feel free to ask me at any time!"},"finish_reason":"stop","index":0,"logprobs":null}],"object":"chat.completion","usage":{"prompt_tokens":11,"completion_tokens":85,"total_tokens":96},"created":1720683416,"system_fingerprint":null,"model":"qwen-turbo","id":"chatcmpl-9cbc7c56-06e9-9639-a50d-xxxxxxxxxxxx"}

Revise el campo model en cada respuesta. La solicitud predeterminada devuelve "model": "qwen1.5-72b-chat", mientras que la solicitud de suscriptor devuelve "model": "qwen-turbo".

Escenario 2: División de tráfico entre proveedores con enrutamiento ponderado

Divida el tráfico en proporción 50/50 entre Alibaba Cloud Model Studio (DashScope) y Moonshot AI. Este patrón resulta útil para migrar gradualmente entre proveedores o comparar el rendimiento de modelos lado a lado.

Paso 1: Configurar el proveedor de Moonshot

  1. Guarde el siguiente contenido como LLMProvider-moonshot.yaml. Reemplace <your-moonshot-api-key> con su clave de API de Moonshot AI.

    apiVersion: istio.alibabacloud.com/v1beta1
    kind: LLMProvider
    metadata:
      name: moonshot
    spec:
      host: api.moonshot.cn  # Must be unique across all LLMProviders
      path: /v1/chat/completions
      configs:
        defaultConfig:
          openAIConfig:
            model: moonshot-v1-8k
            stream: false
            apiKey: <your-moonshot-api-key>
  2. Aplique el manifiesto:

    kubectl --kubeconfig=${PATH_TO_ASM_KUBECONFIG} apply -f LLMProvider-moonshot.yaml

Paso 2: Crear un servicio virtual de LLM

Cree un Service de Kubernetes como punto de entrada único para las solicitudes de LLM. Este servicio no tiene pods de respaldo; el sidecar de ASM enruta todas las solicitudes a los proveedores de LLM definidos en LLMRoute.

  1. Guarde el siguiente contenido como demo-llm-server.yaml:

    apiVersion: v1
    kind: Service
    metadata:
      name: demo-llm-server
      namespace: default
    spec:
      ports:
      - name: http
        port: 80
        protocol: TCP
        targetPort: 80
      selector:
        app: none
      type: ClusterIP
  2. Aplique el manifiesto:

    kubectl apply -f demo-llm-server.yaml

Paso 3: Configurar el enrutamiento ponderado

Cree un recurso LLMRoute que distribuya el tráfico equitativamente entre DashScope y Moonshot:

  1. Guarde el siguiente contenido como LLMRoute.yaml:

    apiVersion: istio.alibabacloud.com/v1beta1
    kind: LLMRoute
    metadata:
      name: demo-llm-server
      namespace: default
    spec:
      host: demo-llm-server
      rules:
      - name: migrate-rule
        backendRefs:
        - providerHost: dashscope.aliyuncs.com
          weight: 50
        - providerHost: api.moonshot.cn
          weight: 50

    Ajuste los valores de weight para controlar la división del tráfico. Los pesos son relativos: 50/50 divide el tráfico equitativamente, mientras que 80/20 envía el 80 % a DashScope y el 20 % a Moonshot.

  2. Aplique la regla de enrutamiento:

    kubectl --kubeconfig=${PATH_TO_ASM_KUBECONFIG} apply -f LLMRoute.yaml

Prueba del enrutamiento ponderado

Envíe varias solicitudes al servicio virtual demo-llm-server y observe las respuestas:

kubectl exec deployment/sleep -it -- curl --location 'http://demo-llm-server' \
  --header 'Content-Type: application/json' \
  --data '{
    "messages": [
      {"role": "user", "content": "Please introduce yourself."}
    ]
  }'

Ejecute el comando varias veces. Algunas respuestas provienen de Moonshot (identificadas por "model": "moonshot-v1-8k" y el nombre del asistente Kimi), mientras que otras provienen de DashScope (identificadas por "model": "qwen1.5-72b-chat" y el nombre del asistente Qwen).

Salida esperada:

{"id":"cmpl-cafd47b181204cdbb4a4xxxxxxxxxxxx","object":"chat.completion","created":1720687132,"model":"moonshot-v1-8k","choices":[{"index":0,"message":{"role":"assistant","content":"Hello! I am an AI language model named Kimi. My main function is to help people generate human-like text. I can write articles, answer questions, provide advice, and more. I am trained on a massive amount of text data, so I can generate a wide variety of text. My goal is to help people communicate more effectively and solve problems."},"finish_reason":"stop"}],"usage":{"prompt_tokens":11,"completion_tokens":59,"total_tokens":70}}

{"choices":[{"message":{"role":"assistant","content":"Hello! I am Qwen, a pre-trained language model developed by Alibaba Cloud. My purpose is to assist users in generating various types of text, such as articles, stories, poems, and answering questions by leveraging my extensive knowledge and understanding of context. Although I'm an AI, I don't have a physical body or personal experiences like human beings do, but I've been trained on a vast corpus of text data, which allows me to engage in conversations, provide information, or help with various tasks to the best of my abilities. So, feel free to ask me anything, and I'll do my best to provide helpful and informative responses!"},"finish_reason":"stop","index":0,"logprobs":null}],"object":"chat.completion","usage":{"prompt_tokens":12,"completion_tokens":130,"total_tokens":142},"created":1720687164,"system_fingerprint":null,"model":"qwen1.5-72b-chat","id":"chatcmpl-2443772b-4e41-9ea8-9bed-xxxxxxxxxxxx"}

La salida muestra que las solicitudes se distribuyen equitativamente entre Moonshot y Alibaba Cloud Model Studio.

Referencia de recursos y marcadores de posición

Recursos de Kubernetes

YAML file

Kind

Name

Applied to

sleep.yaml

ServiceAccount, Service, Deployment

sleep

Clúster de ACK (kubectl apply)

LLMProvider.yaml

LLMProvider

dashscope-qwen

Instancia de ASM (--kubeconfig)

LLMProvider-moonshot.yaml

LLMProvider

moonshot

Instancia de ASM (--kubeconfig)

LLMRoute.yaml

LLMRoute

dashscope-route / demo-llm-server

Instancia de ASM (--kubeconfig)

demo-llm-server.yaml

Service

demo-llm-server

Clúster de ACK (kubectl apply)

Marcadores de posición

Reemplace los siguientes marcadores de posición con sus valores reales antes de aplicar los manifiestos YAML:

Placeholder

Description

Example

<your-dashscope-api-key>

Clave de API para Alibaba Cloud Model Studio

sk-xxxxxxxxxxxxx

<your-moonshot-api-key>

Clave de API para Moonshot AI

sk-xxxxxxxxxxxxx

${PATH_TO_ASM_KUBECONFIG}

Ruta al archivo kubeconfig de la instancia de ASM

~/.kube/asm-config