traefik怎样做Kubernetes ingress

联启 网络工具 17

Traefik 作为 Kubernetes Ingress 的终极实践指南:从入门到生产

文章目录导读

  1. 什么是 Traefik Ingress?为何选择它?
  2. Traefik 与 Kubernetes 核心架构解析
  3. 手把手安装部署 Traefik Ingress Controller
  4. 核心配置实战:路由、中间件与TLS
  5. 常见问题速查(FAQ)
  6. 性能优化与生产级最佳实践

什么是 Traefik Ingress?为何选择它?

Q: 既然 Kubernetes 有原生 Ingress,为什么还要用 Traefik?
A: Kubernetes 原生 Ingress 仅提供基本的 HTTP/HTTPS 路由,而 Traefik 是一个云原生反向代理,支持自动发现服务、动态配置、多协议(TCP/UDP/gRPC)、完善的中间件体系,它还内置Let's Encrypt证书自动签发、灰度发布、断路器、限流等功能,是CNCF毕业项目,社区成熟度极高。

traefik怎样做Kubernetes ingress-第1张图片-电脑手机工具软件下载 - 免费实用工具合集 | 联启科技

Traefik 作为 Ingress Controller 时,自动监听 Kubernetes API 的 Service 和 Ingress 资源变化,无需重载或重启,推荐生产环境使用Traefik v3版本,它改进了 HTTP/3 支持与负载均衡算法。

关键词提醒:文中所有涉及配置域名替换为 your-domain.com 即可;若需自定义本地测试,可使用 traefik.local


Traefik 与 Kubernetes 核心架构解析

下图描述 Traefik 在K8s中的角色:

[用户请求] → [Traefik Ingress Controller Pod] → [IngressRoute资源] → [后端Service Pod]
                          ↑
                    [Kubernetes API Watch]

Traefik 通过 IngressRoute(自定义资源CRD)替代了原生Ingress,支持更复杂的路由规则,它工作的核心组件包括:

  • EntryPoints:监听端口(如80/443/8080)
  • Routers:匹配请求并转发到Service
  • Services:定义后端负载均衡
  • Middlewares:请求处理管道(认证、重写、限流等)

手把手安装部署 Traefik Ingress Controller

1 前置条件

  • Kubernetes集群(v1.24+)
  • kubectl已连接集群
  • Helm v3(推荐)

2 使用 Helm 快速安装(生产推荐)

# 添加 Traefik 官方仓库
helm repo add traefik https://traefik.github.io/charts
helm repo update
# 安装 Traefik 到 kube-system 命名空间(可自定义)
helm install traefik traefik/traefik \
  --namespace kube-system \
  --create-namespace \
  --set ingressClass.enabled=true \
  --set ingressClass.isDefault=true \
  --set deployment.replicas=2 \
  --set ports.web.port=80 \
  --set ports.websecure.port=443 \
  --set service.type=LoadBalancer

参数说明

  • ingressClass.isDefault=true:将Traefik设为默认Ingress类,避免所有Ingress都需手动指定 ingressClassName
  • deployment.replicas=2:生产环境至少2个副本实现高可用
  • service.type=LoadBalancer:若云环境自动分配公网IP(如AWS NLB、GCP TCP LB);本地环境可用NodePort

验证安装状态:

kubectl get pods -n kube-system | grep traefik
kubectl get svc -n kube-system traefik

3 无 Helm 使用清单文件部署(高级选项)

官方GitHub Releases 下载部署包,或直接使用如下精简清单(仅展示核心CRD部分):

apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: traefik
spec:
  controller: traefik.io/ingress-controller
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: dashboard
  namespace: kube-system
spec:
  entryPoints:
    - websecure
  routes:
  - match: Host(`dashboard.your-domain.com`) && PathPrefix(`/`)
    kind: Rule
    services:
    - name: api@internal
      kind: TraefikService

核心配置实战:路由、中间件与TLS

1 基础 HTTP 路由(IngressRoute 示例)

假设您有一个名为 my-app 的 Service,暴露在 80 端口:

apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: my-app-route
  namespace: default
spec:
  entryPoints:
    - web
  routes:
  - match: Host(`app.your-domain.com`) && PathPrefix(`/`)
    kind: Rule
    services:
    - name: my-app
      port: 80
      scheme: http
      # 负载均衡策略(可选)
      strategy: RoundRobin

