如何使用Kubernetes部署执行滚动更新(分步指南)

Kubernetes部署执行滚动更新教程介绍滚动更新是现代应用程序生命周期的重要组成部分,用户不断期待新功能和零停机时间。虽然 Kubernetes 过去使用复制控制器来启用此功能,但较新的版本建议使用部署。 
Kubernetes如何部署执行滚动更新?本教程向你展示如何使用 Kubernetes 部署执行滚动更新。此方法可让你快速更新应用程序并实现零停机时间,同时确保支持回滚。
先决条件

  • 一个 Kubernetes 集群
  • 访问终端窗口
  • 该kubectl  命令行工具
启用滚动更新如何使用Kubernetes部署执行滚动更新?Kubernetes 部署充当 ReplicaSet 的包装器,ReplicaSet 是负责 pod 管理的 Kubernetes 控制器。部署为 ReplicaSet 提供了额外的功能——它们执行健康检查、滚动更新和回滚。
1. 首先,使用文本编辑器创建一个带有部署规范的yaml文件,例如Nano:
nano nginx-test.yaml

下面的示例文件包含 Kubernetes 部署所需的基本声明:
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 4 selector:matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2ports: - containerPort: 80

2. 保存并退出文件。
3. 然后,使用你刚刚创建的kubectl create命令和yaml文件创建部署:
kubectl create -f nginx-test.yaml

如何使用Kubernetes部署执行滚动更新(分步指南)

文章图片
4. 检查部署:
kubectl get deployment

输出应确认部署已准备就绪:
如何使用Kubernetes部署执行滚动更新(分步指南)

文章图片
4. 接下来,通过运行以下命令检查 ReplicaSets:
kubectl get rs

示例文件指定了四个副本,它们都显示为就绪:
如何使用Kubernetes部署执行滚动更新(分步指南)

文章图片
5. 最后,检查 Pod 是否已启动:
kubectl get pod

输出显示 Pod 已准备就绪并正在运行:
如何使用Kubernetes部署执行滚动更新(分步指南)

文章图片
确保零停机时间
如何使用Kubernetes部署执行滚动更新?要配置零停机滚动更新,你需要指定更新策略。
1.在部署yaml文件的speccategory下添加如下声明:
minReadySeconds: 5 strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 1

  • minReadySeconds告诉 Kubernetes 在创建下一个 Pod 之前应该等待多长时间。此属性可确保所有应用程序 Pod 在更新期间都处于就绪状态。
  • maxSurge指定超过指定副本数的最大 Pod 数(或百分比)。在上面的示例中,由于yaml文件中指定了4 个副本,因此 pod 的最大数量将为5。
  • maxUnavailable声明更新期间不可用 Pod 的最大数量(或百分比)。如果maxSurge设置为0,则该字段不能为0。
将上述规范添加到部署yaml文件中就足以开始执行 Kubernetes 滚动更新。但是,它并不能保证零停机时间。Kubernetes 无法判断新 Pod 何时准备就绪 - 一旦创建新 Pod,它就会消除旧 Pod。此问题会导致停机,直到新 pod 能够接受请求。
为了解决这个问题,Kubernetes 引入了Readiness Probes的概念。探测器会检查 Pod 的状态,并且仅当 Pod 中的所有容器都准备就绪时才允许进行滚动更新。当就绪探测成功且经过 中指定的时间后,Pod 被视为就绪minReadySeconds
2. 要设置就绪探针,请将以下几行添加到spec.template.spec部署文件的类别中:
readinessProbe: httpGet: path: / port: 8080 initialDelaySeconds: 5 periodSeconds: 5 successThreshold: 1

  • initialDelaySeconds  指定探测器在容器启动后必须等待多长时间才能启动。
  • periodSeconds是两次探测之间的时间。默认值为10秒,最小值为1秒。
  • successThreshold是在一次失败后连续成功探测的最小数量,整个过程被认为是成功的。默认值和最小值都是1。
为滚动更新正确配置的整个部署文件应如下所示:
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 4 selector:matchLabels: app: nginx minReadySeconds: 5 strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 1 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.0ports: - containerPort: 80 readinessProbe: httpGet: path: / port: 8080 initialDelaySeconds: 5 periodSeconds: 5 successThreshold: 1

3. 保存文件并退出。
4. 然后,使用kubectl apply应用更改:
kubectl apply -f nginx-text.yaml --record

--record标志将在回滚过程中发挥作用。
如何使用Kubernetes部署执行滚动更新(分步指南)

文章图片
输出显示部署已成功配置。
执行滚动更新如何使用Kubernetes部署执行滚动更新?共有三种执行滚动更新的方法。
例如,要更改应用程序图像:
选项 1:你可以使用kubectl set在命令行上执行操作:
kubectl set image deployment nginx-deployment nginx=nginx:1.14.2 --record

如何使用Kubernetes部署执行滚动更新(分步指南)

文章图片
选项 2:或者,spec.templates.spec.containers在yaml文件部分修改镜像版本。然后,使用kubectl replace来执行更新:
kubectl replace -f nginx-test.yaml

如何使用Kubernetes部署执行滚动更新(分步指南)

文章图片
选项 3:你也可以使用kubectl edit直接编辑部署:
kubectl edit deployment nginx-deployment --record

在打开的编辑器中进行必要的更改:
如何使用Kubernetes部署执行滚动更新(分步指南)

文章图片
关闭编辑器时会应用更改。
检查推出状态Kubernetes如何部署执行滚动更新?使用以下语法检查部署的推出状态:
kubectl rollout status deployment nginx-deployment

输出确认成功部署:
如何使用Kubernetes部署执行滚动更新(分步指南)

文章图片
Kubernetes部署执行滚动更新教程?暂停和恢复滚动更新使用相应的kubectl rollout命令暂停和恢复滚动更新。
要暂停更新,请运行:
kubectl rollout pause deployment nginx-deployment

如何使用Kubernetes部署执行滚动更新(分步指南)

文章图片
要恢复更新,请运行:
kubectl rollout resume deployment nginx-deployment

如何使用Kubernetes部署执行滚动更新(分步指南)

文章图片
安排 Pod 进行部署使用关联性和反关联性属性来控制 Kubernetes 在你的部署中安排特定 pod 的节点。
Pod Affinity
Kubernetes 目前有两种类型的Affinity:
  • requiredDuringSchedulingIgnoredDuringExecution  告诉 Kubernetes 仅在满足特定条件(例如特定处理器类型)的节点上运行 pod。
  • preferredDuringSchedulingIgnoredDuringExecution  当且仅当没有节点满足给定条件时,允许 pod 在其他地方运行。
这些属性列在PodSpec文件中。例如,一个 pod 可以指定如下:
apiVersion: v1 kind: Pod metadata: name: affinity-test spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/test-name operator: In values: - test1 - test2 preferredDuringSchedulingIgnoredDuringExecution: - weight: 1 preference: matchExpressions: - key: example-node-label-key operator: In values: - example-node-label-value containers: - name: affinity-test image: k8s.gcr.io/pause:2.0

上面的文件告诉 Kubernetes 仅在具有标签的节点上运行 pod,该节点的键为kubernetes.io/test-name,其值为test1test2。此外,Kubernetes 会优先选择键为example-node-label-keyexample-node-label-value值为 的节点。
Pod Anti-Affinity
如何使用Kubernetes部署执行滚动更新?如果你不希望所有 Pod 都在同一个节点上运行,则Pod Anti-Affinity很有用。它的功能类似于亲缘关系,具有相同的两种类型 -requiredDuringSchedulingIgnoredDuringExecutionpreferredDuringSchedulingIgnoredDuringExecution.
以下示例指定了一个反关联性规则,该规则告诉 Kubernetes 最好避免将“测试”应用程序 Pod 调度到已经拥有“测试”Pod 的节点:
podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchExpressions: - key: app operator: In values: - test topologyKey: Kubernetes.io/hostname

回滚更改Kubernetes如何部署执行滚动更新?如果更新过程出现问题,你可以回滚更改并恢复到应用程序的先前版本。为此,请使用以下kubectl rollout命令:
kubectl rollout history deployment nginx-deployment

输出列出了通过--record在执行更新时添加标志创建的可用修订:
如何使用Kubernetes部署执行滚动更新(分步指南)

文章图片
选择所需的修订并键入以下命令以回滚更改:
kubectl rollout undo deployment nginx-deployment --to-revision=1

上面的命令回滚到修订版 1 并产生以下输出:
如何使用Kubernetes部署执行滚动更新(分步指南)

文章图片
Kubernetes部署执行滚动更新教程结论如何使用Kubernetes部署执行滚动更新?阅读本教程后,你应该能够使用 Kubernetes 部署执行零停机滚动更新。
【如何使用Kubernetes部署执行滚动更新(分步指南)】如果你希望扩展有关 Kubernetes 中部署类型的知识,请阅读如何在 Kubernetes  上进行 Canary 部署。

    推荐阅读