traefik初探——灰度发布

半日闲 2020年11月17日 29次浏览

前言

安装部署好kubernetes集群和traefik即可

在运维的日常工作中,最少不了的就是灰度发布了,灰度发布有很多其他的名称,例如A/B测试,蓝绿发布,金丝雀发布等,总之都是1个意思,以下摘选自百度百科

灰度发布(又名金丝雀发布)是指在黑与白之间,能够平滑过渡的一种发布方式。在其上可以进行A/B testing,即让一部分用户继续用产品特性A,一部分用户开始用产品特性B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度。

对于traefik来讲,灰度发布的话,可以基于很多的匹配规则,如headersmethodhostpath或者query

,其所有的匹配器如下

image-20201117195602239

下文中,我们使用的是针对于权重的轮询方式,即按照一定的比例将流量分发给不同版本的2个后端服务,高级的方法,后续blog中再继续更新

灰度发布

部署2个版本的busyboxdeploy

busyboxdeployyaml如下

[root@a file-yaml]$ cat busybox-httpd-deploy-v1-v2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: busybox-httpd
    version: v1
  name: busybox-httpd-v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: busybox-httpd
      version: v1
  template:
    metadata:
      annotations:
        sidecar.istio.io/inject: "false"
      labels:
        app: busybox-httpd
        version: v1
    spec:
      containers:
      - image: registry.cn-hangzhou.aliyuncs.com/wenlong/busyboxhttpd:v1
        imagePullPolicy: Always
        name: busybox-httpd
        ports:
        - name: v1
          containerPort: 80
      imagePullSecrets:
      - name: regcred

---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: busybox-httpd
    version: v2
  name: busybox-httpd-v2
spec:
  replicas: 1
  selector:
    matchLabels:
      app: busybox-httpd
      version: v2
  template:
    metadata:
      annotations:
        sidecar.istio.io/inject: "false"
      labels:
        app: busybox-httpd
        version: v2
    spec:
      containers:
      - image: registry.cn-hangzhou.aliyuncs.com/wenlong/busyboxhttpd:v2
        imagePullPolicy: Always
        name: busybox-httpd
        ports:
        - name: v2
          containerPort: 80
      imagePullSecrets:
      - name: regcred

使用kubectl apply -f busybox-httpd-deploy-v1-v2.yaml即可

创建如下

image-20201116204922716

可以看到2个版本的pod均运行正常,且curl对应podip也都显示正常对应的版本号

部署对应2个版本的svc

svc对应的yaml文件如下

[root@a file-yaml]$ cat busybox-httpd-svc-v1-v2.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    app: busybox-httpd
    version: v1
  name: busybox-httpd-v1
spec:
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: busybox-httpd
    version: v1
  type: ClusterIP

---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: busybox-httpd
    version: v2
  name: busybox-httpd-v2
spec:
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: busybox-httpd
    version: v2
  type: ClusterIP

使用kubectl apply -f busybox-httpd-svc-v1-v2.yaml即可

创建后如下

image-20201116205136027

可以看到访问对应的svc可以显示正确的版本号

自定义权重创建ingressroute

ingressrouteyaml文件如下

[root@a file-yaml]$ cat busybox-httpd-ingressroute-v1-v2.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: busybox-httpd-ingressroute
  namespace: default
spec:
  entryPoints:
    - web
  routes:
  - match: Host(`httpd.a.b`) && PathPrefix(`/`)
    kind: Rule
    services:
    - name: busybox-httpd-v1
      port: 80
      weight: 2
    - name: busybox-httpd-v2
      port: 80
      weight: 8

上述的weight为指定权重,负载均衡方式为rr即轮询

本文中测试的是httpd,因此其中entrypoints字段为traefik监听的http端口名字

使用kubectl apply -f busybox-httpd-ingressroute-v1-v2.yaml创建即可

创建好后,可以查看到ingressroute如下

image-20201116205532135

验证

使用kubectl get svc | grep traefik查看traefik监听的nodeport后,访问即可

image-20201116205853966

可以看到总共19次访问中,其中4次显示v1,15次显示v2,2者占比基本满足yaml中定义的2:8的定义

至此灰度发布成功

关于我

工作:运维工程师
方向:目前专注于微服务,容器技术 以及Devops方面!
微信公众号(文章同步更新至公众号):
gongzhonghaopic