对应原生Ingress:此种配置等效于 Host: app.your-domain.com 的所有路径转发到 my-app:80

2 配置 HTTPS 与 Let's Encrypt 自动证书

创建 Certificate CRD 并关联到 IngressRoute:

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: app-tls
  namespace: default
spec:
  secretName: app-tls-secret
  dnsNames:
  - app.your-domain.com
  issuerRef:
    name: letsencrypt-prod
    kind: ClusterIssuer
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: my-app-tls
spec:
  entryPoints:
    - websecure
  routes:
  - match: Host(`app.your-domain.com`)
    kind: Rule
    services:
    - name: my-app
      port: 80
  tls:
    secretName: app-tls-secret

若只需自签或已有证书,可直接 tls.secretName 指向任意 TLS Secret。

3 高级中间件:认证、限流与重写

增加基本认证(创建中间件并引用):

apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
  name: basic-auth
  namespace: default
spec:
  basicAuth:
    secret: auth-secret  # 需提前创建包含 users: admin:$2y$10$... 的Secret
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: my-app-auth
spec:
  entryPoints:
    - web
  routes:
  - match: Host(`admin.your-domain.com`)
    kind: Rule
    middlewares:
    - name: basic-auth
    services:
    - name: my-app
      port: 80

配置限流(防止DDOS):

apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
  name: rate-limit
spec:
  rateLimit:
    average: 100
    burst: 50
    period: 1m

4 灰度发布(Canary)

利用权重或Header实现流量分割:

apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: my-app-canary
spec:
  entryPoints:
    - web
  routes:
  - match: Host(`app.your-domain.com`) && Headers(`X-Canary`, `true`)
    kind: Rule
    services:
    - name: my-app-canary
      port: 80
      weight: 100
  - match: Host(`app.your-domain.com`)
    kind: Rule
    services:
    - name: my-app-stable
      port: 80
      weight: 90
    - name: my-app-canary
      port: 80
      weight: 10

常见问题速查(FAQ)

问题 原因与解决方案
Q:部署后访问返回404 检查IngressRoute的 entryPoints 是否对应Traefik实际监听端口(默认web是80,websecure是443)
Q:证书自动签发失败 确认DNS解析指向Traefik的公网IP;检查ClusterIssuer是否配置成功 (cert-manager)
Q:Service后端总是未健康 添加 traefik.ingress.kubernetes.io/service.serversscheme: h2c 注解启用HTTP/2健康检查
Q:如何让Ingress同时支持TCP/UDP 使用 IngressRouteTCPIngressRouteUDP 自定义资源,非IngressRoute
Q:动态更新中间件后不生效 Traefik自动监听CRD变更,延迟约1-2秒;确认中间件是否被多路由引用

Q: 是否需要配置 kubernetes.io/ingress.class: traefik ?
A: 如果在安装时设置了 ingressClass.isDefault=true,则无需显式指定;否则需在每个Ingress或IngressRoute中设置 ingressClassName: traefik


性能优化与生产级最佳实践

  • 水平自动扩缩:基于CPU/内存的HPA策略,如 kubectl autoscale deployment traefik -n kube-system --min=2 --max=10 --cpu-percent=70
  • 日志与监控:启用JSON日志格式 (--log.level=INFO --log.format=json),配合Prometheus Operator 抓取 /metrics
  • 安全加固:禁止Traefik Dashboard暴露到公网;使用 --api.disabledashboard=true 关闭默认Dashboard入口
  • 网络策略:限制只允许中间件/Pod访问后端Service,应用 NetworkPolicy
  • 多Ingress路由条件:避免在单个IngressRoute写过多路由规则,建议按应用拆分
  • 外部流量直连Pod:使用 ingressClass 设定 scope: namespace,或依赖 Tailscale / Istio 旁路

附录:推荐的监控组合

  • Traefik指标 → Prometheus + Grafana (官方提供现成dashboard json)
  • 日志 → Loki + Grafana
  • 告警 → Alertmanager

通过上述从安装到高级配置的完整指南,您已能熟练将 Traefik 作为 Kubernetes Ingress Controller 使用,当面对复杂路由、灰度发布或自动证书管理时,Traefik 的 CRD 生态会让您事半功倍,若仍需深入了解某个中间件细节,可参考 Traefik官方文档的Kubernetes专用章节

标签: traefik Kubernetes ingress

抱歉,评论功能暂时关闭!