在开发中,软件的迭代升级是很常见的需求。而在 Kubernetes 中,滚动升级 Deployment 是一种通过部署新版本的 Pod 并逐步替换旧版本的方式来实现应用程序的无中断升级的方法。
Deployment 的基本概念
在 Kubernetes 中,Deployment 是一个控制器(Controller),用于管理 Pod 的部署和升级。Deployment 中定义了应用程序的期望状态,然后 Kubernetes 根据这个状态来保证应用程序的运行。
Deployment 包含以下几个重要的属性:
apiVersion
:Deployment 对象所使用的 Kubernetes API 版本;kind
:Deployment 的类型,即 Deployment;metadata
:Deployment 的元数据,包含 Deployment 的名称、命名空间等信息;spec
:Deployment 对象创建时的配置信息,包括 Pod 模板、升级策略等属性;status
:Deployment 对象的状态信息,包括当前部署的 Pod 信息、升级状态等。
滚动升级 Deployment 的基本步骤
下面我们将详细介绍 Kubernetes 中如何通过滚动升级 Deployment 来实现应用程序的升级。
1. 创建 Deployment
首先,我们需要创建一个 Deployment 对象,定义新版本应用程序的 Pod 模板、升级策略等属性。
例如,我们创建一个应用程序的 Deployment,使用 nginx
镜像,并将应用程序暴露在 80
端口:
apiVersion: apps/v1 kind: Deployment metadata: name: my-nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: my-nginx image: nginx:1.16 ports: - containerPort: 80
2. 升级 Deployment
接下来,我们需要升级 Deployment。首先,我们可以使用 kubectl edit
命令修改 Deployment,更新 Pod 模板中的镜像版本:
$ kubectl edit deployment my-nginx
将 spec.template.spec.containers.image
的值修改为新版本镜像的名称。然后保存修改并退出编辑器。
修改 Deployment 后,Kubernetes 会自动创建新版本的 Pod,并开始逐步替换旧版本的 Pod。
3. 监控升级状态
升级过程中,我们可以使用 kubectl rollout status
命令来监控升级状态:
$ kubectl rollout status deployment/my-nginx
当输出结果为 deployment "my-nginx" successfully rolled out
时,表示升级已经完成。
4. 回滚升级
如果升级过程中出现问题,可以使用 kubectl rollout undo
命令回滚升级,恢复到上一个版本:
$ kubectl rollout undo deployment/my-nginx
滚动升级 Deployment 的高级选项
除了基本步骤外,Kubernetes 还提供了一些高级选项来控制滚动升级 Deployment 的行为。
1. 升级策略
Deployment 的 spec.strategy.type
属性可以控制升级策略,默认为 RollingUpdate
。
除了 RollingUpdate
策略外,还可以设置其他策略,例如 Recreate
策略,在升级时会先删除所有旧版本的 Pod,然后再创建新版本的 Pod。
apiVersion: apps/v1 kind: Deployment metadata: name: my-nginx spec: replicas: 3 strategy: type: Recreate selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: my-nginx image: nginx:1.17 ports: - containerPort: 80
2. 升级的最大并发数和失败阈值
Deployment 的 spec.strategy.rollingUpdate.maxSurge
属性控制升级期间可以创建的最大多余 Pod 数量,spec.strategy.rollingUpdate.maxUnavailable
属性控制可以被删除的最大 Pod 数量。
如果在升级过程中达到了最大多余 Pod 数量或最大删除 Pod 数量,升级会被暂停。
apiVersion: apps/v1 kind: Deployment metadata: name: my-nginx spec: replicas: 3 strategy: rollingUpdate: maxSurge: 1 maxUnavailable: 1 type: RollingUpdate selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: my-nginx image: nginx:1.17 ports: - containerPort: 80
3. 升级的超时时间
Deployment 的 spec.progressDeadlineSeconds
属性控制升级的超时时间。如果升级过程超过了指定的超时时间,升级会被回滚。
apiVersion: apps/v1 kind: Deployment metadata: name: my-nginx spec: replicas: 3 strategy: type: RollingUpdate progressDeadlineSeconds: 600 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: my-nginx image: nginx:1.17 ports: - containerPort: 80
总结
滚动升级 Deployment 是 Kubernetes 中一种非常常用的升级方式,它可以实现应用程序的无中断升级,确保应用程序始终处于可用状态。在实践过程中,我们需要根据实际需求来选择合适的升级策略和调整升级的参数,以确保升级的顺利进行。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/659fa88fadd4f0e0ff8325b5