前言

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
2
3
4
5
6
7
8
9
10
11
12
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
domain: "traefik.localhost"
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
2
3
4
5
6
7
8
9
10
11
12
13
14
# dashboard.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: dashboard
spec:
entryPoints:
- web
routes:
- match: Host(`traefik.example`) && (PathPrefix(`/dashboard`) || PathPrefix(`/api`))
kind: Rule
services:
- name: api@internal
kind: TraefikService

部署成功后,可通过 http://traefik.example/dashboard/ 访问 Dashboard:

测试样例

配置好一个 ingress.yaml

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
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: traefik-test
# 声明命名空间
namespace: docker-demo
# 自定义注解(声明 ingress controller),traefik
annotations:
kubernetes.io/ingress.class: traefik
spec:
rules:
# 这里配置 frontend,访问的 host
- host: docker-demo.com
http:
paths:
# 配置 backend,使用定义好的 service,定义路径 "/" 必须配置,不配报错
- path: /
backend:
service:
# 映射到哪个 service 上
name: docker-demo
port:
# 这个 service 的内部端口号
number: 8080
pathType: Prefix
# 这里配置 frontend,访问的 host
- host: docker-demo2.com
http:
paths:
# 配置 backend,使用定义好的 service
- path: /
backend:
service:
# 映射到哪个 service 上
name: docker-demo2
port:
# 这个 service 的内部端口号
number: 8080
pathType: Prefix
# 这里配置 frontend,访问的 host
- host: docker-fronted.com
http:
paths:
# 配置 backend,使用定义好的 service
- path: /
backend:
service:
# 映射到哪个 service 上
name: docker-demo-frontend
port:
# 这个 service 的内部端口号
number: 80
pathType: Prefix

进行测试,而且在 Traefik Dashboard 上也可以看到配置好的 frontend 和 backend(见上面的图):

更多配置参考

Ingress 的 pathType 类型

  • ImplementationSpecific(默认):对于这种类型,匹配取决于 IngressClass。具体实现可以将其作为单独的 pathType 处理或者与 PrefixExact 类型作相同处理。
  • Exact:精确匹配 URL 路径,且对大小写敏感。
  • Prefix:基于以 / 分隔的 URL 路径前缀匹配。匹配对大小写敏感,并且对路径中的元素逐个完成。路径元素指的是由 / 分隔符分隔的路径中的标签列表。如果每个 p 都是请求路径 p 的元素前缀,则请求与路径 p 匹配。

K3s 卸载 Traefik

删除 Traefik

删除 Traefik 资源:

1
2
kubectl -n kube-system delete helmcharts.helm.cattle.io traefik
kubectl -n kube-system delete helmcharts.helm.cattle.io traefik-crd

修改 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