kubernetes金丝雀灰度发布

介绍

灰度发布(又名金丝雀发布),kubernets 中经常用到,发布先版本之前,先更新一部分,新旧版本共同,运行一段时间,看看效果,发现问题,及时处理,不至于服务不可用,新版本稳定后,逐步替换,平滑过渡

原理

kubernetes 中灰度发布通过负载均衡网络实现。服务的负载均衡依赖于服务的标签,新发布的服务既包含新的标签标识新的服务又包含之前版本标签(旧标签),旧标签被用于负载均衡网络发现。新版本服务运行稳定后,进行扩容,旧版本缩容,实现了灰度发布。

金丝雀灰度发布实现

  • 部署nginx

    nginx-old.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment-old 	#部署一个名称为:nginx-deployment-old  nginx服务
      labels:
        app: nginx  #服务的标签名,用于负载均衡网络
    spec:
      replicas: 3	#副本为3
      selector:
        matchLabels:
          app: nginx	
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:1.7.9
    ---
    apiVersion: v1
    kind: Service   
    metadata:
      name: nginx-service  #部署一个nginx-sevice 负载均衡网络
      labels:
        app: nginx
    spec:
      selector:
        app: nginx  # 选择标签为 ngix 的pod 加入负载均衡网络
      ports:
      - name: nginx-port
        protocol: TCP
        port: 80
        nodePort: 32600  # 外部访问端口
        targetPort: 80 	#内部服务默认端口,即外部通过 32600 端口访问,负载均衡网络直接访问nginx的80端口
      type: NodePort  # 随机暴露端口
    

    标签为 app: nginx 服务自动加入到负载均衡网络

    • 查看

      #查看服务和pod
      [root@guanzc-130 kubernetes]# kubectl get pod, service 
      # 查看部署服务ip
      [root@guanzc-130 kubernetes]# kubectl get service -o wide
      NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE    SELECTOR
      kubernetes      ClusterIP   10.96.0.1       <none>        443/TCP        3d2h   <none>
      nginx-service   NodePort    10.96.247.178   <none>        80:32600/TCP   5m1s   app=nginx
      

通过192.168.1.130
在这里插入图片描述

  • 灰度发布

    把nginx 版本由1.7 升级到1.8 , 通过文件部署,创建一个 nginx-canary.yaml文件

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment-canary
      labels:
        app: nginx  #版本的标签名称:
        track: canary
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
          track: canary
      template:
        metadata:
          labels:
            app: nginx
            track: canary
        spec:
          volumes:
          - emptyDir: {}
            name: ourfile
          containers:
          - name: nginx
            image: nginx:1.18.0
            volumeMounts:
              - mountPath: /usr/share/nginx/html
                name: ourfile
          initContainers:
            - image: alpine
              name: initc-1
              command: ["/bin/sh","-c","echo '<h1>canary page</h1>' > /html/index.html"]
              volumeMounts:
                - name: ourfile
                  mountPath: /html
    
  • 执行部署

    kubectl apply -f nginx-canary.yaml 
    

部署完成后,继续访问:192.168.1.130:32600 出现 canary page 说明,新的版本发布成功

  • 网络环境
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2tS3HSW1-1596204630508)(C:\Users\qinxiaoran\AppData\Roaming\Typora\typora-user-images\image-20200728212346604.png)]

新旧版本共存,访问server 网络,随机分配。新的服务有两种标签,app:nginx, track:canary, server 网络通过app:nginx 自动识别新版本服务。

运行一段时间,新的服务正常,可以逐步切换到新版本,新扩容新版为3个副本,全部启动后,在停用旧版本,防止服务不可用

  • 新版本扩容,旧版本缩容
# 扩容
kubectl scale --replicas=3 nginx-deployment-canary  
# 查看状态,成功后可删除旧版本 
kubectl get pod 
# 删除旧版本
kubectl delete deploy  nginx-deployment-old 

再次访问: 192.168.1.130:32600 全部新版本

总结

到此新旧版本共同,到逐步替换,实现了滚动升级

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值