滚动更新以在 Kubernetes 中实现零停机垂直 pod 自动缩放器

时间:2021-07-05 10:04:28

标签: kubernetes kubernetes-pod horizontalpodautoscaler

Kubernetes vertical pod autoscaler(自动缩放内存,pod 的 cpu 资源)需要重新启动 pod 才能使用新分配的资源,这可能会增加不可用的小窗口。

我的问题是,如果 pod 的部署正在运行 rolling update,这将确保在应用 VPA 建议时零停机时间和零不可用窗口。

谢谢。

2 个答案:

答案 0 :(得分:1)

是的。部署的默认 RollingUpdate 行为应该自动执行此操作。它首先调出一些新副本,然后在新副本准备好后删除一些旧副本。您可以使用 maxUnavailablemaxSurge 字段控制一次不可用的 Pod 数量或将创建的新 Pod 数量。您可以调整这些变量以实现零停机目标。

参考:

答案 1 :(得分:1)

来自official documentation

<块引用>

滚动更新通过使用新的 Pod 实例增量更新 Pod 实例,允许部署的更新以零停机时间进行。新 Pod 将安排在具有可用资源的节点上。

在本文档中,您会发现一个非常好的滚动更新概述:

<块引用>

滚动更新允许以下操作:

  • 将应用程序从一个环境提升到另一个环境(通过容器映像更新)
  • 回滚到以前的版本
  • 持续集成和持续交付应用,零停机时间

您可以在此处找到有关 Rolling update deployment 的信息:

<块引用>

部署在 .spec.strategy.type==RollingUpdate 时以滚动更新方式更新 Pod。您可以指定 maxUnavailablemaxSurge 来控制滚动更新过程。

此外,您还可以添加另外 2 个字段:Max UnavailableMax Surge

<块引用>

.spec.strategy.rollingUpdate.maxUnavailable 是一个可选字段,用于指定更新过程中可能不可用的最大 Pod 数。

<块引用>

.spec.strategy.rollingUpdate.maxSurge 是一个可选字段,用于指定在所需 Pod 数量上可以创建的最大 Pod 数量。

现在由您决定如何设置这些值。以下是一些选项:

  • 通过添加一个 Pod 进行部署,然后移除一个旧的: maxSurge = 1, maxUnavailable = 0。使用此配置,Kubernetes 将启动一个额外的 Pod,然后停止一个“旧”的下来。
  • 通过移除一个 Pod 进行部署,然后添加一个新的: maxSurge = 0, maxUnavailable = 1。在这种情况下,Kubernetes 会在启动前先停止一个 Pod一个新的。
  • 通过尽快更新 Pod 进行部署: maxSurge = 1,maxUnavailable = 1。此配置大大减少了在应用程序版本之间切换所需的时间,但结合了前两者的缺点。

另见: