夏日幽灵 サマーゴースト (2021)
K8s 集群使用 Gateway API 和 Traefik k8s gateway api traefik overview Kubernetes Gateway API Traefik 云原生 后端
705 字
4 分钟
K8s 集群使用 Gateway API 和 Traefik
先说结论
我现在的默认策略
- 新服务直接用 Gateway API
- 网关实现优先 Traefik
- 老服务按窗口从 Ingress 分批迁移
这不是追新 这是为了降低后续治理成本
为什么 Ingress 在规模上会吃力
单服务阶段 Ingress 很顺手 服务和团队变多以后会出现几个问题
- 入口能力和业务路由耦合太紧
- 大量依赖控制器私有注解 可移植性一般
- 多团队协作时权限边界不够清楚
结果就是入口层越来越难改 一次小改动也可能影响大范围流量
Gateway API 解决的核心问题
Gateway API 不只是对象更多 核心是职责拆分更清楚
| 对象 | 谁负责 | 作用 |
|---|---|---|
GatewayClass | 平台团队 | 定义网关实现 |
Gateway | 平台团队 | 定义入口监听和 TLS |
HTTPRoute TCPRoute | 业务团队 | 定义业务路由 |
ReferenceGrant | 平台团队 | 控制跨命名空间授权 |
这种拆分在生产里很实用
- 平台和业务边界明确
- 路由治理能力更强
- 变更审计更清晰
为什么我选 Traefik
我关注的是落地效率和长期维护 Traefik 在这两个点都比较均衡
- K8s 生态集成成熟
- Gateway API 支持稳定
- 中间件能力够用 限流 重试 Header 处理都好用
- 观测链路接入简单
如果团队没有强绑定其他网关栈 Traefik 是一个稳妥选择
最小可运行方案
1 安装 Gateway API CRD
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.1.0/standard-install.yaml2 安装 Traefik 并开启 Gateway Provider
helm repo add traefik https://traefik.github.io/chartshelm repo update
helm upgrade --install traefik traefik/traefik \ -n traefik --create-namespace \ --set service.type=LoadBalancer \ --set providers.kubernetesGateway.enabled=true3 创建 Gateway
apiVersion: gateway.networking.k8s.io/v1kind: Gatewaymetadata: name: gw-public namespace: infra-gatewayspec: gatewayClassName: traefik listeners: - name: http protocol: HTTP port: 80 allowedRoutes: namespaces: from: Selector selector: matchLabels: gateway-access: "true"4 业务服务接入 HTTPRoute
apiVersion: gateway.networking.k8s.io/v1kind: HTTPRoutemetadata: name: app-route namespace: appspec: parentRefs: - name: gw-public namespace: infra-gateway hostnames: - api.example.com rules: - matches: - path: type: PathPrefix value: /v1 backendRefs: - name: app-svc port: 8080迁移时最常见的坑
allowedRoutes过宽或过窄 导致失控或挂不上- 跨命名空间引用缺少
ReferenceGrant - 证书 Secret 在错误命名空间
- 灰度阶段缺监控 误判问题位置
- 直接硬切 没有并行窗口
WARNING入口层迁移不要一把梭 先并行 再灰度 最后收敛
我推荐的迁移路径
- 并行期
- Ingress 和 Gateway API 同时在线
- 试点期
- 低风险服务先迁
- 灰度期
- 核心服务按权重切流
- 收敛期
- 指标稳定后下线旧规则
结尾
如果你现在还是小规模集群 继续用 Ingress 没问题
如果你已经进入多团队和高频变更阶段 建议尽早切到 Gateway API
我的建议还是这句
新服务直接 Gateway API 老服务分批迁移 Traefik 做统一入口承接
K8s 集群使用 Gateway API 和 Traefik
https://bangwu.top/posts/k8s-gateway-api-traefik-overview/