zoukankan      html  css  js  c++  java
  • 附032.Kubernetes实现蓝绿发布

    蓝绿发布原理

    蓝绿发布本质上是希望能优雅无误的迭代应用,以便于使应用平稳提供服务。通常是不停老版本的同时对新版本进行先发布,然后确认无误后进行流量切换,即并行部署。
    Kubernetes中可以通过deployment来部署一个蓝发布,然后通过控制service,来决定使用的版本。即通过label selector 将流量转发至对应的版本。

    蓝绿发布实践

    构建环境

    基础Kubernetes环境

    需要部署一个处于健壮状态的Kubernetes,部署Kubernetes可参考
    附034.Kubernetes_v1.21.0高可用部署架构二

    准备测试文件

    root@master01:~/mystudy# mkdir -p /data/nginx/blue
    root@master01:~/mystudy# mkdir -p /data/nginx/green
    
    root@master01:~/mystudy# echo myblue > /data/nginx/blue/index.html
    root@master01:~/mystudy# echo mygreen > /data/nginx/green/index.html
    

    部署蓝应用

    创建Kubernetes deployment

    root@master01:~/mystudy# vim mybluedp.yaml
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-blue-dp
      labels:
        dp: nginx-blue-dp
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx-blue
      template:
        metadata:
          labels:
            app: nginx-blue
        spec:
          containers:
          - name: nginx
            image: nginx:latest
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 80
            volumeMounts:
            - mountPath: /usr/share/nginx/html/index.html
              name: nginx-pv-tpl
              readOnly: True
    
          volumes: 
          - name: nginx-pv-tpl
            hostPath: 
              path: /data/nginx/blue/index.html
              type: File
    root@master01:~/mystudy# kubectl apply -f mybluedp.yaml
    

    Kubernetes暴露蓝应用

    root@master01:~/mystudy# vim mysvc.yaml
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-svc
      labels:
        svc: nginx-svc
    spec:
      type: NodePort
      ports:
      - port: 80
        name: nginx-svc
        protocol: TCP
        targetPort: 80
        nodePort: 80
      selector:
        app: nginx-blue
    root@master01:~/mystudy# kubectl apply -f mysvc.yaml
    

    测试蓝应用

    [root@client ~]# curl -X GET http://172.16.10.31                #客户端测试
    myblue
    
    [root@client ~]# while true; do curl -X GET http://172.16.10.31 ; done
    

    部署绿应用

    创建Kubernetes deployment

    root@master01:~/mystudy# vim mygreendp.yaml   
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-green-dp
      labels:
        dp: nginx-green-dp
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx-green
      template:
        metadata:
          labels:
            app: nginx-green
        spec:
          containers:
          - name: nginx
            image: nginx:latest
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 80
            volumeMounts:
            - mountPath: /usr/share/nginx/html/index.html
              name: nginx-pv-tpl
              readOnly: True
    
          volumes: 
          - name: nginx-pv-tpl
            hostPath: 
              path: /data/nginx/green/index.html
              type: File
    root@master01:~/mystudy# kubectl apply -f mygreendp.yaml 
    

    蓝绿切换

    提示:部署绿应用后,若不进行流量切换,可保持蓝应用对外服务,同时观察绿应用是否部署运行正常。

    root@master01:~/mystudy# kubectl edit svc nginx-svc 
    ……
    apiVersion: v1
    kind: Service
    ……
    spec: 
    ……
      selector:
        app: nginx-green 
    ……
    

    提示:通过selector的标签,将svc流量引向绿应用。

    测试绿应用

    [root@client ~]# curl -X GET http://172.16.10.31                      
    mygreen
    [root@client ~]# watch curl -X GET http://172.16.10.31
    

    001

    总结

    在进行蓝绿发布的过程中,对外服务一直处于可用状态,绿版本部署成功之后,所有请求还是蓝应用,当流量切换后,立刻迭代至绿版本,若需要回滚只需要将流量切回蓝应用即可。
    通常建议对外成功发布绿应用后,蓝应用保持并行一段时间,然后根据业务情况进行释放。
    同时,如上手动操作,可融合进相关开源devops项目中,从而实现自动化,也可使用相关厂商现有产品,若阿里云云效、开源的CODING等。

    作者:木二

    出处:http://www.cnblogs.com/itzgr/

    关于作者:云计算、虚拟化,Linux,多多交流!

    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接!如有其他问题,可邮件(xhy@itzgr.com)咨询。

  • 相关阅读:
    8种CSS清除浮动的方法优缺点分析
    link和@import的区别
    删除表及删除表中数据的方法
    【HTML5】---【HTML5提供的一些新的标签用法以及和HTML 4的区别】
    【HTML】---HTML语义化
    【HTML5】页面点击按钮添加一行 删除一行 全选 反选 全不选
    第四篇:python 高级之面向对象初级
    第三篇:python高级之生成器&迭代器
    第二篇:python高级之装饰器
    第一篇:python高级之函数
  • 原文地址:https://www.cnblogs.com/itzgr/p/14602827.html
Copyright © 2011-2022 走看看