ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

k8s traefik ingress 实践:TaoToken 统一 Key 接入配置骨架

k8s traefik ingress 实践:TaoToken 统一 Key 接入配置骨架 1. 为什么在 k8s 里用 Traefik 暴露 AI 工具服务在 k8s 集群里跑 AI 工具服务绕不开一个问题集群内的 Pod 怎么让集群外稳定访问。早期很多人用 Nginx Ingress Controller但镜像拉取慢、配置改一次要 reload 一次在频繁调整路由的 AI 场景里体验一般。我后来转向 Traefik核心原因是它和 Kubernetes API 动态通信IngressRoute 一改路由秒级刷新不用重启控制器。这篇聚焦一个具体落地场景集群里已经跑着若干 AI 工具服务比如本地模型网关、代码补全后端、对话代理现在要用 Traefik Ingress 把它们统一暴露出去并且所有服务共用一套 TaoToken 的 Key 和 API 通道。也就是说外部请求打到 TraefikTraefik 按域名或路径转发到对应服务服务内部再通过统一的环境变量拿到 TaoToken 的 API Key 去调用上游模型。适合谁看已经有一个能跑的 k8s 集群minikube、k3s、云上托管集群都行想用 Traefik 做入口同时希望把 AI 调用的鉴权收敛到一处、避免每个服务各配一份 Key 的人。下面从部署 Traefik 开始到 IngressRoute 配置、config.toml/settings.json 骨架、请求转发验证一步步走完闭环。2. TaoToken 前置统一 Key 与 API 通道准备在写任何 k8s 配置之前先把 TaoToken 这边的通道准备好。TaoToken 在这里扮演的角色是统一的模型 API 入口你的 AI 工具服务不需要各自去对接不同厂商只要拿到一个 Key指向同一个 API 地址就能调用背后的模型能力。这样在 k8s 里你只需要维护一个 Secret所有 Deployment 引用它即可。第一步是拿到 API Key。打开控制台进入 API Keys 页面创建一个新的 Key复制保存。这个 Key 后面会以 Secret 的形式注入到 Pod 里不会明文写在 YAML 中。控制台入口https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteAPI Keys 管理https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite第二步是确认 API 基地址。TaoToken 的 API 端点是https://taotoken.net/api注意这个地址不带任何查询参数直接作为 base_url 使用。你的服务里配置的OPENAI_BASE_URL或类似变量就填它。第三步如果你还没决定用哪个模型可以先在模型对话页面试一下确认 Key 能正常出结果再往 k8s 里灌。模型对话体验https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite注意Key 只创建一次就够多个服务共用同一个 Key 是设计内的用法。如果担心泄露可以在控制台按需轮换轮换后更新 k8s Secret 并滚动重启即可。3. 可复制配置Traefik 部署与 IngressRoute 骨架3.1 安装 Traefik Ingress Controller先给集群装 Traefik。用官方 Helm chart 最省事避免手动 apply 一堆 YAML 时镜像拉不动。下面命令假设你已经配好 kubectl 上下文。helm repo add traefik https://traefik.github.io/charts helm repo update helm install traefik traefik/traefik \ --namespace traefik \ --create-namespace \ --set ingressClass.enabledtrue \ --set ingressClass.nametraefik \ --set service.typeNodePort装完后确认 Pod 状态kubectl get pod -n traefik -w看到traefik-xxxx处于 Running 就说明控制器起来了。此时访问任意节点的 NodePort应该返回 404这是 Traefik 的正常响应表示它已经在监听但还没有匹配的路由。3.2 创建 TaoToken Key 的 Secret把上一步拿到的 Key 写进 Secret。注意用stringData可以直接写明文kubectl 会帮你 base64 编码。apiVersion: v1 kind: Secret metadata: name: taotoken-secret namespace: default type: Opaque stringData: TAOTOKEN_API_KEY: sk-你的实际Key TAOTOKEN_BASE_URL: https://taotoken.net/apikubectl apply -f taotoken-secret.yaml3.3 部署一个 AI 工具服务示例用一个简单的模型代理服务做演示它读取环境变量里的 Key 和 base_url。这里用 Deployment Service 的标准组合。apiVersion: apps/v1 kind: Deployment metadata: name: ai-gateway namespace: default labels: app: ai-gateway spec: replicas: 2 selector: matchLabels: app: ai-gateway template: metadata: labels: app: ai-gateway spec: containers: - name: ai-gateway image: your-registry/ai-gateway:latest ports: - name: http containerPort: 8080 env: - name: TAOTOKEN_API_KEY valueFrom: secretKeyRef: name: taotoken-secret key: TAOTOKEN_API_KEY - name: TAOTOKEN_BASE_URL valueFrom: secretKeyRef: name: taotoken-secret key: TAOTOKEN_BASE_URL resources: requests: cpu: 100m memory: 128Mi limits: cpu: 500m memory: 512Mi --- apiVersion: v1 kind: Service metadata: name: ai-gateway-svc namespace: default spec: selector: app: ai-gateway ports: - name: http targetPort: 8080 port: 8080kubectl apply -f ai-gateway.yaml kubectl get pod -l appai-gateway3.4 IngressRoute 配置骨架Traefik 用 CRD 形式的 IngressRoute比原生 Ingress 表达力更强。下面把ai.example.com这个域名路由到刚才的服务。apiVersion: traefik.io/v1alpha1 kind: IngressRoute metadata: name: ai-gateway-route namespace: default spec: entryPoints: - web routes: - match: Host(ai.example.com) kind: Rule services: - name: ai-gateway-svc port: 8080kubectl apply -f ai-gateway-route.yaml kubectl get ingressroute -n default如果你要按路径区分多个 AI 服务比如/chat走对话服务、/code走补全服务可以加多条 routeroutes: - match: Host(ai.example.com) PathPrefix(/chat) kind: Rule services: - name: chat-svc port: 8080 - match: Host(ai.example.com) PathPrefix(/code) kind: Rule services: - name: code-svc port: 80803.5 config.toml 与 settings.json 骨架有些 AI 工具服务不是通过环境变量读配置而是读本地文件。Traefik 本身用 config.toml 做静态配置你的业务服务可能用 settings.json。下面给两份骨架。Traefik 的 config.toml如果用文件方式而非 Helm values[entryPoints] [entryPoints.web] address :80 [entryPoints.websecure] address :443 [api] dashboard true [providers.kubernetesCRD] allowCrossNamespace false业务服务的 settings.json把 TaoToken 通道写进去{ api: { base_url: https://taotoken.net/api, api_key_env: TAOTOKEN_API_KEY, timeout_seconds: 60 }, server: { host: 0.0.0.0, port: 8080 }, logging: { level: info } }注意settings.json 里不要写死 Key用api_key_env指向环境变量Key 由 Secret 注入。这样配置文件和密钥分离换 Key 不用改镜像。4. 验证请求与成功结果配置都 apply 之后开始验证。先确认 Traefik 是否识别到了 IngressRoutekubectl logs -n traefik -l app.kubernetes.io/nametraefik --tail50日志里应该能看到类似Adding route for Host(\ai.example.com) 的记录。如果没看到说明 CRD 没被监听检查 Traefik 的 RBAC 和 provider 配置。接着从集群外部发请求。假设你的节点 IP 是192.168.1.100Traefik 的 NodePort 是30080curl -H Host: ai.example.com http://192.168.1.100:30080/health如果服务有健康检查接口应该返回 200。再测一次真实的模型调用路径curl -X POST http://192.168.1.100:30080/v1/chat/completions \ -H Host: ai.example.com \ -H Content-Type: application/json \ -d {model:gpt-4o-mini,messages:[{role:user,content:ping}]}成功的话会返回一段 JSON包含模型回复。这一步能通说明整条链路是通的外部请求 → Traefik → Service → Pod → TaoToken API → 模型 → 原路返回。如果你在本地测试改一下 hosts 文件把ai.example.com指向节点 IP就能直接用域名访问# Linux/macOS echo 192.168.1.100 ai.example.com | sudo tee -a /etc/hosts然后curl http://ai.example.com:30080/health即可。Traefik 的 dashboard 也能帮你看路由状态默认在/dashboard/路径下确认每条 route 的 status 是 enabled。5. 本篇常见错排查5.1 404 page not found这是最常见的。Traefik 返回 404 说明请求到了控制器但没有匹配的 route。排查顺序先kubectl get ingressroute -A确认资源存在再看match规则里的 Host 是否和你请求的 Host 头完全一致大小写、端口都算最后看 IngressRoute 的 namespace 和 Service 是否在同一命名空间跨命名空间需要额外配置。5.2 502 Bad Gateway502 说明路由匹配上了但 Traefik 连不上后端 Service。检查 Service 的 selector 是否和 Pod 的 label 对得上kubectl get endpoints ai-gateway-svc -n default如果 ENDPOINTS 是空的说明 selector 没匹配到任何 Pod。另外确认 Service 的targetPort和容器实际监听端口一致写错端口也会 502。5.3 Pod 里读不到 TAOTOKEN_API_KEY进 Pod 里确认环境变量kubectl exec -it deploy/ai-gateway -- env | grep TAOTOKEN如果为空检查 Deployment 的secretKeyRef里的 name 和 key 是否和 Secret 里定义的一致。Secret 的 key 是大小写敏感的TAOTOKEN_API_KEY和taotoken_api_key是两个不同的键。5.4 模型调用返回 401如果请求到了服务但上游返回 401说明 Key 无效或没传对。先在本地用 curl 直接打 TaoToken 的 API 验证 Keycurl https://taotoken.net/api/v1/models \ -H Authorization: Bearer sk-你的Key能列出模型说明 Key 没问题那问题就在服务读取环境变量的逻辑上。如果本地也 401去控制台确认 Key 是否被禁用或删除。5.5 IngressRoute 不生效Traefik 的 CRD 需要对应的 RBAC 权限才能监听。用 Helm 装的话默认配好了但如果你是手动 apply 的 YAML检查 ClusterRole 里有没有traefik.io组的资源权限。另外确认 Traefik 启动参数里有--providers.kubernetescrd没有这个它不会去读 IngressRoute。6. 后续接入与长期使用建议整套跑通之后你手里就有了一条稳定的入口链路Traefik 负责路由TaoToken 负责统一 Key 和模型通道。接下来如果要加新的 AI 服务只需要写一份 Deployment Service IngressRoute复用同一个 Secret几分钟就能挂上去。对于需要长期跑编码类任务或 Agent 的场景建议关注 Coding Plan它在调用配额和稳定性上更适合持续性的开发工作流Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite接入文档里有各语言 SDK 的配置示例包括 base_url 和 Key 的传法照着改就能对接你现有的服务接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite如果你用的是 Claude Code 这类工具Anthropic 兼容通道的配置方式在下面这个页面有说明ClaudeCodeAnthropichttps://taotoken.net/claudecode-anthropic?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite最后提醒一个实操细节Traefik 的 IngressRoute 改动是热生效的但如果你改了 Secret 里的 KeyPod 不会自动重新读取环境变量需要kubectl rollout restart deploy/ai-gateway触发滚动重启。这个坑我在轮换 Key 的时候踩过一次服务一直报 401查了半天才发现是 Pod 还拿着旧的环境变量。
返回列表