Kubernetes(k8s)蓝绿发布

半兽人 发表于: 2020-07-14   最后更新时间: 2021-09-09 09:51:59  
{{totalSubscript}} 订阅, 3,820 游览

蓝绿部署:

一些应用程序只需要部署一个新版本,并需要立即切到这个版本。因此,我们需要执行蓝/绿部署。在进行蓝/绿部署时,应用程序的一个新副本(绿)将与现有版本(蓝)一起部署。然后更新应用程序的入口/路由器以切换到新版本(绿)。然后,您需要等待旧(蓝)版本来完成所有发送给它的请求,但是大多数情况下,应用程序的流量将一次更改为新版本;Kubernetes不支持内置的蓝/绿部署。目前最好的方式是创建新的部署,然后更新应用程序的服务(如service)以指向新的部署;蓝绿部署是不停老版本,部署新版本然后进行测试,确认OK后将流量逐步切到新版本。蓝绿部署无需停机,并且风险较小。

发布的各种策略详细介绍参考:蓝绿、ABTest、滚动部署、灰度发布、金丝雀发布介绍

实战

lan.yaml配置文件内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-v1
  namespace: blue-green
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
      version: v1
  template:
    metadata:
     labels:
      app: myapp
      version: v1
    spec:
       containers:
       - name: myapp
         image: janakiramm/myapp:v1
         imagePullPolicy: IfNotPresent
         ports:
         - containerPort: 80

lv.yaml配置文件内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-v2
  namespace: blue-green
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
      version: v2
  template:
    metadata:
     labels:
       app: myapp
       version: v2
    spec:
      containers:
      - name: myapp
        image: janakiramm/myapp:v2
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80

service_lanlv.yaml 配置文件内容如下:

apiVersion: v1
kind: Service
metadata:
  name: myapp-lan
  namespace: blue-green
  labels:
     app: myapp
     version: v1
spec:
   type: NodePort
   ports:
   - port: 80
     nodePort: 30062
     name: http
   selector:
     app: myapp
     version: v1

当前指向版本v1(也就是蓝)

创建

kubectl apply -f lan.yaml
kubectl apply -f lv.yaml
kubectl get pods -n blue-green

显示如下:

上面可以看到有两个pod,一个是myapp-v1这个是蓝程序(升级之前的程序),一个是myapp-v2这个是绿程序(升级之后的程序),蓝绿程序一起运行

kubectl apply -f service_lanlv.yaml

kubectl get svc -n blue-green

在浏览器访问http://<k8s集群任何一个节点ip>:port,显示如下:

我是版本v1,蓝色哦..

修改service_lanlv.yaml配置文件,修改标签,让其指向到绿程序(升级之后的程序)

service_lv.yaml文件内容如下:

apiVersion: v1
kind: Service
metadata:
  name: myapp-lan
  namespace: blue-green
  labels:
     app: myapp
     version: v2
spec:
   type: NodePort
   ports:
   - port: 80
     nodePort: 30062
     name: http
   selector:
     app: myapp
     version: v2
kubectl apply -f service_lv.yaml

在浏览器访问http://<k8s集群任何一个节点ip>:port

显示如下:

我是版本v2,绿色哦..
更新于 2021-09-09

查看kubernetes更多相关的文章或提一个关于kubernetes的问题,也可以与我们一起分享文章