pod的升级和回滚

如果pod是通过Deployment创建的,则用户可以在运行时修改Deployment的pod定义(sepc.template)或镜像名称,并应用到Deployment对象上,系统即可完成Deployment的自动更新操作。如果在更新过程中发生了错误,则还可以通过回滚操作恢复Pod的版本。

Deployment的升级

以Deployment nginx为例:

kubectl create -f nginx-deployment.yaml --record=true

apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:

  • name: nginx
    image: nginx:1.7.9
    ports:
    • containerPort: 80

现在pod镜像需要被更新为 nginx:1.9.1,我们可以通过kubectl set image 命令为Deployment设置新的镜像名称:

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

另外一种方法是使用kubectl edit命令直接修改Deployment的配置,将image从nginx:1.7.9更改为nginx:1.9.1。

kubectl edit deployment/nginx-deployment

一旦镜像名发生了修改,则将触发系统完成Deployment所有运行pod的滚动升级操作,可以使用kubectl rollout status 命令查看Deployment的更新过程:

kubectl rollout status deployment/nginx-deployment

运行kubectl get rs 命令,可以看到两个ReplicaSet的最终状态:

更新策略:

在deployment的定义中,可以通过spec.strategy指定pod更新的策略,目前支持两种策略:Recreate(重建)和RollingUpdate(滚动更新)策略,默认值为RollingUpdate。

Recreate:设置spec.strategy.type=Recreate,表示Deployment在更新pod时,会先杀掉所有正在运行的pod,然后创建新的pod。

RollingUpdate:设置spec.strategy.type=RollingUpdate,表示Deployment会以滚动更新的方式来逐个更新pod。同时,可以通过设置spec.strategy.rollingUpdate下的两个参数(maxUnavailable和maxSurge)来控制滚动更新的过程。

Deployment是如何完成Pod更新的呢?通过kubectl describe deployment nginx-deployment 可以看到详细的事件信息:

spec.strategy.rollingUpdate.maxUnavailable:用于指定Deployment在更新过程中不可用状态的pod数量的上限。该参数的数值可以是绝对值(例如5)或pod期望的副本数的百分比(例如10%),如果被设置为百分比,那么系统会先以向下取整的方式计算出绝对值。而当另一个参数maxSurge被设置为0时,maxUnavailable则必须被设置为绝对值大于0。默认值为25%。

spec.strategy.rollingUpdate.maxSurge:用于指定Deployment在更新过程中pod总数超过pod期望副本数部分的最大值,该maxSurge的数值可以是绝对值(例如5)或pod期望副本数的百分比(例如10%),如果设置为百分比,那么系统会先按照向上取整的方式计算出绝对值。默认值为25%

多重更新(Rollover)的情况

如果deployment的上一次更新正在进行,此时用户再次发起deployment的更新操作,那么deployment会为每一次更新都创建一个ReplicaSet,而每次在新的ReplicaSet创建成功后,会逐个增加pod副本数,同时将之前正在扩容的ReplicaSet停止扩容更新,并将其加入旧版本ResplicaSet列表中,然后开始缩容至0的操作。

假设我们创建了一个deployment,这个deployment开始创建了5个nginx:1.7.9的pod副本,在这个创建pod动作尚未完成时,我们又将deployment进行更新,在副本数量不变的情况下将pod模板中的镜像修改为nginx:1.9.1,又假设此时deployment已经创建了3个nginx:1.7.9的pod副本,则deployment会立即杀掉已创建的3个nginx:1.7.9 pod,并开始创建nginx:1.9.1 pod。deployment不会在等待nginx:1.7.9的pod创建到5个之后再进行更新操作。

Deployment的回滚

kubectl create -f nginx-deployment.yaml --record=true

在创建deployment时使用--record=true参数,就可以在历史命令中看到每个版本所执行的命令了

假如我们在更新deployment镜像时,将容器镜像名称设置错误为nginx:1.7(一个不存在的镜像),则部署过程会卡在拉取镜像过程中。

这时,我们需要回滚到之前稳定版本的deployment。

首先,使用kubectl rollout history命令查看deployment部署的历史记录:

kubectl rollout history deployment nginx-deployment

如果需要查看某一条命令的详细信息,则可以加上--reversion=<N>参数

kubectl rollout history deployment nginx-deployment --reversion=3

