前言
上文介绍了如何使用 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
可以直接在控制台上, 通过应用 -> 部署 使用模板来部署应用.
创建完毕后, 就可以在控制台上看到对应的部署与服务.
现在我们可以通过本地 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, 这样就可以将对应的流量导入进来.
创建完毕后就可以在控制台上看到新的应用.
下面我们在执行一下 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, 所以在更新过程中, 会保证最小可服务的容器个数, 这个个数也可以在模板里面调整.
更新完毕后, 新老服务个数比为 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 金丝雀发布的流程.
来源: https://yq.aliyun.com/articles/582798