蓝绿部署

蓝绿部署是一种比较常见的部署方式,经常会用于新旧版本不兼容的情况。

  1. 先将新版本(绿版)的服务运行起来。
  2. 将所有的流量切到新版本的服务上
  3. 删除旧版本(蓝版)的服务

创建新版本的ReplicaSet,将Service指向新的Pods,删除旧版本的ReplicaSet

滚动升级

蓝绿部署可以有效保证业务的正确性,但是也带来了一定的风险,例如稳定性。

假设新部署的应用是有问题的,一旦切换之后就会导致业务的崩溃,造成损失。于是就有了稍微友好的升级方式,滚动升级。

  1. 先关闭一个旧版本的实例
  2. 开启一个新版本的实例用于替换旧版本
  3. 替换成功时候循环1和2,直到所有的实例升级完成。

在整个过程中,如果中途发现异常可以及时停手,及时止损。而且Kubernetes也在客户端中支持了这个特性。kubectl rolling-update。

  • 升级前后RC的Selector都被改变了
  • 操作都是在客户端执行的?

金丝雀发布

金丝雀发布是滚动发布的一种特例,在滚动发布中,是不会等待的,除非中间出错了。但是有些时候,我们并不想要全都升级,可能只是处于POC的一些原因,我们只希望部分实例是新的,大部分是旧的,而这种情形,我们就称之为金丝雀发布。

  1. 升级少部分实例
  2. 查看效果,如果好,全部升级
  3. 如果不好,则不升级

声明式升级

前面介绍的这些升级发布方式在K8s上很多时候是半手工方式执行的,而Kubernetes作为一款DevOPS友好的系统,已经内置了对于部署方式的一种资源抽象,这个资源就是:Deployment。

Deployment –> ReplicaSet –> Pods

Deployment 存在的意义为:在升级应用程序时,需要引入额外的ReplicaSet,并协调新旧两个RS,使他们再根据彼此不断修改,而不会造成干扰。Deployment将这些运维过程都代码化,内置为自己的逻辑,从而让升级变得简单。

首先我们使用Deployment创建3个实例

 1# deploy.yaml
 2---
 3apiVersion: apps/v1
 4kind: Deployment
 5metadata:
 6  name: first-deployment
 7  labels:
 8    app: simple-pod-deployment 
 9spec:
10  replicas: 3
11  selector:
12    matchLabels:
13      app: simple-pod-deployment
14  template:
15    metadata:
16      name: simple-pod-deployment
17      labels:
18        app: simple-pod-deployment
19    spec:
20      containers:
21        - name: simple-pod-de
22          image: lukelau/rest-docker:0.0.1 
23          ports:
24            - containerPort: 8080
25          args:
26            - -server.addr=0.0.0.0:8080

此时创建了3个Pod,接下来我们将修改下images的版本,重新apply -f

1#  image: lukelau/rest-docker:0.0.1 
2 image: lukelau/rest-docker:0.0.2

通过kubectl describe deployment first-deployment 可以看到整个升级的过程。

image-20210929131527913

可以使用record记录执行历史

1kubectl rollout history deployment first-deployment

image-20210929132406237

控制滚动升级速率

 1---
 2apiVersion: apps/v1
 3kind: Deployment
 4metadata:
 5  name: first-deployment
 6  labels:
 7    app: simple-pod-deployment 
 8spec:
 9  replicas: 3
10  minReadySeconds: 10
11  strategy:
12    type: RollingUpdate
13    rollingUpdate:
14      maxSurge: 1
15      maxUnavailable: 0
16  selector:
17    matchLabels:
18      app: simple-pod-deployment
19  template:
20    metadata:
21      name: simple-pod-deployment
22      labels:
23        app: simple-pod-deployment
24    spec:
25      containers:
26        - name: simple-pod-de
27          image: lukelau/rest-docker:0.0.2 
28          ports:
29            - containerPort: 8080
30          args:
31            - -server.addr=0.0.0.0:8080
1# 停止升级
2kubectl rollout pause deployment first-deployment
3# 恢复升级
4kubectl rollout resume deployment first-deployment
5# 取消升级
6kubectl rollout undo deployment first-deployment