我们可以看到image的版本是nginx1.7,并不存在此镜像!!!

现在我们决定撤销本次发布并回滚到上一个部署版本:

kubectl rollout undo deployment nginx-deployment

也可以使用--to-revision参数指定回滚到的部署版本号:

kubectl rollout undo deployment nginx-deployment --to-revision=2

这样就可以回滚到之前的稳定版本了。

### 回答1: Deployment 和 Pod 是 Kubernetes 中的两个重要概念。 Deployment 是 Kubernetes 中用于管理 Pod 副本数量的资源对象,它定义了 Pod 副本的数量、Pod 模板以及更新策略等信息。Deployment 可以保证指定数量的 Pod 副本处于运行状态,并且可以在更新时提供滚动升级的策略,确保应用程序不会出现中断。 Pod 则是 Kubernetes 中最小的可部署对象,它是一组容器的集合,它们共享相同的网络命名空间和存储卷,并在同一节点上运行。Pod 可以包含一个或多个容器,这些容器可以共享文件系统、进程和网络命名空间等资源。Pod 是 Kubernetes 中最基本的部署单元,而 Deployment 则用于管理 Pod 的生命周期和副本数量。 因此,可以将 Deployment 理解为管理 Pod 副本的控制器,而 Pod 则是 Deployment 管理的对象。在 Kubernetes 中,Deployment 和 Pod 经常一起使用,以确保应用程序的高可用性和可靠性。 ### 回答2: Deployment是Kubernetes中的一个资源对象,用于描述和管理应用程序在集群中的部署。它定义了应用程序的副本数量、位置和更新策略等信息。Deployment通过控制器模式监控和维护应用程序的状态,根据需要创建、更新或删除副本。当集群中的节点发生故障或应用程序需要进行水平扩展时,Deployment会自动调整副本的数量,确保应用程序的高可用性和稳定性。 Pod是Kubernetes中的最小部署单元,它是一组容器的集合,可以共享网络和存储资源。Pod中的容器通常与应用程序的不同部分相关联,例如前端、后端、数据库等。Pod作为一个整体部署和运行,它具有自己的IP地址和网络空间,并且可以在同一节点或不同节点上运行。 Deployment通过管理Pod的创建、销毁和更新,为应用程序提供了一种方便的部署和管理方式。当创建一个Deployment时,Kubernetes会自动创建一个或多个Pod,并在集群中的节点上进行分发。Pod中的容器可以通过共享网络和存储资源来进行通信和数据交互,提供了良好的应用程序部署和扩展的基础。此外,Deployment还支持滚动更新策略,可以逐步将旧的Pod替换为新的Pod,实现应用程序的无缝更新和回滚。 总之,Deployment是管理应用程序在Kubernetes集群中部署和更新的资源对象,而Pod是最小的部署单元,用于运行和管理应用程序的容器。它们共同提供了一种高效、可靠的应用程序部署和管理方式。 ### 回答3: Deployment 是 Kubernetes 中的一个资源对象,用于管理应用程序的部署和更新过程。它定义了应用程序的期望状态,并通过控制器来确保实际状态与期望状态一致。Deployment 可以方便地创建和管理 Pod,并提供了一种机制来平滑地升级回滚应用程序。 Pod 是 Kubernetes 中最小的可部署单元,由一个或多个容器共享网络和存储资源组成。Pod 中的容器紧密耦合,它们共享同一主机和 IP 地址,并且可以使用 localhost 进行同步和通信。Pod 提供了一种抽象层,使应用程序能够以一种相对无状态的方式运行,而不必担心底层基础设施的细节。 Deployment 和 Pod 之间存在一定的关系。Deployment 可以管理多个 Pod 的部署和更新过程。通过定义 Deployment 资源,可以指定应该创建多少个 Pod,并在需要时自动创建或删除 Pod。Deployment 还可以指定 Pod 使用哪个容器镜像,并确保 Pod 的副本数符合期望的副本数。 总的来说,Deployment 是用来管理 Pod 的,它提供了一种声明式的方式来定义应用程序的运行方式,包括副本数、容器镜像等。而 Pod 则是实际运行应用程序的最小单元,它由一个或多个容器组成,并共享网络和存储资源。Deployment 和 Pod 的结合可以实现应用程序的自动部署、水平扩展和版本控制等功能,使应用程序更加方便和可靠地运行在 Kubernetes 平台上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值