App 2.0开发模式的行业看法
807
2022-11-29
部署与发布策略 蓝绿发布
蓝绿发布其实就是一个蓝环境和一个绿环境同时运行,但是同时只有一个对外提供服务,其实也就是启动了两个deployment,service也是两个,最后ingress选择service的时候只需要选择其中一个就行了。如果蓝环境有问题了,那么就可以快速的回退到绿环境。
这种情况下就是占用的环境资源较大,完全两套资源。
蓝绿发布
蓝绿部署是指有两个完全相同的、互相独立的生产环境,一个叫做“蓝环境”,一个叫做“绿环境”。其中,绿环境是用户正在使用的生产环境。当要部署一个新版本的时候,先把这个新版本部署到蓝环境中,然后在蓝环境中运行冒烟测试,以检查新版本是否正常工作。如果测试通过,发布系统更新路由配置,将用户流量从绿环境导向蓝环境,蓝环境就变成了生产环境。这种切换通常在一秒钟之内就能搞定。
如果出了问题,把路由切回到绿环境上,再在蓝环境中调试,找到问题的原因。因此,蓝绿部署可以做到仅仅一次切换,立刻就向所有用户推出新版本,新功能对所有用户立刻生效可见。
优势:
升级切换和回退速度非常快零停机时间
不足:
一次性的全量切换,如果发布出现问题, 会对用户产生比较大的影响需要两倍的机器资源需要中间件和应用自身支持热备集群的流量切换
适用场景:
机器资源比较富余或者按需分配 (背靠云厂商)
绿环境 现在生产环境
[root@master devops]# cat green.yaml kind: DeploymentapiVersion: apps/v1metadata: labels: k8s-app: nginxapp version: "1.20" name: nginxapp-1.20-green namespace: devopsspec: 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 wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESnginxapp-1.20-green-5668c79ff7-9l7kl 1/1 Running 0 5m28s 10.233.96.185 node2
[root@master devops]# cat ingress.yaml apiVersion: extensions/v1beta1kind: Ingressmetadata: name: nginxnpm-ingress namespace: devopsspec: rules: - host: nginxnpm.devops.com paths: - path: / backend: serviceName: nginxapp servicePort: 80[root@master devops]# kubectl get ingress -n devopsWarning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 IngressNAME CLASS HOSTS ADDRESS PORTS AGEnginxnpm-ingress
蓝环境(假设就行了冒烟测试通过)
在蓝环境中运行冒烟测试,以检查新版本是否正常工作。如果测试通过,发布系统更新路由配置,将用户流量从绿环境导向蓝环境,蓝环境就变成了生产环境。这种切换通常在一秒钟之内就能搞定。
部署新版本的deployment,然后修改service的label。
[root@master devops]# cat blue.yaml kind: DeploymentapiVersion: apps/v1metadata: labels: k8s-app: nginxnpm version: "1" name: nginx-npm-blue namespace: devopsspec: 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: ServiceapiVersion: v1metadata: name: nginxnpm namespace: devopsspec: ports: - name: web port: 80 targetPort: 80 selector: k8s-app: nginxnpm version: "1"
这里只需要修改一下servicenName就行了,为蓝环境的serviceName
[root@master devops]# cat ingress.yaml apiVersion: extensions/v1beta1kind: Ingressmetadata: name: nginxnpm-ingress namespace: devopsspec: rules: - host: nginxnpm.devops.com paths: - path: / backend: serviceName: nginxnpm servicePort: 80
[root@master devops]# kubectl get pod -n devopsNAME READY STATUS RESTARTS AGEnginx-npm-blue-6c5ddc9ffd-jl25q 1/1 Running 0 2m57snginx-npm-blue-6c5ddc9ffd-qx2kw 1/1 Running 0 2m57snginx-npm-blue-6c5ddc9ffd-vhtnx 1/1 Running 0 2m57s[root@master devops]# kubectl get svc -n devopsNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEnginxnpm ClusterIP 10.233.18.40
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。