Traefik · 集群 Ingress 控制器
Traefik 是这个 K3s 集群的 Ingress 入口控制器,所有 *.yldm.tech 通配域名经 Cloudflare Tunnel 转发到它,再由它按 Ingress 规则路由到各业务 Service。
它是 k3s 的内置组件,由 k3s 自带的 Helm chart 渲染部署,本仓库不存放它的 Deployment/Service 等运行时清单。仓库里唯一一份与 Traefik 相关的文件是 applications/networking/traefik/helmchartconfig-traefik.yaml,一个 HelmChartConfig(helm.cattle.io/v1),用来覆盖 k3s 内置 traefik chart 的默认值。这是文档化它的调度定制与 MetalLB 兼容修复的地方,而不是完整的工作负载定义。
部署形态
- Name
- 命名空间
- Description
- kube-system(k3s 内置组件随集群安装在此)
- Name
- 工作负载类型
- Description
- Deployment(由 k3s traefik chart 34.2.1 渲染),HPA 2-5 副本
- Name
- 调度
- Description
- 通过 HelmChartConfig 强制 nodeAffinity 到 worker 节点(node-role.kubernetes.io/worker In worker),并用 topologySpreadConstraints(maxSkew 1, topologyKey kubernetes.io/hostname, ScheduleAnyway)在 worker 之间软打散,每节点一副本
- Name
- Service 类型
- Description
- LoadBalancer,VIP 192.168.88.221(由 MetalLB L2 模式分配并 ARP 通告)
副本不再像早期那样被 live-edit 的 nodeSelector workload=infra 钉在单一节点上(那会让 Ingress 入口落在一个故障域里)。现在改为只跑在 worker 节点、跨节点软打散,对应 PR #900 的"traefik 移出单节点,worker 间打散"。
配置与依赖
本仓库对 Traefik 的全部干预都集中在 helmchartconfig-traefik.yaml 的 spec.valuesContent 里,覆盖三类默认值:
| 覆盖项 | 值 | 目的 |
|---|---|---|
service.ipFamilyPolicy | SingleStack | 强制单栈 IPv4,让 MetalLB 能正常分配/通告 VIP |
affinity.nodeAffinity | requiredDuringScheduling,限定 node-role.kubernetes.io/worker=worker | Ingress 入口只跑在 worker 节点 |
topologySpreadConstraints | maxSkew 1 / hostname / ScheduleAnyway | worker 之间一节点一副本软打散 |
依赖关系:上游入口依赖 Cloudflare Tunnel(cloudflare-tunnel-yldm,*.yldm.tech 通配转 Traefik);对外暴露依赖 MetalLB(L2 模式给它分配并通告 LoadBalancer VIP .221)。
访问与监控
Traefik 以 LoadBalancer Service 对外暴露,外部 VIP 为 192.168.88.221(MetalLB 默认池中 IPv4-only 地址)。README 记录其 Ingress 配置为 HPA 2-5 副本自动伸缩。本仓库的 traefik 目录下没有 ServiceMonitor、PrometheusRule、HPA/VPA、PDB 等独立清单——这些(如有)由 k3s 内置 chart 自身管理,不在本仓库 GitOps 范围内。
注意事项
ipFamilyPolicy: SingleStack 这条覆盖是一次真实故障的修复,不能去掉:k3s traefik chart 34.2.1 默认把 service.ipFamilyPolicy 设为 PreferDualStack,而本集群 MetalLB 的 default-pool 是 IPv4-only,无法满足双栈请求,导致 traefik 的 LB VIP 192.168.88.221 不再被通告,所有 Ingress 报 "No route to host"。强制 SingleStack 后 MetalLB 才能正常分配/通告该 IPv4 VIP。
调度定制的来源差异要记住:traefik 的调度走本仓库 Git 管理的这份 HelmChartConfig;而同为 k3s 内置组件的 coredns / metrics-server 是在集群内直接 patch(workload: infra),k3s 重启可能回到默认值,属已知事项。
因为 VIP .221 由 MetalLB 的 speaker 通过 ARP 通告,MetalLB speaker 宕掉会直接带走外部 Ingress:没有 ARP 应答者时 .221 不可达,相当于整条对外入口断掉。排查 Ingress 不通时,MetalLB 的健康状态是必查项之一。
返回 Networking 总览