栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

部署与发布策略 蓝绿发布

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

部署与发布策略 蓝绿发布

蓝绿发布其实就是一个蓝环境和一个绿环境同时运行,但是同时只有一个对外提供服务,其实也就是启动了两个deployment,service也是两个,最后ingress选择service的时候只需要选择其中一个就行了。如果蓝环境有问题了,那么就可以快速的回退到绿环境。

这种情况下就是占用的环境资源较大,完全两套资源。

蓝绿发布

蓝绿部署是指有两个完全相同的、互相独立的生产环境,一个叫做“蓝环境”,一个叫做“绿环境”。其中,绿环境是用户正在使用的生产环境。当要部署一个新版本的时候,先把这个新版本部署到蓝环境中,然后在蓝环境中运行冒烟测试,以检查新版本是否正常工作。如果测试通过,发布系统更新路由配置,将用户流量从绿环境导向蓝环境,蓝环境就变成了生产环境。这种切换通常在一秒钟之内就能搞定。

如果出了问题,把路由切回到绿环境上,再在蓝环境中调试,找到问题的原因。因此,蓝绿部署可以做到仅仅一次切换,立刻就向所有用户推出新版本,新功能对所有用户立刻生效可见。

优势:

  1. 升级切换和回退速度非常快

  2. 零停机时间

不足:

  1. 一次性的全量切换,如果发布出现问题, 会对用户产生比较大的影响

  2. 需要两倍的机器资源

  3. 需要中间件和应用自身支持热备集群的流量切换

适用场景:

  1. 机器资源比较富余或者按需分配 (背靠云厂商)

绿环境 现在生产环境
[root@master devops]# cat green.yaml 
kind: Deployment
apiVersion: apps/v1
metadata:
  labels:
    k8s-app: nginxapp
    version: "1.20"
  name: nginxapp-1.20-green
  namespace: devops
spec:
  replicas: 3
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      k8s-app: nginxapp
      version: "1.20"
  template:
    metadata:
      labels:
        k8s-app: nginxapp
        version: "1.20"
      namespace: default
      name: nginxapp
    spec:
      containers:
        - name: nginxapp
          image: nginx
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80
              name: web


[root@master devops]# cat green.yaml 
kind: Deployment
apiVersion: apps/v1
metadata:
  labels:
    k8s-app: nginxapp
    version: "1.20"
  name: nginxapp-1.20-green
  namespace: devops
spec:
  replicas: 3
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      k8s-app: nginxapp
      version: "1.20"
  template:
    metadata:
      labels:
        k8s-app: nginxapp
        version: "1.20"
      namespace: default
      name: nginxapp
    spec:
      containers:
        - name: nginxapp
          image: nginx
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80
              name: web
[root@master devops]# kubectl get pod -n devops -o wide
NAME                                   READY   STATUS    RESTARTS   AGE     IP              NODE    NOMINATED NODE   READINESS GATES
nginxapp-1.20-green-5668c79ff7-9l7kl   1/1     Running   0          5m28s   10.233.96.185   node2              
nginxapp-1.20-green-5668c79ff7-fckpc   1/1     Running   0          5m28s   10.233.96.184   node2              
nginxapp-1.20-green-5668c79ff7-vmvq9   1/1     Running   0          5m28s   10.233.90.170   node1              


[root@master devops]# kubectl get svc -n devops
NAME       TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
nginxapp   ClusterIP   10.233.34.137           80/TCP    10s

[root@master devops]# kubectl get ep -n devops
NAME       ENDPOINTS                                            AGE
nginxapp   10.233.90.170:80,10.233.96.184:80,10.233.96.185:80   17s
[root@master devops]# cat ingress.yaml 
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginxnpm-ingress
  namespace: devops
spec:
  rules:
  - host: nginxnpm.devops.com
    http:
      paths:
      - path: /
        backend:
          serviceName: nginxapp
          servicePort: 80


[root@master devops]# kubectl get ingress -n devops
Warning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
NAME               CLASS    HOSTS                 ADDRESS   PORTS   AGE
nginxnpm-ingress      nginxnpm.devops.com             80      19m



