全部產品
Search
文件中心

Alibaba Cloud Service Mesh:使用ASM回退功能構建高可用的LLM服務

更新時間:Feb 28, 2026

在LLM情境中,業務應用需要對接內部或外部的基本模型服務。Service Mesh (ASM)支援同時對接多個基本模型服務,並且可以實現當一個模型服務不可用時,自動回退到另一個模型服務,助力企業實現LLM應用的高可用。本文介紹如何在對接LLM服務時使用流量回退功能。

前提條件

步驟一:建立兩個LLMProvider

  1. 使用以下內容建立provider.yaml。此YAML將會在ASM中建立兩個LLMProvider,一個是測試Provider,用於類比Provider出現無法提供服務時的情境,另一個是可以正常使用的千問Provider。

    apiVersion: istio.alibabacloud.com/v1beta1
    kind: LLMProvider
    metadata:  
      name: asm-llm-provider-test
    spec:
      host: asm-llm-provider-test.com
      path: /compatible-mode/v1/chat/completions
      workloadSelector:
        labels:
          app: sleep
      configs:
        defaultConfig:
          openAIConfig:
            model: test-model
            stream: false
            apiKey: test-api-key
    ---
    apiVersion: istio.alibabacloud.com/v1beta1
    kind: LLMProvider
    metadata:  
      name: dashscope-qwen
    spec:
      host: dashscope.aliyuncs.com
      path: /compatible-mode/v1/chat/completions
      workloadSelector:
        labels:
          app: sleep
      configs:
        defaultConfig:
          openAIConfig:
            model: qwen1.5-72b-chat  # 千問開源系列大模型
            stream: false
            apiKey: ${dashscope的API_KEY}
    您可以根據實際需求修改.spec.configs.defaultConfig.openAIConfig.model來體驗其他模型。更多千問開源模型,請參見文本產生-千問-開源版
  2. 使用ASM的kubeconfig執行以下命令,部署LLMProvider。

    kubectl apply -f provider.yaml

步驟二:配置異常端點驅逐策略以及回退策略

異常端點驅逐策略需要在目標規則中進行配置。通過配置驅逐策略和回退策略,可以在LLM請求出現異常時,驅逐對應的Provider,並將請求流量回退到可用的Provider上。LLMProvider資源預設會自動產生對應的目標規則,因此需要修改對應的目標規則資源來添加異常端點驅逐策略。

  1. 執行以下命令,為LLMProvider asm-llm-provider-test配置註解以開啟自訂目標規則,防止修改後的目標規則被ASM控制面覆蓋。

    kubectl annotate llmprovider asm-llm-provider-test asm.alibabacloud.com/custom-destinationrule=true
  2. 執行以下命令,修改目標規則,增加異常端點驅逐策略。

    kubectl edit DestinationRule/asm-llm-provider-test

    修改後目標規則如下。

    apiVersion: networking.istio.io/v1beta1
    kind: DestinationRule
    metadata:
      name: asm-llm-provider-test
      namespace: default
    spec:
      host: asm-llm-provider-test.com
      trafficPolicy:
        portLevelSettings:
        - port:
            number: 80
          tls:
            mode: SIMPLE
            sni: asm-llm-provider-test
          outlierDetection:
            consecutive5xxErrors: 1
            interval: 1s
            baseEjectionTime: 10s
            maxEjectionPercent: 100
            minHealthPercent: 0

    以上修改在目標規則中新增了一段outlierDetection配置。如果LLM請求在1s內出現1個5xx錯誤,將驅逐該端點,驅逐的時間長度為10s。

    outlierDetection配置說明如下:

    配置項

    說明

    consecutive5xxErrors

    定義在驅逐之前,允許的連續5xx錯誤請求的最大數量。如果達到這個閾值,將進行驅逐。預設值為5,即如果連續五次請求返回5xx錯誤,服務將被標記為不健康。

    interval

    定義活動訊號間隔時間時間,即多長時間檢查一次服務的健康情況。預設值為10s。例如,5s表示每五秒檢查一次。支援格式為1h/1m/1s/1ms,最小值必須≥1ms

    baseEjectionTime

    指定服務被驅逐的基礎時間。即一個服務在被標識為不健康後,將在此時間內不被重新使用,預設值為30s。支援格式為1h/1m/1s/1ms,最小值必須≥1ms

    maxEjectionPercent

    允許被驅逐的最大服務比例,防止過多服務被同時排除。例如,設定為100表示可以驅逐所有服務。預設值為10%

    minHealthPercent

    定義健康服務的最小百分比,以確保在驅逐某些服務後,仍然有足夠的健康服務可供請求處理。預設值為0,表示禁用檢測當前是否存在處於健康狀態的服務,即允許所有服務被標記為不健康。

    更多關於outlierDetection的配置資訊,請參見OutlierDetection

  3. 建立虛擬服務,配置回退策略。

    1. 使用以下內容,建立vs.yaml。

      apiVersion: networking.istio.io/v1alpha3
      kind: VirtualService
      metadata:
        name: test-fallback-llm-vs
        namespace: default
      spec:
        hosts:
        - asm-llm-provider-test.com
        http:
        - name: fallback-route
          route:
          - destination:
              host: asm-llm-provider-test.com
              port:
                number: 80
            fallback:
              target:
                host: dashscope.aliyuncs.com
    2. 執行以下命令,建立虛擬服務。

      kubectl apply -f vs.yaml

      此配置聲明了當asm-llm-provider-test.com被判定為不健康時,請求將自動轉寄給dashscope.aliyuncs.com

步驟三:建立測試應用sleep

為了確保配置的asm-llm-provider-test.com可以被DNS解析,此sleep Deployment中使用hostAlias添加了靜態DNS配置。
  1. 使用以下內容,建立sleep.yaml

    展開查看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: 
          hostAliases:
          - hostnames:
            - asm-llm-provider-test.com
            ip: 1.2.3.4
          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. 使用資料面叢集的kubeconfig,執行以下命令。

    kubectl apply -f sleep.yaml

步驟四:測試

從sleep Pod中連續發起兩次以下LLM請求。

本文中配置的驅逐時間長度為10s,因此需要在10s內發起第二次請求。您可以根據實際業務需求,自行調整outlierDetection配置。

kubectl exec deployment/sleep -it -- curl http://asm-llm-provider-test.com \
--header 'Content-Type: application/json' \
--data '{
    "messages": [
        {"role": "user", "content": "請介紹你自己"}
    ]
}'

預期輸出:

no healthy upstream%
{"choices":[{"message":{"role":"assistant","content":"我是來自阿里雲的大規模語言模型,我叫千問。我的主要功能是回答使用者的問題、提供資訊和進行對話交流。我可以理解使用者的提問,並基於自然語言產生相應的答案或建議。我也可以學習新的知識,並將其應用於各種情境中。如果您有任何問題或需要協助,請隨時告訴我,我會儘力為您提供支援。"},"finish_reason":"stop","index":0,"logprobs":null}],"object":"chat.completion","usage":{"prompt_tokens":11,"completion_tokens":72,"total_tokens":83},"created":1730261854,"system_fingerprint":null,"model":"qwen1.5-72b-chat","id":"xxxxxx"}

可以看到,請求直接被發送給了dashscope.aliyuncs.com。

相關文檔

流量回退是流量路由中的一種重要流量管理原則,當請求鏈路中某個LLM Provider出現臨時的不可用狀態時,您可以通過配置異常驅逐和回退策略來確保服務的正常運行。若您想瞭解更多流量路由的應用情境,例如不同使用者訪問不同的LLM Provider,請參見流量路由:使用ASM高效管理LLM流量