Kubernetes AI 应用基础设施开源实践:Solo.io 项目拆解与 TaoToken 统一接入

发布时间:2026/10/2 19:29:03
Kubernetes AI 应用基础设施开源实践:Solo.io 项目拆解与 TaoToken 统一接入 1. 从一次本地 Kind 集群的 AI 网关实验说起Kubernetes 上跑 AI 应用最容易被低估的一环不是模型本身而是模型服务前面的那层流量治理。我在本地用 Kind 起了一个三节点集群把 kgateway、kagent、agentgateway、kmcp 这几个 Solo.io 的开源项目依次装了一遍想验证一件事能不能用一套统一的网关和 Agent 框架把 LLM 调用、工具调用、Agent 之间的通信都收拢到同一个入口并且用同一把 Key 打通模型服务。结论是可以但中间踩了不少坑尤其是模型服务地址和鉴权配置这两块。这篇文章面向的是已经在用 Kubernetes、想给 AI 应用补上基础设施层的平台工程师和 DevOps。我会给出可复制的 Kind 集群清单、Solo.io 组件的配置片段以及通过 TaoToken 统一 Key 接入模型服务的 Base URL 和验证请求。整套流程从部署到调用形成闭环你照着做就能在本地跑通。Solo.io 这几个项目分工很清晰kgateway 是 Kubernetes Gateway API 实现前身是 Gloo Gateway基于 Envoy 做数据面2025 年新增了 AI Gateway 能力支持 Prompt Guard 和推理服务编排kagent 是 Kubernetes 原生的 Agentic AI 框架用 CRD 定义和运行 AI 智能体agentgateway 是专门为 Agent 通信设计的数据面代理原生支持 A2A 和 MCP 协议kmcp 则是 MCP Server 的开发运维工具集提供脚手架、镜像构建、部署和 CRD 控制器。这四个项目组合起来基本覆盖了从模型接入、Agent 编排到工具服务交付的完整链路。我这次实验的核心目标是把模型服务的接入点统一到 TaoToken 的 API 通道上。这样做的原因是本地实验环境里模型来源经常变今天用这个、明天换那个如果每个组件都单独配一遍 Key 和 Base URL维护成本很高。用统一通道之后kgateway 的 InferencePool、kagent 的 LLM 提供商配置、agentgateway 的后端模型地址都指向同一个入口换模型只需要改一处。2. TaoToken 统一接入Base URL 与 Key 的前置准备在开始部署之前先把模型服务的接入通道准备好。TaoToken 提供的是 OpenAI 兼容的 API 接口这意味着任何支持 OpenAI 协议的客户端和框架都能直接对接不需要改代码。对于 Kubernetes 上的 AI 基础设施来说这一点很关键因为 kgateway、kagent 这些组件默认就是按 OpenAI 兼容格式去调用模型的。你需要准备两样东西API Key 和 Base URL。API Key 在控制台创建地址是 https://taotoken.net/api-keys 创建后复制保存后面配置里会用到。Base URL 是 https://taotoken.net/api 注意这个地址不带任何路径后缀OpenAI 兼容的客户端会自动拼接 /v1/chat/completions 这类路径。模型 ID 这块TaoToken 的模型列表里包含多个主流模型你在配置时填对应的 Model ID 即可。比如 kagent 的 Agent CR 里需要指定模型名称kgateway 的 InferencePool 需要指定后端模型标识这些地方填的都是同一个 Model ID。我建议在正式配置 Kubernetes 组件之前先用 curl 验证一下 Key 和 Base URL 是否可用。这一步能排除掉大部分低级错误比如 Key 复制时多了空格、Base URL 写成了带 /v1 的地址等。验证命令如下curl -s https://taotoken.net/api/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -d { model: gpt-4o-mini, messages: [{role: user, content: ping}], max_tokens: 16 }如果返回的 JSON 里有 choices 字段说明通道正常。如果返回 401检查 Key 是否正确如果返回 404检查 Base URL 是否多写了路径。这一步通过之后再往下做 Kubernetes 组件的配置。对于长期在集群里跑 Agent 和推理服务的场景建议用 Coding Plan 的额度比按量计费更适合持续调用。控制台地址是 https://taotoken.net/console 可以查看用量和额度情况。如果你只是想先验证模型对话效果可以直接在模型对话页面测试地址是 https://taotoken.net/chat 。把 Key 存进 Kubernetes Secret 是标准做法不要硬编码在 YAML 里。创建 Secret 的命令kubectl create secret generic taotoken-credentials \ --from-literalapi-key$TAOTOKEN_API_KEY \ -n kgateway-system这个 Secret 后面会被 kgateway 和 kagent 引用。注意命名空间要和组件部署的命名空间一致我统一放在 kgateway-system 里你也可以按自己的规划调整。3. Kind 集群与 Solo.io 组件的可复制配置先创建 Kind 集群。我用的配置是三节点一个控制面两个工作节点足够跑通所有组件。把下面的内容保存为 kind-config.yamlkind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: - role: control-plane extraPortMappings: - containerPort: 30080 hostPort: 30080 protocol: TCP - role: worker - role: worker创建集群kind create cluster --name solo-ai --config kind-config.yaml集群起来之后先装 kgateway。用 Helm 安装helm install kgateway-crds oci://ghcr.io/kgateway-dev/charts/kgateway-crds \ --version v2.0.0 \ --namespace kgateway-system \ --create-namespace helm install kgateway oci://ghcr.io/kgateway-dev/charts/kgateway \ --version v2.0.0 \ --namespace kgateway-system \ --set inferenceExtension.enabledtrue安装完成后创建一个 Gateway 资源作为 AI 流量的统一入口。保存为 gateway.yamlapiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: name: ai-gateway namespace: kgateway-system spec: gatewayClassName: kgateway listeners: - name: http protocol: HTTP port: 80 allowedRoutes: namespaces: from: All应用之后再创建一个 HTTPRoute把模型调用路径转发到后端。这里的关键是后端地址指向 TaoToken 的 API 通道。保存为 httproute.yamlapiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: taotoken-route namespace: kgateway-system spec: parentRefs: - name: ai-gateway rules: - matches: - path: type: PathPrefix value: /v1 backendRefs: - group: kind: Service name: taotoken-external port: 443因为 TaoToken 是外部服务需要创建一个 ExternalName Service 或者用 Backend 资源指向外部地址。更简单的方式是用 kgateway 的 Backend 资源apiVersion: gateway.kgateway.dev/v1alpha1 kind: Backend metadata: name: taotoken-backend namespace: kgateway-system spec: type: Static static: hosts: - host: taotoken.net port: 443然后在 HTTPRoute 里引用这个 Backend。同时配置 TLS 和鉴权把 API Key 通过 header 注入。这部分用 TrafficPolicy 实现apiVersion: gateway.kgateway.dev/v1alpha1 kind: TrafficPolicy metadata: name: taotoken-auth namespace: kgateway-system spec: targetRefs: - kind: HTTPRoute name: taotoken-route group: gateway.networking.k8s.io transformation: request: set: - name: Authorization value: Bearer ${TAOTOKEN_API_KEY}注意这里的 ${TAOTOKEN_API_KEY} 需要从 Secret 引用实际配置时用 valueFrom 或者环境变量替换。kgateway 支持从 Secret 读取具体写法参考官方文档的 transformation 部分。接下来装 kagent。kagent 的安装需要先配置 LLM 提供商这里直接指向 TaoTokenhelm install kagent oci://ghcr.io/kagent-dev/kagent/helm/kagent \ --namespace kagent \ --create-namespace \ --set providers.openai.baseUrlhttps://taotoken.net/api \ --set providers.openai.apiKeySecret.nametaotoken-credentials \ --set providers.openai.apiKeySecret.keyapi-key装完之后创建一个 Agent CR 来验证。保存为 agent.yamlapiVersion: kagent.dev/v1alpha1 kind: Agent metadata: name: k8s-inspector namespace: kagent spec: model: gpt-4o-mini provider: openai systemPrompt: 你是一个 Kubernetes 运维助手帮助排查 Pod 和 Service 问题。 tools: - name: get-resources - name: get-pod-logs应用这个 CR 之后kagent 控制器会创建对应的 Agent 实例并通过 TaoToken 的通道调用模型。agentgateway 和 kmcp 的安装类似agentgateway 目前提供独立二进制和 Helm 两种方式kmcp 用 go install 或者下载 release 二进制。这两个组件在本地实验里主要用于验证 Agent 通信和 MCP 工具服务配置上同样把模型后端指向 TaoToken。4. 验证请求从网关到模型的完整链路配置完成后需要验证整条链路是否通。最直接的方式是从集群内部发一个请求经过 kgateway 转发到 TaoToken再返回模型响应。先确认 Gateway 的地址kubectl get gateway ai-gateway -n kgateway-system拿到 ADDRESS 字段后用 port-forward 把网关端口映射到本地kubectl port-forward -n kgateway-system svc/ai-gateway 8080:80然后发一个 chat completions 请求curl -s http://localhost:8080/v1/chat/completions \ -H Content-Type: application/json \ -d { model: gpt-4o-mini, messages: [{role: user, content: 用一句话解释 Kubernetes Gateway API}], max_tokens: 64 }如果返回的 JSON 里有 choices 数组并且 content 字段有内容说明网关到模型的链路是通的。这一步验证的是 kgateway 的路由和鉴权注入是否生效。接下来验证 kagent 的 Agent 是否能正常调用模型。用 kagent CLI 进入交互模式kagent chat --agent k8s-inspector在交互界面里输入「列出 kagent 命名空间下的所有 Pod」Agent 会调用 get-resources 工具然后通过 TaoToken 通道让模型生成回答。如果能看到 Pod 列表和模型生成的解释说明 kagent 的 LLM 提供商配置正确。验证 agentgateway 的时候可以起一个简单的 MCP 工具服务然后通过 agentgateway 代理调用。kmcp 生成的脚手架项目自带测试用例部署后可以用 MCP Inspector 直接测试。这部分验证的是 Agent 到工具的通信链路。我在实测中发现最容易出问题的是 TLS 和 header 注入这两个环节。kgateway 转发到外部 HTTPS 服务时需要确保 Backend 的 TLS 配置正确否则会报证书错误。另外Authorization header 的注入如果没生效TaoToken 会返回 401这时候要检查 TrafficPolicy 的 targetRefs 是否指向了正确的 HTTPRoute。还有一个细节是模型 ID 的映射。kgateway 的 InferencePool 里配置的模型名称和 TaoToken 实际接受的 Model ID 必须一致。如果 InferencePool 里写的是自定义名称需要在路由层做一次映射或者直接在请求里用 TaoToken 支持的 Model ID。5. 常见报错排查401、local proxy failed 与 OAuth这一节整理我在实验过程中遇到的几个典型报错以及对应的排查思路。第一个是 401 Unauthorized。这个报错通常出现在两个位置一是 curl 直接调 TaoToken 时二是经过 kgateway 转发后。直接调用时报 401检查 API Key 是否正确、是否有多余空格、是否在请求头里正确设置了 Bearer 前缀。经过网关时报 401检查 TrafficPolicy 的 header 注入是否生效可以用 kubectl logs 查看 kgateway 的访问日志确认请求头里有没有 Authorization 字段。第二个是 local proxy failed。这个报错在 kagent 调用模型时比较常见原因是 kagent 的 provider 配置里 Base URL 写错了或者网络策略阻止了出站请求。检查 kagent 的 ConfigMap 或者 Helm values确认 baseUrl 是 https://taotoken.net/api 不要写成 https://taotoken.net/api/v1 。另外如果集群用了 NetworkPolicy需要允许 kagent 命名空间出站到 taotoken.net 的 443 端口。第三个是 reading choices 相关的报错比如 error reading choices field 或者 choices is empty。这个通常说明请求发出去了但返回的 JSON 结构不符合预期。可能的原因是模型 ID 写错了TaoToken 返回了错误信息而不是正常的 completions 响应。检查请求体里的 model 字段确认是 TaoToken 支持的 Model ID。另外如果 max_tokens 设置得太小比如 1 或 2有些模型可能返回空 choices把 max_tokens 调到 16 以上再试。第四个是 OAuth 相关的报错。kagent 在某些配置下会尝试用 OAuth 流程获取 token如果你用的是 API Key 方式需要在 provider 配置里明确指定 authType 为 apiKey避免它走 OAuth 流程。具体的配置项在 kagent 的 Helm values 里设置 providers.openai.authTypeapiKey 即可。还有一个容易忽略的点是 CC Switch 和 Cline MCP 的配置。如果你在本地用 CC Switch 管理多个模型通道需要确保 Base URL、API Key、Model ID 这三件套都指向 TaoToken。CC Switch 的配置文件里Base URL 填 https://taotoken.net/api Key 填控制台创建的 KeyModel ID 填对应的模型标识。Cline 的 MCP 配置类似在 settings.json 里配置好这三项之后Agent 调用工具时就会走 TaoToken 通道。Codex 的 auth.json 配置也是同样的逻辑。在 auth.json 里填入 Base URL 和 KeyModel ID 按需选择。这样 Codex 在执行编码任务时模型调用会统一走 TaoToken方便集中管理用量和额度。排查的时候我习惯先用 curl 直接验证 TaoToken 通道排除 Key 和 Base URL 的问题然后再从集群内部发请求排除网络策略和 DNS 的问题最后检查网关和 Agent 的配置确认 header 注入和 provider 设置正确。这个顺序能快速定位问题出在哪一层。6. 把统一接入固化到日常开发流程跑通整套链路之后我建议把 TaoToken 的接入配置固化到日常开发流程里。具体做法是把 API Key 存进 Kubernetes Secret把 Base URL 和 Model ID 写进 ConfigMap然后在 kgateway、kagent、agentgateway 的配置里引用这些 Secret 和 ConfigMap。这样换模型或者换 Key 的时候只需要改一处不用逐个组件去改。对于长期在集群里跑 Agent 和推理服务的场景用 Coding Plan 的额度比按量计费更划算控制台可以查看用量和剩余额度。如果你还在选模型阶段可以先用模型对话页面测试不同模型的效果确定之后再写进配置。接入文档里有各个组件的详细配置说明包括 kgateway 的 TrafficPolicy 写法、kagent 的 Agent CR 示例、agentgateway 的 MCP 代理配置等。遇到配置问题时先对照文档检查字段名和格式大部分报错都是拼写或者路径问题。我在实验里最大的体会是Kubernetes 上的 AI 基础设施难点不在单个组件的安装而在组件之间的衔接。kgateway 负责入口流量kagent 负责 Agent 编排agentgateway 负责 Agent 通信kmcp 负责工具服务交付这四个环节的配置需要保持一致尤其是模型接入点。用 TaoToken 统一 Key 和 Base URL 之后这个一致性问题就简化成了改一个地方维护成本降了很多。