Kubernetes实战之--Deployment升级和回滚

1 Deployment升级

1.1 现在环境中准备两个版本的nginx,并配置好yml文件

在这里插入图片描述
nginx-deployment.yml文件内容如下:

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80

1.2创建pod

kubectl create deployment-upgrade.yml

在这里插入图片描述
此时nginx的镜像版本的1.7.9,进行版本升级
在这里插入图片描述

1.3 升级Pod

kubectl set image deployment/nginx-deployment nginx=nginx:latest

在这里插入图片描述
我们可以使用kubectl describe deployments/nginx-deployment命令仔细观察Deployment的更新过程。初始创建Deployment时,系统创建了一个ReplicaSet(nginx-deployment-54f57cf6bf),并按用户的需求创建了3个Pod副本。当更新Deployment时,系统创建了一个新的ReplicaSet(nginx-deployment-786b576769),并将其副本数量扩展到1,然后将旧的ReplicaSet缩减为2。之后,系统继续按照相同的更新策略对新旧两个ReplicaSet进行逐个调整。最后,新的ReplicaSet运行了3个新版本Pod副本,旧的ReplicaSet副本数量则缩减为0
在这里插入图片描述
具体升级逻辑如下图所示:
在这里插入图片描述
在整个升级的过程中,系统会保证至少有两个Pod可用,并且最多同时运行4个Pod,这是Deployment通过复杂的算法完成的。Deployment需要确保在整个更新过程中只有一定数量的Pod可能处于不可用状态。在默认情况下,Deployment确保可用的Pod总数至少为所需的副本数量(DESIRED)减1,也就是最多1个不可用(maxUnavailable=1)。Deployment还需要确保在整个更新过程中Pod的总数量不会超过所需的副本数量太多。在默认情况下,Deployment确保Pod的总数最多比所需的Pod数多1个,也就是最多1个(maxSurge=1)。Kubernetes从1.6版本开始,maxUnavailable和maxSurge的默认值将从1、1更新为所需副本数量的25%、25%。这样,在升级过程中,Deployment就能够保证服务不中断,并且副本数量始终维持为用户指定的数量(DESIRED)。
在Deployment的定义中,可以通过spec.strategy指定Pod更新的策略,目前支持两种策略:Recreate(重建)和RollingUpdate(滚动更新),默认值为RollingUpdate。在前面的例子中使用的就是RollingUpdate策略。
① Recreate:设置spec.strategy.type=Recreate,表示Deployment在更新Pod时,会先杀掉所有正在运行的Pod,然后创建新的Pod
② RollingUpdate:设置spec.strategy.type=RollingUpdate,表示Deployment会以滚动更新的方式来逐个更新Pod。同时,可以通过设置spec.strategy.rollingUpdate下的两个参数(maxUnavailable和maxSurge)来控制滚动更新的过程。

  1. spec.strategy.rollingUpdate.maxUnavailable:用于指定Deployment在更新过程中不可用状态的Pod数量的上限。该maxUnavailable的数值可以是绝对值(例如5)或Pod期望的副本数的百分比(例如10%),如果被设置为百分比,那么系统会先以向下取整的方式计算出绝对值(整数)。而当另一个参数maxSurge被设置为0时,maxUnavailable则必须被设置为绝对数值大于0(从Kubernetes 1.6开始,maxUnavailable的默认值从1改为25%)。举例来说,当maxUnavailable被设置为30%时,旧的ReplicaSet可以在滚动更新开始时立即将副本数缩小到所需副本总数的70%。一旦新的Pod创建并准备好,旧的ReplicaSet会进一步缩容,新的ReplicaSet又继续扩容,整个过程中系统在任意时刻都可以确保可用状态的Pod总数至少占Pod期望副本总数的70%
  2. spec.strategy.rollingUpdate.maxSurge:用于指定在Deployment更新Pod的过程中Pod总数超过Pod期望副本数部分的最大值。该maxSurge的数值可以是绝对值(例如5)或Pod期望副本数的百分比(例如10%)。如果设置为百分比,那么系统会先按照向上取整的方式计算出绝对数值(整数)。从Kubernetes 1.6开始,maxSurge的默认值从1改为25%。举例来说,当maxSurge的值被设置为30%时,新的ReplicaSet可以在滚动更新开始时立即进行副本数扩容,只需要保证新旧ReplicaSet的Pod副本数之和不超过期望副本数的130%即可。一旦旧的Pod被杀掉,新的ReplicaSet就会进一步扩容。在整个过程中系统在任意时刻都能确保新旧ReplicaSet的Pod副本总数之和不超过所需副本数的130%。

2 回滚Deployment

有时(例如新的Deployment不稳定时)我们可能需要将Deployment回滚到旧版本。在默认情况下,所有Deployment的发布历史记录都被保留在系统中,以便于我们随时进行回滚(可以配置历史记录数量)。假设在更新Deployment镜像时,将容器镜像名误设置成
Nginx:latset(一个不存在的镜像)

kubectl set image deployment/nginx-deployment nginx=nginx:latset

查看ReplicaSet,可以看到新建的ReplicaSet(nginx-deployment-54f57cf6bf):
再查看创建的Pod,会发现新的ReplicaSet创建的1个Pod被卡在镜像拉取过程中。
在这里插入图片描述
为了解决上面这个问题,我们需要回滚到之前稳定版本的Deployment。首先,用kubectl rollout history命令检查这个Deployment部署的历史记录:

kubectl rollout history deployment/nginx-deployment

在这里插入图片描述
撤销本次发布并回滚到上一个部署版本

kubectl rollout undo deployment/nginx-deployment

在这里插入图片描述
也可以使用–to-revision参数指定回滚到的部署版本号:

kubectl rollout undo deployment/nginx-deployment --to-revision=1

在这里插入图片描述
这样,该Deployment就回滚到之前的稳定版本了,可以从 Deployment的事件信息中查看到回滚到版本1的操作过程

kubectl describe deployment nginx-deployment

此时可以看到nginx-deployment具体的回滚过程,并可以看到当前镜像已回退到nginx:1.7.9版本。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Keyuchen_01/article/details/123882199