《K8s 滚动更新与回滚:详细教程》

K8s 滚动更新与回滚:详细教程

Kubernetes(K8s)中的滚动更新(Rolling Update)和回滚(Rollback)是确保应用高可用性和无缝部署的核心功能。滚动更新允许逐步替换旧版本的Pod,避免服务中断;回滚则用于快速恢复到之前的稳定版本。本教程将逐步解释这些概念、配置方法和操作步骤,基于K8s官方文档和最佳实践。内容真实可靠,适用于K8s v1.20及以上版本。

1. 滚动更新详解

滚动更新通过Deployment资源实现,它控制ReplicaSet的创建和更新。更新时,K8s逐步启动新Pod并终止旧Pod,确保服务始终可用。关键参数包括:

  • maxSurge:指定可额外创建的Pod数量上限,通常为百分比或整数,例如maxSurge = 25%表示最多超出期望副本数的25%。
  • maxUnavailable:指定更新期间不可用的Pod数量上限,例如maxUnavailable = 10%表示最多10%的Pod不可用。

配置步骤:

  1. 定义Deployment YAML文件,设置滚动更新策略。
  2. 使用kubectl apply触发更新。
  3. K8s自动管理Pod替换过程。

示例YAML配置:

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 4  # 期望副本数
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 25%  # 行内数学表达式:$maxSurge = 25\%$
      maxUnavailable: 10%  # 行内数学表达式:$maxUnavailable = 10\%$
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-container
        image: my-image:v1  # 初始镜像版本

操作命令:

bash 复制代码
# 更新Deployment(例如修改镜像版本)
kubectl apply -f deployment.yaml

# 监控更新状态
kubectl rollout status deployment/my-app

更新过程中,K8s会创建新ReplicaSet,并逐步调整Pod数量。例如,如果replicas=4,maxSurge=25%,则新Pod最多为4 + 4 \\times 0.25 = 5个(其中4 \\times 0.25 = 1),确保服务连续。

2. 回滚详解

回滚用于撤销失败的更新,恢复到之前的ReplicaSet版本。K8s通过Deployment的修订历史(Revision History)实现,默认保存10个历史版本。

配置步骤:

  1. 确保Deployment启用了修订历史(默认启用)。
  2. 使用kubectl rollout undo命令回滚。
  3. 可选:指定回滚到特定版本。

操作命令:

bash 复制代码
# 查看Deployment的修订历史
kubectl rollout history deployment/my-app

# 回滚到上一个版本
kubectl rollout undo deployment/my-app

# 回滚到特定版本(例如版本2)
kubectl rollout undo deployment/my-app --to-revision=2

回滚过程也是滚动式的,避免中断服务。K8s会重新激活旧ReplicaSet,并逐步替换Pod。

3. 完整示例

假设一个简单应用,从v1更新到v2,然后回滚。

步骤1:初始部署(v1版本)。

yaml 复制代码
# deployment-v1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  strategy:
    rollingUpdate:
      maxSurge: 1  # 行内数学表达式:$maxSurge = 1$
      maxUnavailable: 0  # 行内数学表达式:$maxUnavailable = 0$(确保零不可用)
  template:
    spec:
      containers:
      - image: my-image:v1

步骤2:更新到v2(修改镜像为v2)。

bash 复制代码
kubectl apply -f deployment-v1.yaml  # 初始部署
kubectl set image deployment/my-app my-container=my-image:v2  # 触发更新
kubectl rollout status deployment/my-app  # 监控

步骤3:如果v2有问题,回滚到v1。

bash 复制代码
kubectl rollout undo deployment/my-app
kubectl get pods  # 验证Pod已回滚
4. 最佳实践与注意事项
  • 高可用性:设置合理的maxSurgemaxUnavailable,例如在关键服务中使用maxUnavailable = 0,但会增加更新时长。
  • 监控 :使用kubectl get deploymentskubectl describe deployment查看状态。
  • 健康检查:在Pod模板中添加liveness和readiness探针,确保新Pod健康后才终止旧Pod。
  • 版本控制 :通过kubectl rollout history管理修订,避免意外覆盖。
  • 常见问题
    • 更新卡住:检查资源配额或Pod事件(kubectl describe pod)。
    • 回滚失败:确保历史版本存在;必要时手动调整YAML。

滚动更新和回滚是K8s部署的基石,掌握它们能显著提升应用稳定性。通过本教程的步骤,您可以安全地管理应用迭代。

相关推荐
Patrick_Wilson18 小时前
从「改个端口」到 502:Next.js on k8s 的容器端口、Service 映射与 env 覆盖
docker·kubernetes·next.js
探索云原生1 天前
K8s 1.36 这个 GA 特性,把 initContainer 拉模型的 hack 干掉了
ai·云原生·kubernetes
Suroy1 天前
DockerView-Go:用 Go 写一个终端 Docker 监控工具,顺便做了个 Web 仪表盘
docker
云恒要逆袭1 天前
运行你的第一个Docker容器
后端·docker·容器
宋均浩2 天前
# Docker 镜像瘦身实战:从 1.2G 到 80MB 的五个优化步骤
ci/cd·docker
Java之美2 天前
一次k8s升级引发的DevicePlugin注册失败
云原生·kubernetes
程序员老赵3 天前
10 分钟部署 OpenCode:Docker 一键安装,浏览器打开就能用 AI 写代码(附完整命令与排错)
docker·容器·ai编程
WangMingHua1113 天前
LM Studio Docker 部署——本地大模型一键启动
docker
曲幽4 天前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了
python·docker·web·pot·translate·libretranslate·arogstranslate