简介
Traefik 是一款 open-source 边缘路由器,可让你轻松地发布服务. 它接收来自你的系统请求,并找出负责处理它们的后端服务组件。
traefik 与众不同在于它能够自动发现适合你服务的配置。 当 Traefik 检查你的基础设施时,它会发现相关信息,并发现哪个服务服务于哪个请求。
Traefik 支持多种集群技术,如 Kubernetes,Kubernetes, Docker, Docker Swarm, AWS, Mesos, Marathon,下面为支持列表 ; 并且可以同时处理多个 providers。(它甚至适用于在裸机上运行的传统软件。)
使用 Traefik,无需维护和同步配置文件:所有操作都会自动实时完成(无重启,不用中断服务)。 使用 Traefik,你只需花时间于系统开发和部署新功能,而不是配置和维护其工作状态。
Traefik 是一个边缘路由器,是整个平台的大门,拦截并路由每个传入的请求,当启动 Traefik 时,需要定义entrypoints ,然后,根据连接到这些 entrypoints 的routes路由来分析传入的请求,来查看他们是否与一组rules相匹配,如果匹配,则路由可能会将请求通过一系列middlewares转换过后再转发到你的services上去。
安装
这里用helm安装在kubernetes集群为例,首先你得有一个可用的kubernetes集群并且安装了helm,可参考我之前的文章harbor安装手记 kubeadm高可用集群部署。
获取helm chart包
git clone https://github.com/traefik/traefik-helm-chart
cd traefik-helm-chart
创建values配置文件
values.yaml
deployment:
enabled: true
kind: Deployment
ingressClass:
enabled: true
isDefaultClass: false
ingressRoute:
dashboard: # dashboard后面手动创建
enabled: false
# 配置 providers
providers:
kubernetesCRD: # 开启 crd provider
enabled: true
allowCrossNamespace: true # 是否允许跨命名空间
allowExternalNameServices: true # 是否允许使用ExternalName的服务
kubernetesIngress: # 开启ingress provider
enabled: true
allowExternalNameServices: true
logs:
general:
level: DEBUG
access:
enabled: true
ports:
web:
port: 8000
hostPort: 80 # 使用hostport模式
websecure:
port: 8443
hostPort: 443 # 使用hostport模式
metrics:
port: 9100
hostPort: 9101
service: # host 模式就不需要创建Service
enabled: false
resources:
requests:
cpu: "100m"
memory: "100Mi"
limits:
cpu: "100m"
memory: "100Mi"
nodeSelector: # 固定到node1这个边缘节点
kubernetes.io/hostname: "node1"
我们使用hostport模式将traefik固定到一台node节点作为流量入口,如果是内网环境则选择一台有外网权限的node节点进行固定即可。
安装指令
helm upgrade --install traefik ./traefik -f values.yaml --namespace kube-system
检查安装状态
helm list -n kube-system
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
traefik kube-system 1 2023-03-31 23:48:05.543829595 +0800 CST deployed traefik-22.0.0 v2.9.9
kubectl get pods -n kube-system|grep traefik
traefik-f68b94cd5-f2wck 1/1 Running 0 3d11h
安装后的traefik支持web(http)和websecure(https) 入口点,支持Ingress和IngressRoute 方式的crd,其中IngressRoute是traefik自己扩展的,这里用IngressRoute安装dashboard
安装dashboard
创建dashboard.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: traefik-dashboard
namespace: kube-system
spec:
entryPoints:
- web
routes:
- match: Host(`traefik.chenjie.info`) # 指定域名
kind: Rule
services:
- name: api@internal
kind: TraefikService # 引用另外的Traefik Service
如果需要https方式则dashboard.yaml为
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: traefik-dashboard
namespace: kube-system
spec:
entryPoints:
- websecure
routes:
- match: Host(`traefik.chenjie.info`) # 指定域名
kind: Rule
services:
- name: api@internal
kind: TraefikService # 引用另外的Traefik Service
tls:
secretName: chenjie-ssl
这里的secret需要自行根据私有证书或者权威证书签发信息进行生成, 以私有证书为例:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=traefik.chenjie.info"
kubectl create secret tls chenjie-ssl -n kube-system --cert=tls.crt --key=tls.key
因为dashboard本身不带登录认证,建议通过中间件进行验证限制,dashboard.yaml为
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: traefik-dashboard-basicauth #basic auth 中间件
namespace: kube-system
spec:
basicAuth:
secret: authsecret
---
apiVersion: v1
kind: Secret
metadata:
name: authsecret #basic auth 中间件Secret
namespace: kube-system
type: kubernetes.io/basic-auth
stringData:
username: admin
password: admin
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: traefik-dashboard
namespace: kube-system
spec:
entryPoints:
- websecure #https
routes:
- match: Host(`traefik.chenjie.info`) # 指定域名
kind: Rule
services:
- name: api@internal
kind: TraefikService # 引用另外的Traefik Service
middlewares:
- name: traefik-dashboard-basicauth #引用basic auth 中间件
tls:
secretName: chenjie-ssl
执行命令
kubectl apply -f dashboard.yaml
安装dashboard
kubectl get ingressroute -n kube-system
NAME AGE
traefik-dashboard 19m
部署后可通过 /etc/hosts 中添加上域名 traefik.chenjie.info的映射即可访问 Traefik 的 Dashboard 页面
博客案例
以我博客为例,设置chenjie.info 和www.chenjie.info 的http 和https 路由,并且强制跳转http请求到https上来。这里用到redirect的中间件,可参考下面blog.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: chenjieinfo-tls #https访问
namespace: wordpress
spec:
entryPoints:
- websecure
routes:
- match: Host(`chenjie.info`,`www.chenjie.info`)
kind: Rule
services:
- name: wordpress-deploy
port: 80
tls:
secretName: chenjie-ssl #tls
---
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: redirect-https
namespace: wordpress
spec:
redirectScheme: # 跳转中间件
scheme: https
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: chenjieinfo #http访问
namespace: wordpress
spec:
entryPoints:
- web
routes:
- match: Host(`chenjie.info`,`www.chenjie.info`)
kind: Rule
services:
- name: wordpress-deploy
port: 80
middlewares: #引用跳转中间件
- name: redirect-https
上面是一个参考例子,实际使用还需要一个可用的WordPress服务,并且需要预先创建好wordpress命名空间。然后执行
kubectl apply -f blog.yaml
创建路由,创建后可通过dashboard查看访问链路
http
https