Traefik 作为一款云原生反向代理与负载均衡工具,是 K3s 集群默认集成的 Ingress 控制器。凭借动态配置、服务自动发现等核心特性,它无需重启服务即可实时更新路由规则,成为 Kubernetes 生态中轻量级 Ingress 方案的首选,尤其适配 K3s 轻量化部署的核心需求。本文将详细拆解 K3s 中 Traefik 的完整配置流程,涵盖 Dashboard 启用、Service 与路由规则配置、HTTP/HTTPS 访问实现及 TCP/UDP 服务代理等核心操作,助力运维人员快速上手、高效落地。
一、启用 Traefik Dashboard
K3s 集群(版本 ≥1.21)默认集成 Traefik,但未启用其 Dashboard 功能。需注意的是,直接修改 /var/lib/rancher/k3s/server/manifests/traefik.yaml 配置文件,会在 K3s 重启后被系统自动覆盖,因此推荐通过 HelmChartConfig 自定义配置的方式,安全稳定地启用 Dashboard。
1. 创建 HelmChartConfig 配置文件
在 /var/lib/rancher/k3s/server/manifests 目录下创建 traefik-config.yaml 文件,写入以下配置(直接复制执行即可生效):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| cat >> /var/lib/rancher/k3s/server/manifests/traefik-config.yaml << EOF apiVersion: helm.cattle.io/v1 kind: HelmChartConfig metadata: name: traefik namespace: kube-system spec: valuesContent: |- dashboard: enabled: true ports: traefik: expose: true logs: access: enabled: true EOF
|
2. (K8s 通用)通过 Helm 升级配置
若部署环境为标准 Kubernetes 集群(非 K3s),可直接修改 traefik-values.yaml 配置文件后,执行以下 Helm 命令升级 Traefik 配置,启用 Dashboard:
1 2
| helm upgrade traefik traefik/traefik \ --namespace traefik -f traefik-values.yaml
|
二、配置 Service 及路由规则
成功启用 Dashboard 后,需进一步配置 Service 暴露端口,并通过 Traefik 专属的 IngressRoute 自定义路由规则,实现 Dashboard 的外部访问。相比传统 Ingress,IngressRoute作为 Traefik 的 CRD 资源,提供了更灵活的路由配置能力和更清晰的结构层次。
1. 编写 Service 与 IngressRoute 配置文件
创建 traefik-dashboard.yaml 文件,整合 Service 端口暴露与 IngressRoute 路由规则,内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| cat >> traefik-dashboard.yaml << EOF apiVersion: v1 kind: Service metadata: name: traefik namespace: kube-system spec: allocateLoadBalancerNodePorts: true ports: - name: web nodePort: 80 port: 80 protocol: TCP targetPort: web - name: websecure nodePort: 443 port: 443 protocol: TCP targetPort: websecure selector: app.kubernetes.io/instance: traefik-kube-system app.kubernetes.io/name: traefik type: LoadBalancer
---
apiVersion: traefik.io/v1alpha1 kind: IngressRoute metadata: name: traefik-dashboard-web spec: entryPoints: - web routes: - kind: Rule match: PathPrefix(`/dashboard`) || PathPrefix(`/api`) services: - name: api@internal kind: TraefikService
---
apiVersion: traefik.io/v1alpha1 kind: IngressRoute metadata: name: traefik-dashboard-websecure spec: entryPoints: - websecure routes: - kind: Rule match: PathPrefix(`/dashboard`) || PathPrefix(`/api`) services: - name: api@internal kind: TraefikService tls: secretName: traefik-dashboard-tls EOF
|
2. 应用配置
执行以下命令,将配置应用到 K3s 集群,使 Service 与路由规则生效:
1
| kubectl apply -f traefik-dashboard.yaml
|
注意:访问 Dashboard 时,URL 末尾必须添加 /(例如http://<节点IP>/dashboard/),否则会出现 page not found 错误,这是 Traefik Dashboard 路由匹配的常见注意点。
三、配置 IngressRoute 实现服务代理
Traefik 的核心优势的在于通过 IngressRoute 自定义路由规则,全面支持 HTTP、HTTPS、TCP/UDP 等多种协议,可灵活适配不同类型服务的暴露需求。以下将以 whoami 测试服务为例,详细演示各类路由的配置方法,帮助快速掌握 IngressRoute 的使用逻辑。
1. 搭建测试环境
首先创建 whoami 部署和对应的 Service,作为路由代理的测试目标,执行以下命令:
1 2
| kubectl create deploy whoami --image=traefik/whoami --replicas=2 kubectl expose deploy whoami --port=80
|
2. HTTP 路由配置
创建 whoami-no-tls-ingress-route.yaml 文件,定义 HTTP 协议的路由规则,实现通过指定路径访问 whoami 服务:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata: name: whoami-ingress-web namespace: default spec: entryPoints: - web routes: - match: Host(`192.168.0.2`) && PathPrefix(`/notls`) kind: Rule services: - name: whoami port: 80
|
3. HTTPS 路由配置
HTTPS 路由需先配置 TLS 证书(可使用自签名证书用于测试,生产环境推荐通过 cert-manager 实现证书自动化管理),再通过 IngressRoute 绑定证书,实现加密访问。Traefik 结合 Let’s Encrypt 可进一步实现 TLS 证书的自动签发与续期,简化 HTTPS 配置流程。
(1)生成自签名证书
执行以下命令生成自签名 TLS 证书,并将其存储为 Kubernetes Secret,供 Traefik 调用(关于自签名证书的详细使用场景、安全注意事项及生产环境替代方案,将在后续文章中详细讲解):
1 2
| openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=domain.example.com" kubectl create secret tls whoami-tls --cert=tls.crt --key=tls.key
|
(2)编写 HTTPS 路由配置
创建 whoami-tls-ingress-route.yaml 文件,配置 HTTPS 路由规则,绑定上述生成的 TLS 证书:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata: name: whoami-ingress-websecure namespace: default spec: entryPoints: - websecure routes: - match: Host(`192.168.0.2`) && PathPrefix(`/tls`) kind: Rule services: - name: whoami port: 80 tls: secretName: whoami-tls
|
4. TCP/UDP 路由配置
Traefik 默认仅开放 traefik(9000)、web(80)、websecure(443)、metrics(9100) 四个入口点,若需代理 MySQL、Redis 等 TCP/UDP 类型服务,需通过 IngressRouteTCP(TCP 服务)或 IngressRouteUDP(UDP 服务)自定义路由规则,这也是 Traefik 相比传统 Ingress 的核心优势之一,可实现全协议流量代理。
以 Redis(TCP 服务)为例,其 Traefik 路由配置如下:
1 2 3 4 5 6 7 8 9 10 11 12 13
| apiVersion: traefik.containo.us/v1alpha1 kind: IngressRouteTCP metadata: name: redis namespace: devops spec: entryPoints: - redis routes: - match: HostSNI(`*`) services: - name: redis port: 6379
|
TCP 与 HTTP 路由核心差异:
TCP 路由的 match 字段需使用 HostSNI(`*`),而 HTTP 路由可直接通过 Host 匹配域名或 IP;
TCP 路由仅支持代理 TCP 协议服务,无法处理 HTTP 请求,二者路由规则不可混用;
若 TCP 和 HTTP 路由监听同一入口点,TCP 路由优先级更高,未匹配到 TCP 规则时,才会触发 HTTP 路由匹配。
四、常见问题与参考资料
1. Dashboard 无法访问排查
若配置完成后,Traefik Dashboard 无法正常访问,可参考以下权威文档定位并解决问题,覆盖配置错误、端口暴露、路由匹配等常见排查场景:
2. 扩展参考
为帮助大家深入掌握 Traefik 在 K3s 中的应用,整理以下扩展参考资料,涵盖进阶配置、实战踩坑、证书管理等内容:
总结
本文基于 K3s 内置的 Traefik 2.x 版本,从 Dashboard 启用、基础路由配置,到 HTTPS 证书部署、TCP/UDP 服务代理,全面覆盖了 Traefik 在 K3s 环境中的核心使用场景。其中,通过 HelmChartConfig 自定义配置,可有效避免 K3s 重启后配置被覆盖的问题,保障配置的稳定性;而 IngressRoute 灵活的路由规则,能够满足不同协议、不同场景的服务暴露需求,充分发挥 Traefik 动态配置、自动发现的优势。
实际生产环境中,可结合 cert-manager 实现 TLS 证书的自动化签发与续期,进一步简化配置流程、提升服务安全性;同时,可借助 Traefik 的中间件功能,实现路径重写、请求转发、流量控制等进阶操作,构建更贴合企业需求的云原生流量入口架构。