[root@master devops]# kubectl describe ingress nginxnpm-ingress -n devops
Warning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
Name:             nginxnpm-ingress
Namespace:        devops
Address:          
Default backend:  default-http-backend:80 ()
Rules:
  Host                 Path  Backends
  ----                 ----  --------
  nginxnpm.devops.com  
                       /   nginxapp:80 (10.233.90.170:80,10.233.96.184:80,10.233.96.185:80)
Annotations:           
Events:
  Type    Reason  Age   From                      Message
  ----    ------  ----  ----                      -------
  Normal  CREATE  20m   nginx-ingress-controller  Ingress devops/nginxnpm-ingress
  Normal  CREATE  20m   nginx-ingress-controller  Ingress devops/nginxnpm-ingress
  Normal  UPDATe  102s  nginx-ingress-controller  Ingress devops/nginxnpm-ingress
  Normal  UPDATE  102s  nginx-ingress-controller  Ingress devops/nginxnpm-ingress

蓝环境(假设就行了冒烟测试通过)

在蓝环境中运行冒烟测试,以检查新版本是否正常工作。如果测试通过,发布系统更新路由配置,将用户流量从绿环境导向蓝环境,蓝环境就变成了生产环境。这种切换通常在一秒钟之内就能搞定。 

部署新版本的deployment,然后修改service的label。 

[root@master devops]# cat blue.yaml 
kind: Deployment
apiVersion: apps/v1
metadata:
  labels:
    k8s-app: nginxnpm
    version: "1"
  name: nginx-npm-blue
  namespace: devops
spec:
  replicas: 3
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      k8s-app: nginxnpm
      version: "1"
  template:
    metadata:
      labels:
        k8s-app: nginxnpm
        version: "1"
      namespace: devops
      name: nginxapp
    spec:
      containers:
        - name: nginxapp
          image: 192.168.100.4:88/devops/npm:1
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80
              name: web



[root@master devops]# cat service-blue.yaml 
kind: Service
apiVersion: v1
metadata:
  name: nginxnpm
  namespace: devops
spec:
  ports:
    - name: web
      port: 80
      targetPort: 80
  selector:
    k8s-app: nginxnpm
    version: "1"

这里只需要修改一下servicenName就行了,为蓝环境的serviceName 

[root@master devops]# cat ingress.yaml 
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginxnpm-ingress
  namespace: devops
spec:
  rules:
  - host: nginxnpm.devops.com
    http:
      paths:
      - path: /
        backend:
          serviceName: nginxnpm
          servicePort: 80
[root@master devops]# kubectl get pod -n devops
NAME                              READY   STATUS    RESTARTS   AGE
nginx-npm-blue-6c5ddc9ffd-jl25q   1/1     Running   0          2m57s
nginx-npm-blue-6c5ddc9ffd-qx2kw   1/1     Running   0          2m57s
nginx-npm-blue-6c5ddc9ffd-vhtnx   1/1     Running   0          2m57s


[root@master devops]# kubectl get svc -n devops
NAME       TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
nginxnpm   ClusterIP   10.233.18.40           80/TCP    2m26s


[root@master devops]# kubectl get ep -n devops
NAME       ENDPOINTS                                            AGE
nginxnpm   10.233.90.167:80,10.233.90.168:80,10.233.96.179:80   2m30s


[root@master devops]# kubectl get ingress -n devops
Warning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
NAME               CLASS    HOSTS                 ADDRESS   PORTS   AGE
nginxnpm-ingress      nginxnpm.devops.com             80      2m38s


[root@master devops]# kubectl describe ingress nginxnpm-ingress -n devops
Warning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
Name:             nginxnpm-ingress
Namespace:        devops
Address:          
Default backend:  default-http-backend:80 ()
Rules:
  Host                 Path  Backends
  ----                 ----  --------
  nginxnpm.devops.com  
                       /   nginxnpm:80 (10.233.90.167:80,10.233.90.168:80,10.233.96.179:80)
Annotations:           
Events:
  Type    Reason  Age   From                      Message
  ----    ------  ----  ----                      -------
  Normal  CREATE  3m2s  nginx-ingress-controller  Ingress devops/nginxnpm-ingress
  Normal  CREATE  3m2s  nginx-ingress-controller  Ingress devops/nginxnpm-ingress

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/296512.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号