ARTICLE DETAIL

资讯详情

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

k8s初级实战11--ingress案例:用TaoToken统一Key调试Traefik Ingress Controller

k8s初级实战11--ingress案例:用TaoToken统一Key调试Traefik Ingress Controller 1. 从一次 Ingress 配置翻车说起如果你正在学 k8s 初级实战大概率会卡在 ingress 这一关Service 能通、Pod 也跑起来了但外部域名一访问就是 404 或者连接被拒。我当初用 Traefik 做 ingress controller 时最头疼的不是 YAML 写不对而是 AI 辅助生成的配置里版本号、apiVersion、注解全是混着来的改一处崩一处调试成本极高。这篇就聚焦一个完整可跟做的 ingress 案例用 Traefik 作为 ingress controller把两个 nginx 服务通过不同 Host 暴露出去同时用 TaoToken 统一 Key 和 API 通道来调试 AI 辅助生成的 ingress 配置。适合已经会kubectl apply、知道 Deployment 和 Service 是什么、但还没把 ingress 链路彻底跑通的初级选手。读完你能拿到三样东西一份可直接复制的 Traefik ingress 资源 YAML、一份 TaoToken 接入配置骨架、以及kubectl apply之后的访问验证动作。先说清楚 ingress 是什么它是一组从集群外部到集群内 Service 的 HTTP/HTTPS 路由规则但光创建 Ingress 资源本身没有任何效果集群里必须有一个 ingress controller 去监听这些规则并真正转发流量。Traefik 就是其中一种 controller相比 ingress-nginx它的 Dashboard 更直观适合边调边看。2. 为什么调试 ingress 要用 TaoToken 统一 Key做 k8s 实战时我经常让 AI 帮我生成或修正 ingress YAML尤其是networking.k8s.io/v1和老的extensions/v1beta1之间字段差异很大pathType、backend.service.name这些细节很容易写错。问题在于如果你同时用好几个模型或工具每个都要单独配 Key、单独记 endpoint调试链路一长就乱。TaoToken 在这里的作用是提供一个统一的 API 通道你只需要维护一套 Key就能在模型对话、coding plan、API 调用之间切换不用为每个工具重复配置。对于 ingress 这种需要反复试错、反复让 AI 改配置的场景统一 Key 能省掉大量切换成本。具体来说你可以用 TaoToken 的模型对话能力来生成和审查 ingress YAML用 API 通道把 kubectl 报错信息丢给模型做归因长期做 k8s 编码或 Agent 任务时再上 Coding Plan。官网入口在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 基址是 https://taotoken.net/api 注意 API 地址不带 UTM 参数。提示TaoToken 是统一的 API 接入通道不是 ingress controller也不替代 kubectl。它解决的是「调试 AI 生成配置时 Key 和通道分散」的问题集群里的流量转发仍然由 Traefik 负责。3. 可复制的 Traefik Ingress 配置这一章是全文重点按顺序执行即可。先部署 Traefik 的 RBAC 和 controller再建两个 nginx 服务最后写 Ingress 规则。3.1 部署 Traefik RBAC 与 Controller先创建 ClusterRole 和 ClusterRoleBinding让 Traefik 有权限监听 Service、Endpoints、Ingress 等资源# ingress.rbac.yaml kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: traefik-ingress-controller rules: - apiGroups: [] resources: [services, endpoints, secrets] verbs: [get, list, watch] - apiGroups: [extensions, networking.k8s.io] resources: [ingresses] verbs: [get, list, watch] --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: traefik-ingress-controller roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: traefik-ingress-controller subjects: - kind: ServiceAccount name: traefik-ingress-controller namespace: kube-system执行kubectl apply -f ingress.rbac.yaml然后部署 Traefik 本体。这里用 DaemonSet 加hostNetwork: True好处是节点 IP 直接就是入口省去 NodePort 转发一层调试时curl节点 IP 就能打到 Traefik# traefik-ds.yaml apiVersion: v1 kind: ServiceAccount metadata: name: traefik-ingress-controller namespace: kube-system --- kind: DaemonSet apiVersion: apps/v1 metadata: name: traefik-ingress-controller namespace: kube-system labels: k8s-app: traefik-ingress-lb spec: selector: matchLabels: name: traefik-ingress-lb template: metadata: labels: k8s-app: traefik-ingress-lb name: traefik-ingress-lb spec: serviceAccountName: traefik-ingress-controller terminationGracePeriodSeconds: 60 hostNetwork: true containers: - image: traefik:v2.10 name: traefik-ingress-lb ports: - name: http containerPort: 80 hostPort: 80 - name: admin containerPort: 8080 hostPort: 8080 args: - --api.insecuretrue - --providers.kubernetesingresstrue - --log.levelINFO --- kind: Service apiVersion: v1 metadata: name: traefik-ingress-service namespace: kube-system spec: selector: k8s-app: traefik-ingress-lb type: NodePort ports: - protocol: TCP port: 80 name: web - protocol: TCP port: 8080 name: adminkubectl apply -f traefik-ds.yaml kubectl get pods -n kube-system -l k8s-apptraefik-ingress-lb看到 Pod 处于 Running 就说明 controller 起来了。注意这里用的是 Traefik v2 的启动参数和网上很多 v1.7 的老教程不一样--kubernetes在 v2 里已经换成--providers.kubernetesingresstrue这是最容易踩的版本坑。3.2 创建两个 nginx 服务# nginx01.yaml apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx01 name: nginx01 spec: replicas: 1 selector: matchLabels: app: nginx01 template: metadata: labels: app: nginx01 spec: containers: - image: nginx:1.19.6 name: nginx01 --- # nginx02.yaml apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx02 name: nginx02 spec: replicas: 1 selector: matchLabels: app: nginx02 template: metadata: labels: app: nginx02 spec: containers: - image: nginx:1.19.6 name: nginx02kubectl apply -f nginx01.yaml kubectl apply -f nginx02.yaml kubectl expose deployment nginx01 --namenginx01-svr --port80 kubectl expose deployment nginx02 --namenginx02-svr --port80给两个 nginx 写入不同的首页内容方便验证转发是否命中正确后端kubectl exec -it deploy/nginx01 -- bash -c echo h1Welcome to nginx01!/h1 /usr/share/nginx/html/index.html kubectl exec -it deploy/nginx02 -- bash -c echo h1Welcome to nginx02!/h1 /usr/share/nginx/html/index.html3.3 编写 Ingress 规则这是核心资源。注意用networking.k8s.io/v1pathType必填backend 结构也变了# ingress.rule.yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-nginx-test spec: rules: - host: www.nginx01.com http: paths: - path: / pathType: Prefix backend: service: name: nginx01-svr port: number: 80 - host: www.nginx02.com http: paths: - path: / pathType: Prefix backend: service: name: nginx02-svr port: number: 80kubectl apply -f ingress.rule.yaml kubectl get ingress如果这里报no matches for kind Ingress in version networking.k8s.io/v1说明集群版本太老需要降级到extensions/v1beta1并改回serviceName/servicePort写法。反过来如果集群是 1.22 还用老 apiVersion会直接报 unavailable。4. 验证请求与成功结果Traefik 用 hostNetwork 部署后直接拿任意节点 IP 就能访问。假设节点 IP 是10.120.75.107curl -H Host: www.nginx01.com http://10.120.75.107 curl -H Host: www.nginx02.com http://10.120.75.107预期分别返回Welcome to nginx01!和Welcome to nginx02!。同一个 IP、同一个端口仅靠 Host 头不同就路由到不同 Service这就是 ingress controller 的核心能力。再打开 Traefik Dashboard 确认代理状态curl http://10.120.75.107:8080/api/rawdata | head -c 500浏览器访问http://10.120.75.107:8080/dashboard/能看到两个 router 和对应的 service后端显示 WRR 负载均衡。如果 Dashboard 里 router 是空的说明 Ingress 没被 controller 识别优先检查 RBAC 权限和--providers.kubernetesingress参数。用 TaoToken 调试时可以把上面kubectl get ingress的输出或 curl 报错贴进模型对话让它帮你判断是 apiVersion 问题还是 backend 字段问题。模型对话入口在 https://taotoken.net/api 配合统一 Key 使用。5. 本篇常见报错排查404 page not foundIngress 规则里的 host 和 curl 的 Host 头不一致或者 path 没匹配上。先kubectl describe ingress ingress-nginx-test看规则是否生效。connection refusedTraefik Pod 没起来或者 hostNetwork 没开导致节点 80 端口没监听。kubectl get pods -n kube-system确认状态。no matches for kind IngressapiVersion 和集群版本不匹配1.22 必须用networking.k8s.io/v1。backend service not foundService 名字或 namespace 写错Ingress 和 Service 必须在同一 namespace。Dashboard 空白v2 的 Dashboard 路径是/dashboard/且需要--api.insecuretrue才开放 8080。注意线上环境不要用--api.insecuretrueDashboard 应加认证或只在内网暴露。测试环境图方便可以但别把这份 YAML 直接搬生产。6. 继续往下走把 ingress 链路跑通之后下一步通常是配 TLS、加 middleware 做限流或重定向。这些配置同样可以让 AI 生成但前提是你的调试通道是统一的不然每换一个模型就要重配一遍 Key。长期做 k8s 编码或 Agent 自动化的话可以看下 Coding Planhttps://taotoken.net/api 把模型调用和 API 通道收敛到一处调试 ingress 这类反复试错的活会顺很多。
返回列表