ARTICLE DETAIL

资讯详情

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

Kubernetes Ingress 部署,把 Codex 模型通道改到 TaoToken 后自动生成 Traefik 规则

Kubernetes Ingress 部署,把 Codex 模型通道改到 TaoToken 后自动生成 Traefik 规则 Kubernetes Ingress 部署把 Codex 模型通道改到 TaoToken 后自动生成 Traefik 规则在 Kubernetes Ingress 部署里Traefik 的 traefik.yaml 和 ingress-tomcat.yaml 最容易卡在证书 Secret、DaemonSet 挂载和 Ingress rule 三段本篇从接入配置视角把 Codex 的模型通道改到 TaoToken官网https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content后再生成和核对配置。传统做法要手动 openssl 签发证书、kubectl create secret、写 ClusterRole、ClusterRoleBinding、ServiceAccount、ConfigMap、DaemonSet、Service 以及 HTTP/HTTPS 两套 IngressPod IP 变化后还要依赖 Ingress Controller 通过 watch Service、Endpoints、Ingress 自动更新 Traefik 内部路由。真正麻烦的地方不是概念而是字段多、命名空间引用多、Secret 和 Ingress class 一旦写错就很难定位。把 Codex 的 config.toml 中 Base URL 指向 https://taotoken.net/api不带 /v1Codex 就能在接入 TaoToken 的状态下按你的集群版本生成可运行的 Traefik 与 Ingress 配置并解释证书 Secret 如何挂载到 DaemonSet、HTTP 与 HTTPS 路由规则如何对应到同一个后端 Service。下面按接入配置视角给出完整流程。原问题与场景Kubernetes Ingress、Traefik 与 Codex 模型通道Kubernetes 里 Service 解决的是四层负载均衡问题客户端访问 NodeIP:NodePort请求会被转发到 Service IP再由 kube-proxy 规则落到具体 Pod。但到了七层比如按域名、按路径转发就需要 Ingress 和 Ingress Controller。Ingress 本身只是规则对象真正干活的是 Ingress Controller。它持续访问 Kubernetes API观察 Service、Endpoints、Pod 和 Ingress 的变化再把这些变化翻译成 Traefik 或 Nginx 能识别的配置并触发热加载。Nginx 常见的问题是配置变更后要 reloadTraefik 在这一类微服务场景里更偏向自动加载因此原文选择 Traefik 作为七层调度器。本篇场景是在 Kubernetes 集群中部署 Traefik Ingress Controller创建一个 Tomcat Deployment 和对应 Service再分别用 HTTP Ingress 与 HTTPS Ingress 暴露 tomcat.lucky.com。手动部署时你至少需要处理这些文件证书私钥与 crt、Secret、traefik.yaml、ingress-tomcat.yaml、ingress-tomcat-tls.yaml。其中最容易被忽略的是 Secret 的 namespaceTraefik DaemonSet 在 kube-system 中要挂载默认 HTTPS 证书就必须把对应 Secret 创建在同一 namespace而 Ingress TLS 引用的 Secret 通常要和 Ingress 同 namespace由 Ingress Controller 通过 API 读取。这个区别如果没人帮你核对很容易出现“Ingress 创建成功但 HTTPS 不生效”的情况。把 Codex 模型通道改到 TaoToken 后Codex 可以作为你的配置校对工具你让它检查 ClusterRole 是否包含 services、endpoints、secrets、ingresses 的 watch 权限检查 DaemonSet 是否挂载了证书 Secret 和 ConfigMap检查 Service selector 是否匹配 Pod labels检查 Ingress 的 annotation、host、pathType、backend service 名称和端口。这样做的价值不是替代 kubectl而是在 apply 之前减少手工拼 YAML 的低级错误。TaoToken 前置创建 Key 与 Codex config.toml 接入先打开 TaoToken 官网创建 Keyhttps://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。登录后进入控制台在 API Keys 页面新建或复用已有 Key。本篇所有配置里的 Key 统一用 YOUR_API_KEY 表示实际使用时替换成你自己的 Key。不要把 Key 写进公开仓库也不要提交到 Git 历史中。Codex 使用 config.toml 管理模型提供方。编辑或新建 ~/.codex/config.toml将模型通道切到 TaoToken。关键点是 Base URL 填 https://taotoken.net/api不要在后面追加 /v1。示例配置如下model gpt-5-codex model_provider taotoken [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api env_key TAOTOKEN_API_KEY wire_api responses [profiles.taotoken] model gpt-5-codex model_provider taotoken然后在当前 shell 中设置环境变量export TAOTOKEN_API_KEYYOUR_API_KEY如果你希望长期使用可以把环境变量写入 shell 启动文件但要注意本机安全。启动 Codex 时使用对应 profilecodex --profile taotoken如果你不熟悉 config.toml 的字段可以直接打开接入文档核对https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentdoc 。接入配置阶段最重要的是确认三件事Base URL 没有多余路径环境变量名和 config.toml 中 env_key 一致Key 本身没有多余空格。完成这一步后Codex 的模型请求就会经过 TaoToken而不是旧通道。可复制配置让 Codex 生成 traefik.yaml、ingress-tomcat.yaml 并核对 Secret 挂载配置好 Codex 后不要只让它“随便写一个 Traefik YAML”。要把集群版本、namespace、域名、后端 Service、证书命名规则讲清楚。下面这段提示词可以直接复制给 Codex请为 Kubernetes 集群生成 traefik.yaml 和 ingress-tomcat.yaml。要求 1. Traefik 使用 DaemonSet 部署在 kube-system包含 ServiceAccount、ClusterRole、ClusterRoleBinding、ConfigMap、DaemonSet、Service。 2. ClusterRole 需要 watch services、endpoints、secrets、ingresses。 3. ConfigMap 中 traefik.toml 开启 http:80 和 https:443HTTPS 证书引用 /ssl/tls.crt 与 /ssl/tls.key。 4. DaemonSet 使用 hostNetwork: true挂载 Secret traefik-default-tls 到 /ssl挂载 ConfigMap 到 /config。 5. 生成 tomcat Service 和 DeploymentService 名 tomcat端口 80后端 8080。 6. 生成 HTTP Ingress 和 HTTPS Ingresshost 为 tomcat.lucky.comannotation 为 kubernetes.io/ingress.class: traefikHTTPS Ingress 引用 tomcat-ingress-secret。 7. 输出 kubectl apply 顺序和验证命令并解释 kube-system 与 default 两个 Secret 的用途差异。证书部分可以在 master 节点或具备 kubectl 权限的机器上执行openssl genrsa -out tls.key 2048 openssl req -new -x509 -key tls.key -out tls.crt -days 3650 \ -subj /CCN/STBeijing/LHaidian/ODevOps/CNtomcat.lucky.com kubectl create secret tls traefik-default-tls \ --certtls.crt --keytls.key -n kube-system kubectl create secret tls tomcat-ingress-secret \ --certtls.crt --keytls.key -n defaulttraefik.yaml 可参考下面结构。注意名称与原文手动版做了调整便于区分默认 HTTPS 证书和 Ingress TLS 证书apiVersion: v1 kind: ServiceAccount metadata: name: traefik-controller namespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: traefik-controller rules: - apiGroups: [] resources: [services, endpoints, secrets] verbs: [get, list, watch] - apiGroups: [networking.k8s.io, extensions] resources: [ingresses, ingressclasses] verbs: [get, list, watch] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: traefik-controller roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: traefik-controller subjects: - kind: ServiceAccount name: traefik-controller namespace: kube-system --- apiVersion: v1 kind: ConfigMap metadata: name: traefik-config namespace: kube-system data: traefik.toml: | insecureSkipVerify true defaultEntryPoints [http, https] [entryPoints] [entryPoints.http] address :80 [entryPoints.https] address :443 [entryPoints.https.tls] [[entryPoints.https.tls.certificates]] CertFile /ssl/tls.crt KeyFile /ssl/tls.key [kubernetes] --- apiVersion: apps/v1 kind: DaemonSet metadata: name: traefik-controller namespace: kube-system labels: k8s-app: traefik-lb spec: selector: matchLabels: k8s-app: traefik-lb template: metadata: labels: k8s-app: traefik-lb spec: serviceAccountName: traefik-controller hostNetwork: true tolerations: - key: node-role.kubernetes.io/master effect: NoSchedule volumes: - name: traefik-default-tls secret: secretName: traefik-default-tls - name: traefik-config configMap: name: traefik-config containers: - name: traefik image: traefik:1.7.9 args: - --configfile/config/traefik.toml - --web - --kubernetes ports: - name: http containerPort: 80 hostPort: 80 - name: https containerPort: 443 hostPort: 443 - name: admin containerPort: 8080 volumeMounts: - name: traefik-default-tls mountPath: /ssl - name: traefik-config mountPath: /config --- apiVersion: v1 kind: Service metadata: name: traefik-service namespace: kube-system spec: selector: k8s-app: traefik-lb type: NodePort ports: - name: web port: 80 targetPort: 80 - name: https port: 443 targetPort: 443 - name: admin port: 8080 targetPort: 8080这里 Secret 挂载到 DaemonSet 的链路是kube-system 中的 traefik-default-tls 通过 volumes.secret.secretName 被声明再由 volumeMounts 挂到容器的 /ssl 目录ConfigMap 里的 traefik.toml 再把 EntryPoint HTTPS 的 CertFile 和 KeyFile 指向 /ssl/tls.crt 与 /ssl/tls.key。也就是说DaemonSet 挂载的是 Traefik 默认入口证书。而 default 命名空间里的 tomcat-ingress-secret 是给 Ingress TLS 使用的Traefik 通过 API 读取 Ingress 规则和对应 Secret不需要把它直接挂进 DaemonSet。理解这两个 Secret 的差异是排查 HTTPS 问题的关键。Tomcat 与 Ingress 配置可写成apiVersion: apps/v1 kind: Deployment metadata: name: tomcat-deploy namespace: default spec: replicas: 3 selector: matchLabels: app: tomcat template: metadata: labels: app: tomcat spec: containers: - name: tomcat image: tomcat:8.5-jre8-alpine ports: - containerPort: 8080 --- apiVersion: v1 kind: Service metadata: name: tomcat namespace: default spec: selector: app: tomcat ports: - name: http port: 80 targetPort: 8080 --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-tomcat-http namespace: default annotations: kubernetes.io/ingress.class: traefik spec: rules: - host: tomcat.lucky.com http: paths: - path: / pathType: Prefix backend: service: name: tomcat port: number: 80 --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-tomcat-tls namespace: default annotations: kubernetes.io/ingress.class: traefik spec: tls: - hosts: - tomcat.lucky.com secretName: tomcat-ingress-secret rules: - host: tomcat.lucky.com http: paths: - path: / pathType: Prefix backend: service: name: tomcat port: number: 80应用顺序建议是先创建 Secret再应用 traefik.yaml然后部署 tomcat最后应用两个 Ingress。Codex 可以帮你检查 Ingress 的 backend 是否指向 tomcat:80TLS 的 secretName 是否与 default 中的 Secret 一致以及 DaemonSet 是否真的挂载了 kube-system 中的默认证书。验证请求与成功结果kubectl get pods、Ingress 与 Codex 模型通道依次执行kubectl apply -f traefik.yaml kubectl apply -f tomcat-deploy.yaml kubectl apply -f ingress-tomcat.yaml kubectl apply -f ingress-tomcat-tls.yaml检查 Traefik 是否在目标节点运行kubectl get pods -n kube-system -l k8s-apptraefik-lb -o wide kubectl get ds -n kube-system traefik-controller kubectl get svc -n kube-system traefik-service如果 DaemonSet 正常每个节点上应该有一个 Traefik Pod状态为 Running。接着检查 Ingresskubectl get ingress -n default kubectl describe ingress -n default ingress-tomcat-http kubectl describe ingress -n default ingress-tomcat-tls期望看到 ingress-tomcat-http 和 ingress-tomcat-tls 的 HOSTS 都是 tomcat.lucky.comTLS 那个显示 80 和 443。再检查 Secretkubectl get secret -n default tomcat-ingress-secret kubectl get secret -n kube-system traefik-default-tls本机测试可以临时配置 hosts把 tomcat.lucky.com 指向任意一个 Kubernetes 节点 IP然后访问curl -H Host: tomcat.lucky.com http://node-ip/ curl -k --resolve tomcat.lucky.com:443:node-ip https://tomcat.lucky.com/能返回 Tomcat 页面或后端响应说明 Ingress Controller、Service、Pod 和 TLS 链路基本打通。与此同时验证 Codex 是否真的走 TaoToken 模型通道codex exec 只回复TaoToken Codex 通道正常如果返回指定文本说明 config.toml 中的 base_url、env_key 和 Key 都已生效。你还可以把 kubectl 的输出交给 Codex让它判断 Ingress 为什么没有 Address、Traefik 为什么没有加载规则、Secret 为什么没有被引用。验证模型本身也可以到模型对话页面做一次简单对话https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentmodel-chat 。本篇常见错排查Ingress controller 不生效、证书 Secret 未挂载、Codex config.toml 报错第一类错误出在 Codex config.toml。最常见的是 base_url 写成 https://taotoken.net/api/v1或者把 API 地址和网页地址混用。接入时 Base URL 应保持 https://taotoken.net/api不带 /v1。若 Codex 报 401优先检查 TAOTOKEN_API_KEY 是否已 export、Key 是否复制完整、config.toml 中 env_key 是否同名。需要新建或轮换 Key 时到 API Keys 页面处理https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentapi-keys 。第二类错误是 Traefik Pod 没起来。用 kubectl describe pod 和 kubectl logs 查看如果日志提示 forbidden通常是 ClusterRole 缺少 services、endpoints、secrets 或 ingresses 的 get/list/watch 权限如果提示端口占用检查 DaemonSet 的 hostPort 80、443 是否已被 Nginx、Apache 或其他进程占用如果 Pod 一直 Pending检查节点污点和 tolerations。Traefik 以 DaemonSet 加 hostNetwork 部署时端口冲突比 Service 模式更常见。第三类错误是 Ingress 创建了但路由不生效。先看 annotationkubernetes.io/ingress.class 必须是 traefik且 Traefik 版本能识别这个 class。再看 Ingress 的 backend旧版 extensions/v1beta1 的 serviceName、servicePort 在新集群可能不再适用应使用 networking.k8s.io/v1 的 service.name 和 service.port.number。如果 Service 没有 Endpoints说明 selector 和 Pod labels 不匹配用 kubectl get endpoints tomcat -n default 检查。第四类错误是 HTTPS 证书不生效。若浏览器或 curl 报证书错误先确认证书 CN/SAN 是否包含 tomcat.lucky.com再确认 default 中的 tomcat-ingress-secret 是否存在且包含 tls.crt、tls.key如果 Ingress 描述里提示 secret not found通常是 namespace 写错。若 Traefik 默认入口没有证书检查 DaemonSet 是否把 kube-system 的 traefik-default-tls 挂到 /sslConfigMap 中 CertFile 和 KeyFile 是否指向 /ssl/tls.crt 与 /ssl/tls.key。Secret 是命名空间级资源Pod 只能挂载同命名空间 Secret不能跨 namespace 直接 volume 挂载。第五类错误是 Codex 生成的 YAML 能通过语法检查但不符合集群版本。建议 apply 前执行kubectl apply --dry-runserver -f traefik.yaml kubectl apply --dry-runserver -f ingress-tomcat.yaml kubectl apply --dry-runserver -f ingress-tomcat-tls.yaml如果 dry-run 通过再正式应用。让 Codex 根据报错修改时最好把完整报错、kubectl 版本、Ingress apiVersion、Traefik 版本一起贴给它不要只贴一句“报错了”。这样它才能判断是 RBAC、CRD、API 版本还是命名空间问题。语义一致 CTA接入配置收尾API Keys、接入文档与 Coding Plan这篇的核心是“接入配置”先把 Codex 模型通道改到 TaoToken再让 Codex 辅助生成和核对 Kubernetes Ingress、Traefik、Secret 挂载与 HTTP/HTTPS 路由。如果你在 config.toml、Base URL 或 Key 上遇到问题先去 API Keys 创建或更换 Keyhttps://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentapi-keys 再对照接入文档确认 Base URL、env_key 和模型名https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentdoc 。如果你只是想先验证模型通道是否正常可以用模型对话发一条简单消息https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentmodel-chat 。如果你准备长期用 Codex 做 Kubernetes 配置生成、Ingress 排障、Traefik 规则核对属于长期编码和 Agent 场景可以了解 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentcoding-plan 。回到本篇场景推荐顺序仍是创建 Key改 Codex config.toml验证模型通道生成 traefik.yaml 与 ingress-tomcat.yaml检查 Secret 挂载和 Ingress class最后用 kubectl 验证 Pod、Service、Ingress 和 HTTPS 结果。
返回列表