我们小团队的DevOps伙伴们,大家好!相信不少人和我一样,在K8s的世界里摸爬滚打,最怕的就是配置和维护那些复杂的基础设施。尤其是Ingress Controller,选择繁多,但要找到一个既能满足日常需求,又足够简单易用、维护成本低的,还真需要一番考量。最近我们团队在解决这个问题时,发现了一个非常适合“小而美”团队的利器——Traefik Ingress Controller。
为什么说Traefik特别适合我们呢?它完美契合了你们提出的几点核心诉求:
- 配置与维护的极致简化:Traefik最大的亮点之一就是它的动态配置能力。它能直接监听Kubernetes API,根据Ingress或其自定义资源
IngressRoute的变化自动更新路由规则,无需手动重启。配置语言也相对直观,基于CRD(Custom Resource Definition)的声明式配置,比手写Nginx配置要友好得多。 - 直观的管理界面(Dashboard):这一点是Traefik的杀手锏。它自带一个非常漂亮的Web UI Dashboard,可以实时查看所有路由、服务、中间件的状态,甚至能直接看到流量和健康检查情况。对于小团队来说,这意味着大大降低了排查问题的难度和学习成本,新同学也能快速上手。
- 与Prometheus和Grafana的无缝集成:监控是DevOps的生命线。Traefik内置了对Prometheus的支持,你只需要在配置中简单开启Metrics导出,Prometheus就能抓取到它丰富的性能指标,比如请求量、延迟、错误率等。然后,结合Grafana,你可以轻松构建出精美的流量和健康监控仪表盘,对服务的运行状况一目了如。
- 极低的学习成本:由于上述优点,Traefik的整体学习曲线非常平缓。无论是部署、配置还是日常维护,都力求简单。尤其是有Dashboard加持,很多信息可以直接在图形界面中获取,减少了对命令行和复杂配置文件的依赖。
接下来,我就分享一下我们是如何部署和使用Traefik,并与监控系统集成的:
第一步:通过Helm部署Traefik
部署Traefik最推荐的方式是使用Helm,简单、标准化。
首先,添加Traefik的Helm仓库:
helm repo add traefik https://traefik.github.io/charts
helm repo update
然后,部署Traefik。这里我们做一些基本配置,比如开启Dashboard、Prometheus Metrics和IngressRoute。为了方便访问Dashboard,我们通常会创建一个NodePort或LoadBalancer Service,或者通过一个单独的Ingress来暴露它。这里以NodePort为例方便测试:
# values.yaml
# 自定义Traefik的values,保存为traefik-values.yaml
deployment:
kind: Deployment
ingressRoute:
enabled: true # 开启IngressRoute CRD支持
providers:
kubernetesCRD:
enabled: true # 启用CRD provider
kubernetesIngress:
enabled: true # 启用Kubernetes Ingress provider (兼容标准Ingress)
dashboard:
enabled: true # 开启Dashboard
domain: traefik-dashboard.yourdomain.com # 替换为你的域名,或通过NodePort访问
ingressRoute:
enabled: true # 通过IngressRoute暴露Dashboard
metrics:
prometheus:
enabled: true # 开启Prometheus Metrics
entryPoint: metrics # Prometheus抓取的入口点
service:
type: LoadBalancer # 或者 NodePort
ports:
web:
port: 80
targetPort: 8000
nodePort: 30080 # 如果是NodePort,指定一个端口
websecure:
port: 443
targetPort: 8443
nodePort: 30443 # 如果是NodePort,指定一个端口
metrics: # 为Prometheus metrics暴露服务
port: 9000
targetPort: 9000
nodePort: 30900 # 如果是NodePort,指定一个端口
使用Helm部署:
helm install traefik traefik/traefik -f traefik-values.yaml -n kube-system # 部署到kube-system命名空间
部署完成后,你可以通过kubectl get svc -n kube-system查看traefik服务的IP和端口,访问Dashboard(通常是Web UI端口)。如果是NodePort,你可以用NodeIP:NodePort访问。
第二步:使用IngressRoute配置路由
Traefik推荐使用其自定义资源IngressRoute来配置路由,它提供了比标准Kubernetes Ingress更强大的功能。
例如,我们要为名为my-app的服务配置一个路由:
# my-app-ingressroute.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: my-app-ingressroute
namespace: default
spec:
entryPoints:
- web # 对应Traefik的web入口点,监听80端口
routes:
- match: Host(`my-app.yourdomain.com`) # 当请求的主机是my-app.yourdomain.com时
kind: Rule
services:
- name: my-app-service # 你的Kubernetes Service名称
port: 80 # 你的Kubernetes Service的端口
---
apiVersion: v1
kind: Service
metadata:
name: my-app-service
namespace: default
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
只需kubectl apply -f my-app-ingressroute.yaml,Traefik就会自动检测并配置路由,无需额外操作。
第三步:集成Prometheus和Grafana进行监控
Prometheus抓取配置:
Traefik默认在metrics入口点(端口9000)暴露Prometheus格式的指标。如果你已经部署了Prometheus,只需要在Prometheus的scrape_configs中添加一个Job来抓取Traefik的指标即可。# prometheus.yaml (部分配置) - job_name: 'traefik' kubernetes_sd_configs: - role: service relabel_configs: - source_labels: [__meta_kubernetes_service_name] regex: traefik # 匹配Traefik Service的名称 action: keep - source_labels: [__meta_kubernetes_service_port_name] regex: metrics # 匹配Traefik Service中暴露metrics的端口名称 action: keep - source_labels: [__meta_kubernetes_namespace] target_label: kubernetes_namespace - source_labels: [__meta_kubernetes_service_name] target_label: kubernetes_service_name这段配置会告诉Prometheus去抓取
kube-system命名空间下名为traefik的Service的metrics端口的指标。Grafana仪表盘:
在Prometheus开始抓取Traefik指标后,你可以在Grafana中导入现有的Traefik仪表盘模板,比如Grafana Labs官方提供的Traefik (Official)(ID:10304) 或Traefik 2.x Dashboard(ID:12402)。这些模板已经预设了各种有用的面板,如请求率、延迟、错误、活跃连接数等,让你能迅速拥有一个功能完善的监控视图。导入后选择你的Prometheus数据源即可。
总结
对于我们小型DevOps团队而言,时间宝贵,资源有限。Traefik Ingress Controller以其卓越的易用性、直观的管理界面和对主流监控体系的良好支持,成为了一个理想的选择。它不仅能帮助我们高效地管理外部流量,还能显著降低运维复杂度和学习成本,让我们能更专注于业务开发本身。希望这篇文章能帮助你在选择和使用Ingress Controller时少走弯路!