在Kubernetes中,Deployment 是一种控制器,它提供了声明式的方式来管理应用程序的部署和更新。滚动更新(Rolling Update)是一种更新策略,它允许你在不中断服务的情况下逐步替换旧版本的应用程序Pods为新版本的Pods。
滚动更新的特点:
- 平滑过渡: 通过逐步替换旧的Pods,滚动更新可以确保应用始终可用,即使是在更新过程中。
- 控制流量: 可以控制新旧Pod的比例,以及每次更新多少个Pod。
- 回滚能力: 如果新版本出现问题,可以快速回滚到之前的稳定版本。
滚动更新策略参数:
当你定义一个Deployment时,可以通过设置.spec.strategy
字段来指定滚动更新的具体行为。以下是两个主要的参数:
-
maxUnavailable:
- 定义了在更新过程中不可用的最大Pod数量。
- 可以是绝对数值(例如:2)或百分比(例如:10%)。如果是百分比,则表示相对于预期的副本总数。
- 默认情况下,Kubernetes会确保至少有(期望副本数 - maxUnavailable)个Pod是可用的。
-
maxSurge:
- 定义了在更新过程中可以额外创建的新Pod数量。
- 同样可以是绝对数值或百分比。
- 这个值决定了更新期间系统能够处理的额外负载量。
示例配置:
apiVersion: apps/v1
kind: Deployment
metadata:
name: example-deployment
spec:
replicas: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
...
在这个例子中:
maxUnavailable: 1
意味着在任何给定时间点上,最多只有一个Pod是不可用的。maxSurge: 1
意味着在更新过程中,系统可以创建额外的一个Pod。
这意味着如果有3个Pod正在运行,那么在更新开始时,Kubernetes将创建一个新的Pod(总共有4个),然后销毁一个旧的Pod。这个过程会重复直到所有Pod都被更新到新版本。
自动滚动更新:
当你更新Deployment的镜像或配置时,Kubernetes会自动触发滚动更新。你可以使用kubectl set image
命令或者直接修改Deployment的YAML文件并重新应用来触发更新。
手动滚动更新:
你也可以通过kubectl rollout
命令来进行更精细的控制,比如暂停、恢复更新,或者查看更新的状态等。
总结:
滚动更新是一个强大的功能,它使得Kubernetes中的应用更新变得既安全又可控。通过调整maxUnavailable
和maxSurge
这两个参数,你可以根据实际需求定制更新过程,从而最小化对用户的影响。