[TOC]
Traefik 是一个边缘路由器,是你整个平台的大门,拦截并路由每个传入的请求:它知道所有的逻辑和规则,这些规则确定哪些服务处理哪些请求;传统的反向代理需要一个配置文件,其中包含路由到你服务的所有可能路由,而 Traefik 会实时检测服务并自动更新路由规则,可以自动服务发现。
基本说明
首先,当启动 Traefik 时,需要定义 entrypoints
(入口点),然后,根据连接到这些 entrypoints 的路由来分析传入的请求,来查看他们是否与一组规则相匹配,如果匹配,则路由可能会将请求通过一系列中间件转换过后再转发到你的服务上去。在了解 Traefik 之前有几个核心概念我们必须要了解:
Providers
用来自动发现平台上的服务,可以是编排工具、容器引擎或者 key-value 存储等,比如 Docker、Kubernetes、FileEntrypoints
监听传入的流量(端口等…),是网络入口点,它们定义了接收请求的端口(HTTP 或者 TCP)。Routers
分析请求(host, path, headers, SSL, …),负责将传入请求连接到可以处理这些请求的服务上去。Services
将请求转发给你的应用(load balancing, …),负责配置如何获取最终将处理传入请求的实际服务。Middlewares
中间件,用来修改请求或者根据请求来做出一些判断(authentication, rate limiting, headers, …),中间件被附件到路由上,是一种在请求发送到你的服务之前(或者在服务的响应发送到客户端之前)调整请求的一种方法。
安装
我这里安装使用的镜像为traefik:v2.2.7
, kuberbetes
集群信息如下:
$ kubectl get nodes -owide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
dev-k8s-master Ready master 149m v1.18.0 192.168.160.243 <none> CentOS Linux 7 (Core) 4.4.228-2.el7.elrepo.x86_64 docker://19.3.12
dev-k8s-node Ready <none> 149m v1.18.0 192.168.160.244 <none> CentOS Linux 7 (Core) 4.4.228-2.el7.elrepo.x86_64 docker://19.3.9
安装 Traefik 到 Kubernetes 集群中的资源清单文件我这里提前准备好了,直接执行下面的安装命令即可: 主要是crd
,dashboard
, traefik deployment
, rbac
四个文件.
$ wget https://www.fenghong.tech/k8strain/traefik/all.yaml
$ kubectl apply -f all.yaml
我们这里是通过命令行参数来做的静态配置:
args:
- --entrypoints.web.address=:80
- --entrypoints.tcpep.address=:8000
- --entrypoints.udpep.address=:9000/udp
- --log.level=DEBUG
- --api
- --api.insecure
- --providers.kubernetescrd
- --providers.kubernetesingress
其中前三项配置是来定义 web
和 tcp
和upd
这入口点的,--api
开启,就会创建一个名为 api@internal
的特殊 service,在 dashboard
中可以直接使用这个 service 来访问,然后其他比较重要的就是开启 kubernetesingress
和 kubernetescrd
这两个 provider。这边我忽略了https的配置. 如果要配置ssl请参考其他文章.
部署完成后我们可以通过在本地 /etc/hosts
中添加上域名 traefik.domain.com
的映射即可访问 Traefik 的 Dashboard 页面了:
注: 这个是解析到 traefik正在运行的node节点ip
定义一个IngressRoute
对象: 只用把域名解析到 traefik正在运行的node节点ip即可.
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
namespace: default
name: web-hello-world
annotations:
traefik.ingress.kubernetes.io/router.entrypoints: web
spec:
routes:
- match: Host(`helloworld.fenghong.tech`)
kind: Rule
services:
- name: web-hello-world
port: 8000
一个helloword-deployment
完整示例
$ kubectl apply -f https://www.fenghong.tech/k8strain/traefik/test-helloworld.yaml
通过 entryPoints
指定了我们这个应用的入口点是 web
,也就是通过 80 端口访问,然后访问的规则就是要匹配 helloworld.fenghong.tech
这个域名,才会被 web-hello-world
这个 Service 所匹配。我们可以直接创建上面的几个资源对象,然后对域名做对应的解析后,就可以访问应用了: