使用DNS权重轮询实现业务流量灰度切换

2021-04-23  本文已影响0人  行者深蓝

DNS设置

  1. 首先将DNS解析服务升级为支持权重轮询的版本

image
  1. 添加多条DNS解析A记录

image
  1. 开启权重配置

image
  1. 设置DNS权重值

image

流量切换

  1. 业务域名-> A记录 -> Old-LB 权重 90%

A记录 -> NEW-LB 权重 10%

中间逐渐调整OLD-LB,NEW-LB流量比例,直到流量全部切到Ucloud-LB

  1. 业务域名-> A记录 -> OLD-LB 权重 0%

A记录 -> NEW-LB 权重 100%

  1. 最后确认业务域名返回解析记录的全部是NEW-LB IP后,去掉OLD-LB解析记录,完成全部DNS流量切换,如果考虑客户端所在网络DNS缓存时间长短不同的问题,可以保持OLD-LB在继续提供24小时,然后再彻底下线服务

切量失败回滚方案

极端情况,如果在灰度切的部分DNS流量有问题,可以参考如下备选方案

  1. 调整权重,设置 OLD-LB 权重 100% NEW-LB 0%
  2. 启用备用代理, NEW-LB -> nginx转发 -> OLD-LB 把客户端网络缓存部分的请求转发回原有服务

完整验证过程

  1. k8s集群中,创建nginx服务,参考如下:

kubectl create ns nginx-1

cat > default.conf << EOF
server {

    listen 80 default_server;
    server_name _;
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm; 
    }
}
EOF
kubectl create ns nginx-1
kubectl delete configmap nginx-configmap -n nginx-1
kubectl create configmap nginx-configmap --from-file=default.conf -n nginx-1

cat > nginx-deploy-svc.yaml << EOF
apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: nginx-1
  labels:
    app: nginx
spec:
  type: LoadBalancer
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
    name: http
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: nginx-1 
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      volumes:
      - name: configmap-volume
        configMap:
          name: nginx-configmap 
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: /etc/nginx/conf.d
          name: configmap-volume
EOF
kubectl apply -f nginx-deploy-svc.yaml  

  1. 查看svc ip

kubectl get svc -n nginx-1

kubectl get svc -n nginx-2

[root@10-8-57-25 ~]# kubectl  get svc -n nginx-1
NAME    TYPE           CLUSTER-IP       EXTERNAL-IP      PORT(S)        AGE
nginx   LoadBalancer   172.17.191.190   152.32.239.127   80:34829/TCP   16m
[root@10-8-57-25 ~]# kubectl  get svc -n nginx-2
NAME    TYPE           CLUSTER-IP       EXTERNAL-IP      PORT(S)        AGE
nginx   LoadBalancer   172.17.143.215   101.36.127.247   80:44440/TCP   9m41s

  1. 设置DNS解析记录

image image
  1. 配置APM监测和日志分析

观测流量调度和服务可用性

2021年4月20日 5:25 第一次配置权重 9:1

image image image

2021年4月21日 8:45 调整权重 9:1

image image image

2021年4月21日 3:39 调整权重 0:100

image image image

结论

在测试环境,通过DNS配置A记录权重调整,请求流量从LB 101.36.127.247 平滑切换到 152.32.239.127,在听云平台开启任务监测 全国85个地区,模拟客户端访问业务域名, 平均可用性可达99.98,每次调整权重,可用性未出现波动

上一篇 下一篇

猜你喜欢

热点阅读