尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

【traefik】基于k8s搭建traefik,nginx与traefik共存:TaoToken统一Key接入IngressRoute配置实战

发布时间:2026/9/30 2:33:16

资讯中心
01
ARTICLE

【traefik】基于k8s搭建traefik,nginx与traefik共存:TaoToken统一Key接入IngressRoute配置实战

【traefik】基于k8s搭建traefik,nginx与traefik共存:TaoToken统一Key接入IngressRoute配置实战
1. 当集群里已经跑着 nginx为什么还要再塞一个 traefik很多团队的 k8s 集群不是一张白纸。你接手的时候nginx ingress controller 已经在管着 80/443所有 namespace 的 Ingress 都归它转发业务跑得好好的。这时候突然有个需求某个 namespace 想用 traefik 的 IngressRoute因为它对中间件、灰度、Header 匹配的支持更顺手或者团队里有人更熟 traefik 的 Dashboard。问题就来了。traefik 默认也要抢 80/443和 nginx 直接端口冲突。你不可能把 nginx 拆了重来那影响面太大。所以现实的做法是让两者共存nginx 继续当集群的统一入口traefik 退到后面只接管指定 namespace 的流量。这篇文章要解决的就是这个场景。我会给你一套可复制的 IngressRoute YAML 骨架、nginx 与 traefik 共存的配置片段以及把 TaoToken 统一 Key 接进这条链路的具体步骤。适合已经在用 k8s、手上有 nginx ingress、想引入 traefik 做局部路由的运维和 backend 同学。读完你能自己搭出一套两层转发请求先到 nginx再由 nginx 转给 traefiktraefik 根据 IngressRoute 规则打到具体 service。先说清楚两层转发的取舍。方案一是给 traefik 换入口端口比如 8000/8443这样不冲突但用户请求得带端口号体验差。方案二是 traefik 只监听集群内部端口nginx 通过 Ingress 把外部请求转进来。链路长了一层但对外还是标准的 80/443用户无感。我选的是方案二下面所有配置都按这个来。理解这条链路的关键是分清两层路由各自管什么。第一层是 nginx 管的普通 Ingress负责把api.traefik这个 host 的请求转给 traefik 的 service。第二层是 traefik 管的 IngressRoute负责在 traefik 内部把/whoami这类路径匹配到 whoami service。两层各司其职互不干扰。2. TaoToken 前置准备统一 Key 与 Base URL 怎么拿在把 traefik 接进来之前先把 TaoToken 的接入信息准备好。TaoToken 在这里扮演的是统一模型网关的角色——你的业务服务不管是调对话模型还是 coding 模型都走同一个 Key、同一个 Base URL省得每个服务各配一套。你需要三样东西API Key、Base URL、以及要用的 Model ID。API Key 在控制台的 API Keys 页面创建地址是 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 。创建后复制出来后面配置里会用到。Base URL 固定是 https://taotoken.net/api 注意这个地址不带任何查询参数直接填就行。Model ID 看你要接哪个模型对话类、编码类各有对应的 ID在文档里能查到https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 。如果你只是想先验证模型通不通可以用模型对话页面直接试https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 。但我们要做的是把它接进 k8s 里的服务所以重点是把这三个值写进配置。这里有个容易踩的坑Base URL 末尾不要自己加/v1或者斜杠。TaoToken 的接口路径是固定的多加了反而 404。Key 的权限也要注意如果你用的是受限 Key确认它对你调用的模型有权限否则会返回 401 或权限错误。把这三个值先记下来格式大概是这样Base URL: https://taotoken.net/api API Key: sk-xxxxxxxx控制台创建后复制 Model ID: 按文档选择例如对话或编码对应的 ID接下来我们会在 k8s 里创建一个 Secret 存 Key再在业务服务的环境变量里引用 Base URL 和 Model ID。这样 Key 不会硬编码在镜像里也方便轮换。3. 可复制配置IngressRoute 骨架与 nginx 共存片段这一节是核心给你能直接改改就用的 YAML。先明确部署结构traefik 装在traefik这个 namespace业务服务在appsnamespacenginx ingress controller 已经在集群里跑着。第一步创建 traefik 需要的 CRD、RBAC 和 ServiceAccount。CRD 是 traefik 自定义的资源类型RBAC 给它跨 namespace 读 Ingress 和 Service 的权限。从官方仓库拿到 crd 和 rbac 的 yaml 后把 ClusterRoleBinding 里的 namespace 改成traefik再补一个 ServiceAccountapiVersion: v1 kind: ServiceAccount metadata: name: traefik-ingress-controller namespace: traefik然后一次性创建kubectl create ns traefik kubectl apply -f crd.yml -f rbac.yml -f serviceAccount.yml第二步准备 traefik 的静态配置traefik.toml。注意这里入口端口保持 80/443因为 traefik 的 service 是 ClusterIP外部流量进不来实际由 nginx 转发进来所以不会和 nginx 抢宿主机端口[entryPoints] [entryPoints.http] address :80 [entryPoints.https] address :443 [log] level INFO [accessLog] [api] insecure true dashboard true [providers.kubernetesCRD] [providers.kubernetesIngress]存成 ConfigMapkubectl -n traefik create cm traefik-config --from-filetraefik.toml第三步部署 traefik 的 Deployment挂上配置指定 ServiceAccountkind: Deployment apiVersion: apps/v1 metadata: name: traefik-ingress-controller namespace: traefik labels: app: traefik spec: replicas: 1 selector: matchLabels: app: traefik template: metadata: labels: app: traefik spec: serviceAccountName: traefik-ingress-controller containers: - name: traefik-ingress-controller image: traefik:v2.11.0 volumeMounts: - name: traefik-config mountPath: /etc/traefik/traefik.toml subPath: traefik.toml env: - name: TZ value: Asia/Shanghai volumes: - name: traefik-config configMap: name: traefik-config第四步创建 traefik 的 Service类型 ClusterIP把 80/443/8080 暴露给集群内部apiVersion: v1 kind: Service metadata: name: traefik-svc namespace: traefik spec: selector: app: traefik type: ClusterIP ports: - name: http port: 80 targetPort: 80 - name: https port: 443 targetPort: 443 - name: admin port: 8080 targetPort: 8080第五步这是 nginx 与 traefik 共存的关键——用普通 Ingress 把外部请求从 nginx 转给 traefik。这个 Ingress 由 nginx 接管host 是api.traefik后端指向 traefik-svc 的 80 端口apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: traefik-api namespace: traefik spec: rules: - host: api.traefik http: paths: - path: / pathType: Prefix backend: service: name: traefik-svc port: number: 80第六步在appsnamespace 建一个 whoami 测试服务然后写 IngressRoute。IngressRoute 是 traefik 自己的资源负责第二层路由apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata: name: traefik-route namespace: apps labels: run: whoami spec: entryPoints: - http routes: - match: Host(api.traefik) PathPrefix(/whoami) kind: Rule services: - name: whoami port: 80把 TaoToken 的 Key 存成 Secret业务服务通过环境变量引用apiVersion: v1 kind: Secret metadata: name: taotoken-secret namespace: apps type: Opaque stringData: api-key: sk-你的Key业务 Deployment 里这样引用env: - name: TAOTOKEN_BASE_URL value: https://taotoken.net/api - name: TAOTOKEN_API_KEY valueFrom: secretKeyRef: name: taotoken-secret key: api-key - name: TAOTOKEN_MODEL value: 你的ModelID这套配置里Base URL、Key、Model ID 三件套齐全业务代码读环境变量就能调 TaoToken不用改镜像。4. 验证请求curl 检查路由与鉴权是否生效配置推上去之后别急着上业务先用 whoami 把链路走通。依次 applykubectl apply -f deployment.yml kubectl apply -f service.yml -f ingress-api.yml kubectl apply -f whoami.yml kubectl apply -f ingressroute.yml确认 traefik pod 是 Runningkubectl -n traefik get pods然后发请求。因为api.traefik是集群内的 host本地测试可以临时在/etc/hosts里把它指到 nginx 的入口 IP或者直接在集群内起一个 pod 用 curlcurl -v http://api.traefik/whoami/test正常的话会返回 whoami 的响应里面能看到请求头、来源 IP 等信息。同时 traefik 的日志会打出一行 access log类似GET /whoami/test HTTP/1.1 200 ... apps-traefik-route-...kubernetescrd http://10.244.0.9:80看到这行说明两层转发都通了nginx 把请求转给了 traefiktraefik 根据 IngressRoute 打到了 whoami。接着验证 TaoToken 鉴权。在你的业务服务里用环境变量里的 Key 发一个请求。可以用 curl 模拟curl -X POST https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -H Content-Type: application/json \ -d { model: $TAOTOKEN_MODEL, messages: [{role: user, content: ping}] }返回里有正常的 choices 结构说明 Key 和 Base URL 都对。如果返回 401先检查 Key 有没有复制全、有没有多余空格。如果返回模型不存在检查 Model ID 是不是写错了。Dashboard 也可以顺便看一眼访问http://ui.traefik/dashboard/能看到 traefik 识别到的 router 和 service 列表确认 IngressRoute 已经被加载。5. 常见报错排查401、local proxy failed、reading choices这一节列几个我实际遇到过的报错对照着查能省不少时间。401 Unauthorized。这个最常见来源有两个。一是 TaoToken 的 Key 不对检查 Secret 里的值有没有换行、空格kubectl -n apps get secret taotoken-secret -o jsonpath{.data.api-key} | base64 -d解出来核对。二是 Key 权限不够受限 Key 调了没授权的模型换成有权限的 Key 或调整权限。local proxy failed / connection refused。这个通常是 nginx 转 traefik 那层断了。检查traefik-svc的 endpoints 有没有 podkubectl -n traefik get endpoints traefik-svc。如果为空说明 traefik pod 没起来或者 label 不匹配。再看 nginx 的 Ingress 后端端口是不是写的 80和 service 的 port 对上。reading choices / 解析响应失败。业务代码报这个多半是 Base URL 写错了。确认是https://taotoken.net/api没有多余的/v1或斜杠。有些 SDK 会自己拼路径如果你在 Base URL 里又加了/v1就会变成/api/v1/v1/...返回结构自然不对。OAuth / token 过期类错误。如果你用的是带 OAuth 的客户端比如某些 coding 工具确认 token 刷新逻辑正常。TaoToken 的 Key 是长期有效的但如果你在客户端里配的是临时 token过期后就会报这个。重新在控制台生成 Key 替换即可。IngressRoute 不生效。检查 traefik 的 provider 有没有开kubernetesCRDtraefik.toml里少了这段IngressRoute 就不会被识别。另外 IngressRoute 的 namespace 要和 service 一致跨 namespace 引用 service 需要额外配置。端口冲突。如果你发现 traefik 起不来报 80 端口被占用说明 traefik 的 service 被设成了 NodePort 或 LoadBalancer直接占了宿主机端口。改回 ClusterIP让 nginx 来转发。排查的时候养成看日志的习惯traefik 的 access log 和 nginx 的 error log 对着看基本能定位到是哪一层出的问题。6. 把统一 Key 接进长期编码与 Agent 场景链路通了之后TaoToken 的统一 Key 不只是给 whoami 这种测试服务用的。你真正要接的是业务里的模型调用尤其是长期跑的编码助手和 Agent 任务。对于长期编码场景比如团队里用 Claude Code 或者类似的 coding 工具可以把 Base URL 和 Key 配到工具的 settings 里让它走 TaoToken。这样多个开发者、多个工具共用一套 Key额度和管理都集中。配置入口在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 里面有具体的接入方式。如果你在 k8s 里跑 Agent 服务比如定时任务、代码审查机器人同样用前面那套环境变量注入的方式把 Base URL、Key、Model ID 传进去。Agent 需要长时间稳定调用建议给 Key 配好额度告警避免跑飞。控制台里可以管理 Key 和查看用量https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 。多个服务共用一个 Key 的时候建议按服务打标签方便区分用量来源。接入文档里有各语言的示例和参数说明遇到接口细节问题先翻文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 。模型对话页面适合快速验证某个模型通不通不用写代码https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 。最后提醒一点Key 存 Secret 里别写进代码仓库。轮换 Key 的时候更新 Secret 再重启业务 pod 就行traefik 那层不用动。这套结构跑顺了后面加新的 IngressRoute、接新的模型都是改配置的事。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。