前言
Ingress
Service 可能会有很多,如果每个资源都绑定一个 node port 的话,主机则需要开放外围的端口进行服务调用,管理上会比较混乱。
比较优雅的方式是通过一个外部的负载均衡器,比如 Nginx,绑定固定的端口比如 80,然后根据域名/服务名向后面的 Service IP 转发,但是这里的问题在于:当有新服务加入的时候如何修改 Nginx 配置?
手动改或者 Rolling Update Nginx Pod 都是不现实的。
对于这个问题,Kubernetes 给出的七层解决方案是:Ingress
Traefik
Træfik 是一个为了让部署微服务更加便捷而诞生的现代 HTTP 反向代理、负载均衡工具。它支持多种后台(Docker、Swarm、Kubernetes、Marathon、Mesos、Consul、Etcd、Zookeeper、BoltDB、Rest API、file...)来自动化、动态的应用它的配置文件设置。
Traefik 是 K3s 里面的 Ingress Controller,支持负载均衡和反向代理,类似于 Nginx。
Traefik 的仪表板非常便捷,能够提供集群当前状态的详细概述,包括集群入口和服务网格路由配置的详细信息。

K3s 开启 Traefik Dashboard(可视化面板不提供路由配置)
Traefik v1 启用 Dashboard
默认情况下,K3s 1.20 及更早版本默认安装 Traefik v1,并且默认没有启用 Traefik Dashboard。如果要在 K3s 中启用 Traefik v1 的 Dashboard,我们可以借助 HelmChartConfig 来自定义由 Helm 部署的 Traefik v1 并启用 Dashboard。
注意:
- 不建议手动编辑
/var/lib/rancher/k3s/server/manifests/traefik.yaml来修改 Traefik 配置文件,因为 K3s 重启后会覆盖修改的内容 - 建议通过在
/var/lib/rancher/k3s/server/manifests中创建一个额外的HelmChartConfig清单来自定义 Traefik 配置,请参考:http://docs.rancher.cn/docs/k3s/helm/_index/
1 | cat >> /var/lib/rancher/k3s/server/manifests/traefik-config.yaml << EOF |
此时,Traefik 将会重新部署,大约 10 秒钟左右,就可以通过 spec.valuesContent.domain 配置的域名来访问 Traefik Dashboard 了:

Traefik v2 启用 Dashboard
默认情况下,K3s 1.21 及更高版本默认安装 Traefik v2。出于安全考虑,默认是不公开 Traefik Dashboard 的。我们常见的公开 Dashboard 的方式主要为以下两种:
方法 1:通过端口转发来实现
1 | kubectl -n kube-system port-forward $(kubectl -n kube-system get pods --selector "app.kubernetes.io/name=traefik" --output=name) 9000:9000 |
端口转发开启后,可以通过 http://127.0.0.1:9000/dashboard/ 来访问 Dashboard:

方法 2:自定义 IngressRoute CRD
另一种方法是通过定义和应用 IngressRoute CRD (kubectl apply -f dashboard.yaml):
1 | # dashboard.yaml |
部署成功后,可通过 http://traefik.example/dashboard/ 访问 Dashboard:

- 参考文献:traefik-helm-chart:https://github.com/traefik/traefik-helm-chart/
- 了解更多 Traefik Dashboard 配置:https://doc.traefik.io/traefik/operations/dashboard/
测试样例
配置好一个 ingress.yaml:
1 | apiVersion: networking.k8s.io/v1 |
进行测试,而且在 Traefik Dashboard 上也可以看到配置好的 frontend 和 backend(见上面的图):

更多配置参考
Ingress 的 pathType 类型
- ImplementationSpecific(默认):对于这种类型,匹配取决于 IngressClass。具体实现可以将其作为单独的
pathType处理或者与Prefix或Exact类型作相同处理。 - Exact:精确匹配 URL 路径,且对大小写敏感。
- Prefix:基于以
/分隔的 URL 路径前缀匹配。匹配对大小写敏感,并且对路径中的元素逐个完成。路径元素指的是由/分隔符分隔的路径中的标签列表。如果每个 p 都是请求路径 p 的元素前缀,则请求与路径 p 匹配。
K3s 卸载 Traefik
删除 Traefik
删除 Traefik 资源:
1 | kubectl -n kube-system delete helmcharts.helm.cattle.io traefik |
修改 k3s.service 配置文件/禁用 Traefik
停止 K3s 服务:
1 | systemctl stop k3s |
编辑服务文件 vim /etc/systemd/system/k3s.service 并将此行添加到 ExecStart:
1 | --disable traefik \ |
重新加载服务文件:
1 | systemctl daemon-reload |
从自动部署文件夹中删除清单文件:
1 | rm /var/lib/rancher/k3s/server/manifests/traefik.yaml |
启动 K3s 服务:
1 | systemctl restart k3s |