简介

Traefik 是一个开源的可以使服务发布变得轻松有趣的边缘路由器。它负责接收你系统的请求,然后使用合适的组件来对这些请求进行处理。

除了众多的功能之外,Traefik 的与众不同之处还在于它会自动发现适合你服务的配置。当 Traefik 在检查你的服务时,会找到服务的相关信息并找到合适的服务来满足对应的请求。

Traefik 兼容所有主流的集群技术,比如 Kubernetes,Docker,Docker Swarm,AWS,Mesos,Marathon,等等;并且可以同时处理多种方式。(甚至可以用于在裸机上运行的比较旧的软件。)

使用 Traefik,不需要维护或者同步一个独立的配置文件:因为一切都会自动配置,实时操作的(无需重新启动,不会中断连接)。使用 Traefik,你可以花更多的时间在系统的开发和新功能上面,而不是在配置和维护工作状态上面花费大量时间。

核心概念

Traefik 是一个边缘路由器,是你整个平台的大门,拦截并路由每个传入的请求:它知道所有的逻辑和规则,这些规则确定哪些服务处理哪些请求;传统的反向代理需要一个配置文件,其中包含路由到你服务的所有可能路由,而 Traefik 会实时检测服务并自动更新路由规则,可以自动服务发现。

首先,当启动 Traefik 时,需要定义 entrypoints(入口点),然后,根据连接到这些 entrypoints 的路由来分析传入的请求,来查看他们是否与一组规则相匹配,如果匹配,则路由可能会将请求通过一系列中间件转换过后再转发到你的服务上去。在了解 Traefik 之前有几个核心概念我们必须要了解:

  • Providers 用来自动发现平台上的服务,可以是编排工具、容器引擎或者 key-value 存储等,比如 Docker、Kubernetes、File
  • Entrypoints 监听传入的流量(端口等…),是网络入口点,它们定义了接收请求的端口(HTTP 或者 TCP)。
  • Routers 分析请求(host, path, headers, SSL, …),负责将传入请求连接到可以处理这些请求的服务上去。
  • Services 将请求转发给你的应用(load balancing, …),负责配置如何获取最终将处理传入请求的实际服务。
  • Middlewares 中间件,用来修改请求或者根据请求来做出一些判断(authentication, rate limiting, headers, …),中间件被附件到路由上,是一种在请求发送到你的服务之前(或者在服务的响应发送到客户端之前)调整请求的一种方法。

安装

因为K3S自带了Traefik,这里默认执行/var/lib/rancher/k3s/server/manifests/traefik.yaml,所以我们无需再安装了。

对于其他helm拓展配置,我们需要创建一个新文件traefik-config.yaml,不能更改默认的traefik.yaml,因为这个文件会默认重置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
name: traefik
namespace: kube-system
spec:
valuesContent: |-
dashboard:
enabled: true
domain: "test-traefik.xxx.com"
kubernetes:
ingressEndpoint:
useDefaultPublishedService: true
tolerations:
- key: "CriticalAddonsOnly"
operator: "Exists"
- key: "node-role.kubernetes.io/master"
operator: "Exists"
effect: "NoSchedule"
logs:
access:
enabled: true

其中,tolerations用于容忍master节点创建traefik,根据实际情况选择填写。

创建后无需其他操作,K3S会自动执行一个helm job,使用kubectl get jobs -n kube-system 查看下Helm job是否触发

1
2
3
4
root@m3:/var/lib/rancher/k3s/server/manifests# kubectl get jobs -n kube-system
NAME COMPLETIONS DURATION AGE
helm-install-traefik 1/1 7s 13h
helm-install-traefik-crd 1/1 8s 92d

可以看到,已经执行完了,接下来看下Traefik是否正常创建,使用kubectl describe pods -n kube-system traefik-xxxxx

1
2
3
4
5
6
7
8
9
Containers:
traefik:
Container ID: docker://6f058c4329b788f51bbea5f6e8debf15217f8067647
Image: rancher/mirrored-library-traefik:2.9.10
Image ID: docker-pullable://rancher/mirrored-library-traefik@sha256:aaec134463b277ca7aa4f888fe724a
Ports: 9100/TCP, 9000/TCP, 8000/TCP, 8443/TCP
Host Ports: 0/TCP, 0/TCP, 0/TCP, 0/TCP
Args:
...

常用配置

访问面板

本机hosts绑定域名后访问http://test-traefik.xxx.com/dashboard就行了,不要将dashboard公开外网。

开启ws和wss

在你的ingress中配置traefik.ingress.kubernetes.io/service.passhostheader: "true"

1
2
3
4
5
6
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
traefik.ingress.kubernetes.io/service.passhostheader: 'true'
...

开启https

1
2
3
4
5
6
7
8
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: redirect-https
namespace: prod-app
spec:
redirectScheme:
scheme: https

在你的ingress中配置traefik.ingress.kubernetes.io/router.middlewares: prod-app-redirect-https@kubernetescrd

1
2
3
4
5
6
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
traefik.ingress.kubernetes.io/router.middlewares: prod-app-redirect-https@kubernetescrd
...

如果有多个Middleware,用逗号分割即可

Basic Auth

如果我想对某个网页开启用户名密码的简单验证,可以选择使用basic auth

1.生成密码

1
htpasswd -nb 用户名 密码 | openssl base64

此时你会得到一个base64的字符串

2.创建Middleware

1
2
3
4
5
6
7
8
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: basic-auth
namespace: kube-system
spec:
basicAuth:
secret: authsecret
  1. 创建Secert
    1
    2
    3
    4
    5
    6
    7
    8
    apiVersion: v1
    kind: Secret
    metadata:
    name: authsecret
    namespace: kube-system
    data:
    users: |2
    aHI5SEJCJDRIeHdnVWlyM0hQNEVzZ2dQL1FObzAK

其中,|2告诉解析器保留这些换行符和缩进,下方为用户名:密码的base64字符串

4.绑定Middleware

1
2
3
4
5
6
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
traefik.ingress.kubernetes.io/router.middlewares: kube-system-basic-auth@kubernetescrd
#...

5.可选

如果你想通过Header存储经过身份验证得用户

1
2
3
4
5
6
7
8
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: my-auth
spec:
basicAuth:
# ...
headerField: X-WebAuth-User

如果你想将请求转发到你的服务之前删除授权得 Header,默认为false

1
2
3
4
5
6
7
8
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: test-auth
spec:
basicAuth:
# ...
removeHeader: true

在traefik面板中,我们能看到相应配置