《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部署的基石,掌握它们能显著提升应用稳定性。通过本教程的步骤,您可以安全地管理应用迭代。

相关推荐
意疏2 小时前
【Linux 篇】Docker 容器星河与镜像灯塔:Linux 系统下解锁应用部署奇幻征程
linux·docker
LDG_AGI2 小时前
【人工智能】OpenClaw(一):MacOS极简安装OpenClaw之Docker版
运维·人工智能·深度学习·机器学习·docker·容器·推荐算法
朱包林2 小时前
k8s-Pod基础管理,标签管理,rc控制器及重启策略实战
linux·运维·云原生·容器·kubernetes·云计算
returnthem2 小时前
最新版 Kubernetes 集群搭建教程(kubeadm 方式)
云原生·容器·kubernetes
Monster丶6262 小时前
Docker 部署 Ollama 全流程指南:支持 CPU/GPU、生产环境可用的工程化实践
运维·人工智能·docker·容器
白花生2 小时前
k8s集群内的ollama pod持久化调用本地大模型
云原生·容器·kubernetes
hkNaruto2 小时前
【Docker】关于hub.docker.com,无法打开,国内使用dockers.xuanyuan.me搜索容器镜像、查看容器镜像的使用文档
运维·docker·容器
秋刀鱼什么味_2 小时前
kubernetes服务质量之QoS类
容器·kubernetes
Java陈序员2 小时前
自建 Claude Code 镜像!一站式开源中转服务!
docker·node.js·vue·claude·claude code