kubernetes 的 滚动升级和回滚(rollout)

产品部署上线后常需升级服务(仅更新镜像),以往操作存在升级失败回滚策略的难题。为此利用Kubernetes滚动升级工具,介绍了部署及升级流程,包括初次创建加参数记录脚本、查看发布历史、执行升级命令、查看pod状态及回滚操作等,还提及k8s 1.15支持的类型及回滚注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

产品部署完成上线之后,经常遇到需要升级服务的要求(只考虑更新镜像),以往操作流程大致如下:

# 方式一:找到 master具体调度到的所有目标node,删除其对应的镜像文件
# 方式二:修改 file.yaml中镜像拉取策略为Always

# 删掉旧pod,并重新创建
kubectl delete -f /path/file.yaml
kubectl create -f /path/file.yaml

但是这样有一个比较棘手的问题,就是如果升级失败的回滚策略。

 

因此我们利用kubernetes自身的滚动升级的工具,部署及升级流程如下:

1. 在初次创建的时候,尽量加入参数 --record,这样k8s会记录下本次启动的脚本 。

# --record
kubectl create -f /path/file.yaml --record

2.执行查看发布的历史记录,会显示现在已经记录的脚本及其序号。

# 查看历史记录
kubectl rollout history deployment deploy-apigw

3.升级命令执行后会输出:xxx   image updated

# 升级镜像
kubectl set image deployment/deploy-name containerName=newIMG:version

# kubectl set image controllerType/controllerInstanceName underInstanceContainerName=image:version

4.查看pod状态,如果失败需要回滚操作

# 回滚到上一个操作版本
kubectl rollout undo deployment/deploy-name
# 回滚到指定版本,版本号由第二步查看获得
kubectl rollout undo deployment/deploy-name --to-revision=3

Notice:

  1. k8s 1.15版本,目前支持 pod (po), replicationcontroller (rc), deployment (deploy), daemonset (ds), replicaset (rs)
  2. 执行rollout undo操作之后,版本号会移动,需要确认版本号无误再undo

### Kubernetes滚动更新回滚的实现方法 滚动更新是一种逐步替换旧版本 Pod 的机制,确保在更新过程中服务不中断。Kubernetes 通过 Deployment 控制器来实现滚动更新,允许用户定义更新策略,例如每次更新的副本数量。在滚动更新过程中,Kubernetes 会逐步创建新版本的 Pod,并在确认新 Pod 正常运行后终止旧 Pod。这种机制确保了应用程序的高可用性连续性[^3]。 回滚Kubernetes 提供的一种版本恢复机制,当新版本出现问题时,可以恢复到之前稳定运行的版本。Kubernetes 会在每次更新时记录 Deployment 的配置变更,并将其保存为修订版本(revision)。用户可以通过查看历史修订版本来决定回滚的目标版本,并使用命令执行回滚操作[^4]。 #### 实现滚动更新的命令示例 滚动更新可以通过 `kubectl set image` 命令实现,例如: ```bash kubectl set image deployment/my-deployment nginx=nginx:1.21 ``` 此命令会触发 Deployment 的滚动更新流程,逐步替换旧版本的 Pod。 #### 查看滚动更新状态 可以使用以下命令查看滚动更新的进度状态: ```bash kubectl rollout status deployment/my-deployment ``` #### 回滚操作示例 回滚可以通过 `kubectl rollout undo` 命令实现,例如: ```bash kubectl rollout undo deployment/my-deployment ``` 如果需要回滚到特定的修订版本,可以先使用以下命令查看历史修订版本: ```bash kubectl rollout history deployment/my-deployment ``` 然后使用以下命令回滚到指定的版本: ```bash kubectl rollout undo deployment/my-deployment --to-revision=2 ``` #### Deployment 配置示例 以下是一个 Deployment 的 YAML 配置示例,展示了如何定义滚动更新策略: ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: my-deployment spec: replicas: 3 strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 1 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: nginx image: nginx:1.20 ports: - containerPort: 80 ``` 在该配置中,`strategy` 字段定义了滚动更新策略,`maxSurge` 表示最多可以创建的超出期望副本数的 Pod 数量,`maxUnavailable` 表示在更新过程中最多允许不可用的 Pod 数量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值