apiVersion: traefik.containo.us/v1alpha1kind: Middlewaremetadata:name: redirect-httpsspec:redirectScheme:scheme: https然后将这个中间件附加到 http 的服务上面去,因为 https 的不需要跳转:
---apiVersion: traefik.containo.us/v1alpha1kind: IngressRoutemetadata:name: ingressroutetls-httpspec:entryPoints:- webroutes:- match: Host(`who.qikqiak.com`) && PathPrefix(`/tls`)kind: Ruleservices:- name: whoamiport: 80middlewares:- name: redirect-https这个时候我们再去访问 http 服务可以发现就会自动跳转到 https 去了 。关于更多中间件的用法可以查看文档 Traefik Docs 。
灰度发布Traefik2.0 的一个更强大的功能就是灰度发布,灰度发布我们有时候也会称为金丝雀发布(Canary),主要就是让一部分测试的服务也参与到线上去,经过测试观察看是否符号上线要求 。

文章插图
canary deployment
比如现在我们有两个名为 appv1 和 appv2 的服务,我们希望通过 Traefik 来控制我们的流量,将 3⁄4 的流量路由到 appv1,1/4 的流量路由到 appv2 去,这个时候就可以利用 Traefik2.0 中提供的带权重的轮询(WRR)来实现该功能,首先在 Kubernetes 集群中部署上面的两个服务 。为了对比结果我们这里提供的两个服务一个是 whoami,一个是 Nginx,方便测试 。
appv1 服务的资源清单如下所示:(appv1.yaml)
apiVersion: apps/v1kind: Deploymentmetadata:name: appv1spec:selector:matchLabels:app: appv1template:metadata:labels:use: testapp: appv1spec:containers:- name: whoamiimage: containous/whoamiports:- containerPort: 80name: portv1---apiVersion: v1kind: Servicemetadata:name: appv1spec:selector:app: appv1ports:- name: httpport: 80targetPort: portv1appv2 服务的资源清单如下所示:(appv2.yaml)apiVersion: apps/v1kind: Deploymentmetadata:name: appv2spec:selector:matchLabels:app: appv2template:metadata:labels:use: testapp: appv2spec:containers:- name: nginximage: nginxports:- containerPort: 80name: portv2---apiVersion: v1kind: Servicemetadata:name: appv2spec:selector:app: appv2ports:- name: httpport: 80targetPort: portv2直接创建上面两个服务:$ kubectl apply -f appv1.yaml$ kubectl apply -f appv2.yaml# 通过下面的命令可以查看服务是否运行成功$ kubectl get pods -l use=testNAMEREADYSTATUSRESTARTSAGEappv1-58f856c665-shm9j1/1Running012sappv2-ff5db55cf-qjtrf1/1Running012s在 Traefik2.1 中新增了一个 TraefikService 的 CRD 资源,我们可以直接利用这个对象来配置 WRR,之前的版本需要通过 File Provider,比较麻烦,新建一个描述 WRR 的资源清单:(wrr.yaml)apiVersion: traefik.containo.us/v1alpha1kind: TraefikServicemetadata:name: app-wrrspec:weighted:services:- name: appv1weight: 3# 定义权重port: 80kind: Service# 可选,默认就是 Service- name: appv2weight: 1port: 80然后为我们的灰度发布的服务创建一个 IngressRoute 资源对象:(ingressroute.yaml)apiVersion: traefik.containo.us/v1alpha1kind: IngressRoutemetadata:name: wrringressroutenamespace: defaultspec:entryPoints:- webroutes:- match: Host(`wrr.qikqiak.com`)kind: Ruleservices:- name: app-wrrkind: TraefikService不过需要注意的是现在我们配置的 Service 不再是直接的 Kubernetes 对象了,而是上面我们定义的 TraefikService 对象,直接创建上面的两个资源对象,这个时候我们对域名 wrr.qikqiak.com 做上解析,去浏览器中连续访问 4 次,我们可以观察到 appv1 这应用会收到 3 次请求,而 appv2 这个应用只收到 1 次请求,符合上面我们的 3:1 的权重配置 。
文章插图
traefik wrr demo
流量复制除了灰度发布之外,Traefik 2.0 还引入了流量镜像服务,是一种可以将流入流量复制并同时将其发送给其他服务的方法,镜像服务可以获得给定百分比的请求同时也会忽略这部分请求的响应 。

文章插图
traefik mirror
同样的在 2.0 中只能通过 FileProvider 进行配置,在 2.1 版本中我们已经可以通过 TraefikService 资源对象来进行配置了,现在我们部署两个 whoami 的服务,资源清单文件如下所示:
apiVersion: v1kind: Servicemetadata:name: v1spec:ports:- protocol: TCPname: webport: 80selector:app: v1---kind: DeploymentapiVersion: apps/v1metadata:name: v1labels:app: v1spec:selector:matchLabels:app: v1template:metadata:labels:app: v1spec:containers:- name: v1image: nginxports:- name: webcontainerPort: 80---apiVersion: v1kind: Servicemetadata:name: v2spec:ports:- protocol: TCPname: webport: 80selector:app: v2---kind: DeploymentapiVersion: apps/v1metadata:name: v2labels:app: v2spec:selector:matchLabels:app: v2template:metadata:labels:app: v2spec:containers:- name: v2image: nginxports:- name: webcontainerPort: 80
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 5分钟!彻底搞懂MyBatis插件+PageHelper原理
- 彻底搞懂 Netty 线程模型
- 一文读懂 Java操作Elasticsearch
- 一文讲透FTP和SFTP的区别
- 一文搞懂分类算法中常用的评估指标
- 一文了解高并发限流算法
- 一文领略 HTTP 的前世今生
- 看了两天HashMap源码,终于把红黑树插入平衡规则搞懂了
- 一文学懂递归和动态规划
- 一文读懂阿里云之VPC概念及实战
