Kubernetes集群中使用阿里云 SLB 实现四层金丝雀发布

前言

上文介绍了如何使用Ingress实现蓝绿发布。但是对于很多只提供tcp/udp的服务来说,七层的ingress不能很好的实现蓝绿发布的需求。这里我们就来介绍一下如何使用 SLB 来进行四层的金丝雀发布。

准备

首先需要一个已经通过SLB对外提供服务的应用,这里我们还是继续使用nginx作为例子,不过这次是通过SLB对外暴露的服务。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    run: old-nginx
  name: old-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      run: old-nginx
  template:
    metadata:
      labels:
        run: old-nginx
        app: nginx
    spec:
      containers:
      - image: registry.cn-hangzhou.aliyuncs.com/xianlu/old-nginx
        imagePullPolicy: Always
        name: old-nginx
        ports:
        - containerPort: 80
          protocol: TCP
      restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
  labels:
    run: nginx
  name: nginx
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  sessionAffinity: None
  type: LoadBalancer

可以直接在控制台上,通过应用->部署 使用模板来部署应用。
Kubernetes集群中使用阿里云 SLB 实现四层金丝雀发布

创建完毕后,就可以在控制台上看到对应的部署与服务。
Kubernetes集群中使用阿里云 SLB 实现四层金丝雀发布

Kubernetes集群中使用阿里云 SLB 实现四层金丝雀发布
现在我们可以通过本地curl 来看一下部署的效果

  bash  for x in {1..10} ; do curl 118.178.33.45; done
old
old
old
old
old
old
old
old
old
old

可以看到已经正常访问。

新服务上线

下面我们模拟新的服务上线,现在创建新的应用。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    run: new-nginx
  name: new-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      run: new-nginx
  template:
    metadata:
      labels:
        run: new-nginx
        app: nginx
    spec:
      containers:
      - image: registry.cn-hangzhou.aliyuncs.com/xianlu/new-nginx
        imagePullPolicy: Always
        name: new-nginx
        ports:
        - containerPort: 80
          protocol: TCP
      restartPolicy: Always

值得注意的就是,新服务的pod的label,也是含有app:nginx标签的。这个标签就是为了对应的service找到该pod,这样就可以将对应的流量导入进来。
创建完毕后就可以在控制台上看到新的应用。
Kubernetes集群中使用阿里云 SLB 实现四层金丝雀发布

下面我们在执行一下curl 看一下效果。

  bash  for x in {1..10} ; do curl 118.178.33.45; done
old
new
new
new
old
new
old
old
old
new

可以看到,十次请求里面,有五次打到了老服务,五次打到了新服务。主要原因是,service对于流量请求是平均的负载均衡策略,而且新老服务均为一个pod,因此他们的流量百分比为1:1 。

调整流量权重

这里的权重调整就没有ingress的那么直接。需要调整后端的pod容器数量来调整对应的权重。比如我们这里希望新的服务权重更大一些,那么想调整新的pod数量到3个。

可以直接在控制台上更新已有的应用。注意: Kubernetes的Deployment资源默认的更新方式就是rollingUpdate,所以在更新过程中,会保证最小可服务的容器个数,这个个数也可以在模板里面调整。

Kubernetes集群中使用阿里云 SLB 实现四层金丝雀发布
更新完毕后,新老服务个数比为3:1, 下面我们再来curl一下,看一下效果。

  bash  for x in {1..10} ; do curl 118.178.33.45; done
new
new
new
new
new
old
old
new
new
new

可以看到,10个请求里面,有8个请求到新的服务,2个到老的服务。后面就可以通过动态的调整pod的数量来调整新老服务的权重,实现金丝雀发布。

完成

发布完毕后,将对应的旧应用删除即可。删除完毕后,看一下curl的效果

  bash  for x in {1..10} ; do curl 118.178.33.45; done
new
new
new
new
new
new
new
new
new
new

这样就实现了四层 SLB 金丝雀发布的流程。

上一篇:微信分享操作JSSDK


下一篇:58、微信-我-我的二维码MyCodeActivity