背景与目标
本文基于 3 节点裸金属 K8s 集群(ubuntu-111/112/113),介绍如何部署 Traefik 作为 Ingress Controller,并通过一个 Python HTTP 服务验证整个链路的可用性。
环境规划
- K8s 集群:3 节点,无 MetalLB,使用 HAProxy 作为外部负载均衡
- Traefik 版本:Helm Chart 39.1.0-ea.2(Traefik 3.x)
- 核心目标:
- Traefik 仅调度到 ubuntu-111、ubuntu-112 节点(通过节点亲和性实现)
- 启用 hostNetwork 模式,直接占用节点 80/443 端口
- HAProxy 代理两个 Traefik 节点,增加后端健康检查
- 部署 Python HTTP 服务并通过 Traefik Ingress 暴露
Traefik 部署实践
1. 节点标签与亲和性配置
1.1 为多节点打标签
给 ubuntu-111、ubuntu-112 都打上 traefik-work=true 标签,作为 Traefik 调度的目标节点:
# 给 ubuntu-111 打标签
kubectl label nodes ubuntu-111 traefik-work=true
# 给 ubuntu-112 打标签
kubectl label nodes ubuntu-112 traefik-work=true
# 验证标签是否添加成功
kubectl get nodes ubuntu-111 ubuntu-112 --show-labels | grep traefik-work
1.2 多节点亲和性配置
在 Traefik 的 values.yaml 中,配置节点亲和性匹配两个打标签的节点,同时设置 Pod 反亲和性避免同一节点运行多个 Traefik 实例:
affinity:
# 节点亲和性:匹配 traefik-work=true 的节点(ubuntu-111/112)
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: traefik-work
operator: In
values:
- "true"
# Pod 反亲和性:避免同一节点运行多个 Traefik Pod
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:


