Kubernetes 是目前最为流行的容器编排工具之一。在使用 Kubernetes 进行应用的部署时,我们经常会遇到需要更新应用的情况。本文将详细介绍 Kubernetes 中如何通过滚动更新 Deployment 来更新应用,同时结合实例进行讲解。
什么是滚动更新?
在大多数情况下,我们希望更新应用时能够做到无感知或者最小化的影响。滚动更新是一种逐步更新应用的策略,通过将应用逐步地替换成新的版本,使得应用在更新的过程中保持可用。在每次更新中,只更新一小部分的 pod,确保在更新过程中应用依然能够正常提供服务。当新的版本被认为已经稳定时,再逐步将所有的 pod 进行更新。
如何进行滚动更新?
在 Kubernetes 中,滚动更新可以通过 Deployment 进行。Deployment 是一个 Kubernetes 中的抽象概念,它用于声明性地管理 pod 的版本和副本。通过定义 Deployment,我们可以让 Kubernetes 自动进行滚动更新。
创建 Deployment
首先,我们需要创建一个 Deployment,用来管理我们的应用。下面是一个示例的 Deployment 文件:
// javascriptcn.com 代码示例 apiVersion: apps/v1 kind: Deployment metadata: name: my-app spec: replicas: 3 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: my-app image: my-registry/my-app:v1.0.0 ports: - containerPort: 8080
我们可以通过 kubectl apply 命令来创建该 Deployment:
kubectl apply -f my-app-deployment.yaml
在 Deployment 的 spec 中,我们声明了应用需要运行的 pod 数量、以及如何匹配 selector 来选择需要进行更新的 pod。同时,还定义了每个 pod 的模板,包括了容器的镜像以及暴露的端口号。
更新 Deployment
当我们需要更新应用时,我们需要修改该 Deployment 的模板,并让 Kubernetes 自动逐步更新所有的 pod。
下面是一个示例的 Deployment 文件,我们将应用的版本更新为 v1.0.1:
// javascriptcn.com 代码示例 apiVersion: apps/v1 kind: Deployment metadata: name: my-app spec: replicas: 3 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: my-app image: my-registry/my-app:v1.0.1 # 将镜像地址修改为 v1.0.1 ports: - containerPort: 8080
将该文件保存为 my-app-new-version.yaml,并通过 kubectl apply 命令进行更新:
kubectl apply -f my-app-new-version.yaml
在这个过程中,Kubernetes 会逐步更新每个 pod。具体来说,它会先创建一个新的 pod,并等待该 pod 的健康检查成功之后,再删除旧的 pod。在这个过程中,Deployment 会确保至少有一个旧的 pod 和一个新的 pod 在运行。这种策略可以避免应用在更新过程中出现完全不可用的情况。
验证更新结果
我们可以通过 kubectl get pods 查看应用升级的情况:
$ kubectl get pods NAME READY STATUS RESTARTS AGE my-app-6b448b48bf-75jdc 1/1 Running 0 25m my-app-6b448b48bf-chmln 1/1 Running 0 25m my-app-6b448b48bf-wtwk6 1/1 Running 0 25m
可以看到当前有三个 pod 在运行。
我们还可以通过 kubectl rollout status 命令来查看滚动更新的状态:
kubectl rollout status deployment my-app
当输出为 deployment "my-app" successfully rolled out 时表示更新成功。
回滚 Deployment
如果我们需要回滚一个 Deployment 的更新,我们可以使用 kubectl rollout undo 命令来实现:
kubectl rollout undo deployment my-app
这个命令会将 Deployment 回滚到上一个版本。
总结
滚动更新是 Kubernetes 中应用更新的常用策略。通过使用 Deployment,我们可以实现快速、无感知的应用更新,同时避免了应用更新过程中出现的一些问题。在实践中,我们还需要注意一些细节,比如滚动更新的速度以及更新的顺序等。通过本篇文章的介绍,相信读者已经能够掌握 Kubernetes 中滚动更新 Deployment 的基本方法,并可以在实践中灵活运用。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/654623aa7d4982a6ebfef984