蓝绿发布其实就是一个蓝环境和一个绿环境同时运行,但是同时只有一个对外提供服务,其实也就是启动了两个deployment,service也是两个,最后ingress选择service的时候只需要选择其中一个就行了。如果蓝环境有问题了,那么就可以快速的回退到绿环境。
这种情况下就是占用的环境资源较大,完全两套资源。
蓝绿发布
蓝绿部署是指有两个完全相同的、互相独立的生产环境,一个叫做“蓝环境”,一个叫做“绿环境”。其中,绿环境是用户正在使用的生产环境。当要部署一个新版本的时候,先把这个新版本部署到蓝环境中,然后在蓝环境中运行冒烟测试,以检查新版本是否正常工作。如果测试通过,发布系统更新路由配置,将用户流量从绿环境导向蓝环境,蓝环境就变成了生产环境。这种切换通常在一秒钟之内就能搞定。
如果出了问题,把路由切回到绿环境上,再在蓝环境中调试,找到问题的原因。因此,蓝绿部署可以做到仅仅一次切换,立刻就向所有用户推出新版本,新功能对所有用户立刻生效可见。
优势:
-
升级切换和回退速度非常快
-
零停机时间
不足:
-
一次性的全量切换,如果发布出现问题, 会对用户产生比较大的影响
-
需要两倍的机器资源
-
需要中间件和应用自身支持热备集群的流量切换
适用场景:
-
机器资源比较富余或者按需分配 (背靠云厂商)
绿环境 现在生产环境
[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