部署与发布策略 蓝绿发布

本文介绍了蓝绿部署策略,通过部署两个独立的生产环境,实现快速升级、回退和最小停机时间。同时讨论了其资源占用和潜在问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

蓝绿发布其实就是一个蓝环境和一个绿环境同时运行,但是同时只有一个对外提供服务其实也就是启动了两个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]# 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   <none>           <none>
nginxapp-1.20-green-5668c79ff7-fckpc   1/1     Running   0          5m28s   10.233.96.184   node2   <none>           <none>
nginxapp-1.20-green-5668c79ff7-vmvq9   1/1     Running   0          5m28s   10.233.90.170   node1   <none>           <none>


[root@master devops]# kubectl get svc -n devops
NAME       TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
nginxapp   ClusterIP   10.233.34.137   <none>        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   <none>   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 (<error: endpoints "default-http-backend" not found>)
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:           <none>
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

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


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

#use the latest LTS (long term support) version 12 of node available from the Docker Hub
#FROM node:12
# Create app directory
#WORKDIR /usr/src/app
# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@6+)
#COPY package*.json ./
#RUN npm install
# If you are building your code for production
# RUN npm ci --only=production
# Bundle app source
#COPY . .
#EXPOSE 8080
#CMD npm run serve 
#CMD ['http-server'] ['dist']
#CMD ["node","server.js"]
FROM nginx
COPY ./dist /usr/share/nginx/html/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]


-----------------------------------------
构建日志
[2022/10/17 15:28:14.303]   6bfb411.css
[2022/10/17 15:28:14.303]   dist/css/identity-modal.b2a321ee.css      0.12 KiB         0.12 KiB
[2022/10/17 15:28:14.303]   dist/css/JSON-schema-form.76bfb411.css    0.11 KiB         0.13 KiB
[2022/10/17 15:28:14.303]   dist/css/chat-components-map.972b3bc5.    0.11 KiB         0.13 KiB
[2022/10/17 15:28:14.303]   css
[2022/10/17 15:28:14.303]   dist/css/internal-link.19ef152d.css       0.10 KiB         0.12 KiB
[2022/10/17 15:28:14.303]   dist/css/button-styles-setButtonColor-    0.00 KiB         0.02 KiB
[2022/10/17 15:28:14.303]   less.2947857b.css

部署新版本的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
  selector:
    matchLabels:
      k8s-app: nginxnpm
      version: "1"
  template:
    metadata:
      labels:
        k8s-app: nginxnpm
        version: "1"
    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   <none>        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   <none>   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 (<error: endpoints "default-http-backend" not found>)
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:           <none>
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值