外部客户端通过ASM入口网关访问LLM服务

ASM支持通过入口网关访问外部LLM服务。在请求链路中引入ASM网关之后,您可以使用ASM网关提供的诸多能力,比如流量按比例分流、请求可观测以及丰富的认证、授权能力。本文主要介绍集群外客户端如何通过ASM入口网关访问外部LLM服务。

功能概述

通过入口网关访问外部LLM服务主要适用于集群外客户端访问LLM服务的场景,ASM网关提供了诸多的路由、安全以及可观测的能力,并且支持LLM流量管理。通过ASM网关,您可以快速、安全地对接外部LLM服务。

本文示例的请求链路如下所示:

image

前提条件

步骤一:创建LLMProvider

  1. 使用以下内容,创建如下LLMProvider.yaml。

    apiVersion: istio.alibabacloud.com/v1beta1
    kind: LLMProvider
    metadata:  
      name: dashscope-qwen
      namespace: istio-system
    spec:
      workloadSelector:
        labels:
          istio: ingressgateway
      host: dashscope.aliyuncs.com
      path: /compatible-mode/v1/chat/completions
      configs:
        defaultConfig:
          openAIConfig:
            model: qwen-1.8b-chat  # 千问开源系列大模型
            stream: false
            apiKey: ${API_KEY}
  2. 使用ASM集群kubeconfig,执行以下命令,创建LLMProvider。

    kubectl apply -f LLMProvider.yaml

步骤二:创建网关规则

  1. 使用以下内容,创建如下网关规则ingress-gw.yaml。

    apiVersion: networking.istio.io/v1beta1
    kind: Gateway
    metadata:
      name: ingress-gw
      namespace: istio-system
    spec:
      selector:
        istio: ingressgateway
      servers:
        - hosts:
            - '*'
          port:
            name: http
            number: 80
            protocol: HTTP
  2. 执行以下命令,创建网关规则。

    kubectl apply -f ingress-gw.yaml

步骤三:创建LLMRoute

  1. 使用以下内容,创建dashscope-route.yaml。

    apiVersion: istio.alibabacloud.com/v1beta1
    kind: LLMRoute
    metadata:  
      name: dashscope-route
    spec:
      host: "*"
      gateways:
      - istio-system/ingress-gw
      rules:
      - name: ingress-route
        matches:
        - headers:
            host:
              exact: dashscope.aliyuncs.com  # 处理dashscope.aliyuncs.com的路由,否则会返回404。
        - headers:
            host:
              exact: test.com # 处理test.com的请求。请求被ASM LLM插件处理后,会重新触发路由匹配,进入上面的匹配条件。
        backendRefs:
        - providerHost: dashscope.aliyuncs.com
  2. 执行以下命令,创建LLMRoute。

    kubectl apply -f dashscope-route.yaml

步骤四:测试

在本地终端执行以下命令进行测试。

curl --location '${ASM网关IP}:80' \
--header 'Content-Type: application/json' \
--header "host: test.com" \
--data '{
    "messages": [
        {"role": "user", "content": "请介绍你自己"}
    ]
}'

预期输出:

{"choices":[{"message":{"role":"assistant","content":"我是来自阿里云的大规模语言模型,我叫通义千问。我的主要功能是回答用户的问题、提供信息和进行对话交流。我可以理解用户的提问,并基于自然语言生成相应的答案或建议。我也可以学习新的知识,并将其应用于各种场景中。如果您有任何问题或需要帮助,请随时告诉我,我会尽力为您提供支持。"},"finish_reason":"stop","index":0,"logprobs":null}],"object":"chat.completion","usage":{"prompt_tokens":3,"completion_tokens":72,"total_tokens":75},"created":1720682745,"system_fingerprint":null,"model":"qwen-1.8b-chat","id":"chatcmpl-3d117bd7-9bfb-9121-9fc2-xxxxxxxxxxxx"}

可以看到请求链路已经打通。

步骤五:使用ASM网关安全能力

本步骤将创建一个简单的授权策略,拒绝本机IP通过ASM网关访问LLM服务。

  1. 使用以下内容创建auth-policy.yaml。

    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
      labels:
        gateway: ingressgateway
      name: auth-policy
      namespace: istio-system
    spec:
      action: DENY
      rules:
        - from:
            - source:
                ipBlocks:
                  - ${本机IP}
          to:
            - operation:
                hosts:
                  - test.com
      selector:
        matchLabels:
          istio: ingressgateway
  2. 执行以下命令,部署授权策略。

    kubectl apply -f auth-policy.yaml
  3. 再次执行步骤四中的测试命令进行测试,可以看到如下结果:

    RBAC: access denied
说明

ASM网关针对普通HTTP请求所具备的安全能力同样适用于LLM请求,包括完整的授权策略、JWT认证和自定义授权服务等。通过在出口网关上应用这些策略,可以更有效地保障您的应用安全。