跳到内容

滚动更新

升级和修改 Kubernetes 集群通常需要替换云实例。为了避免服务中断和其他问题,kOps 使用滚动更新来逐步替换云实例。

滚动更新使用 kops rolling-update cluster 命令 执行。

实例选择

如果以下至少一个条件成立,则会选择云实例进行更新(替换)

  • 该实例使用比最后一次 kops update cluster 生成的规范更旧的规范创建的。
  • 该实例由于之前(失败或中断)的滚动更新而被分离用于激增。
  • 该节点具有 kops.k8s.io/needs-update 注解。
  • --force 标志被传递给 kops rolling-update cluster 命令。

实例组顺序

滚动更新将一次更新一个实例组中的实例。首先,它将更新堡垒机实例组。接下来,它将更新主实例组,然后是 apiserver 实例组。最后,它将更新节点实例组。在同一个实例组角色中,它将按字母顺序更新实例组。

可以使用 --instance-group-roles 标志将滚动更新限制为特定角色的实例组(“堡垒机”、“主”、“APIServer”和/或“节点”)。可以使用 --instance-group 标志将滚动更新限制为特定的实例组。

更新实例组

滚动更新在更新实例组时,首先会验证集群,就像 kops validate cluster 命令 一样。如果集群此时验证失败,则整个滚动更新将停止并出现错误。

接下来,滚动更新会将 PreferNoSchedule(软)污染应用于该实例组的已选定要更新的节点。这将阻止新的 Pod(包括被逐出的 Pod 的替换)调度到旧节点上,除非没有其他地方可以调度它们。

如果以下任何一个条件成立,则不会执行此验证和污染

  • 该实例组的角色是“堡垒机”。
  • --cloudonly 标志被传递给 kops rolling-update cluster 命令。

最后,滚动更新将替换该实例组的已选定节点,并遵守该组滚动更新策略中配置的限制。

更新实例

在被更新时,节点首先会被隔离,以防止任何新的 Pod 被调度到它上面。隔离还会导致某些云提供商的负载均衡器将该节点从可用目标集中移除。接下来,节点会被排空,自愿地逐出所有未由 DaemonSet 管理的 Pod。此逐出操作会尊重任何 Pod 中断预算。

在所有此类 Pod 被逐出后,滚动更新会等待 5 秒,以便这些 Pod 的 TCP 连接关闭。可以使用 --post-drain-delay 标志更改等待时间。

如果以下任何一个条件成立,实例将不会被隔离或排空

  • 它们是堡垒机。
  • 它们没有注册为节点。
  • --cloudonly 标志被传递给 kops rolling-update cluster 命令。

然后,滚动更新会终止实例。除非该实例已被分离用于激增,否则这会导致云提供商使用当前规范创建一个新的实例。

然后,滚动更新等待 15 秒,以便 Kubernetes APIserver 注意到终止操作。可以使用 --bastion-interval--master-interval 和/或 --node-interval 标志更改等待时间。

除非传递了 --cloudonly 标志,否则滚动更新会等待集群成功验证。这样做是为了确保替换实例在滚动更新继续更新其他实例之前正常工作。

可配置的滚动更新策略

滚动更新在实例组内的行为可以通过该组 InstanceGroupSpec 中的 rollingUpdate 字段进行配置。

集群范围的默认值可以通过 ClusterSpec 中的 rollingUpdate 字段进行配置。

maxUnavailable

maxUnavailable 字段指定在滚动更新期间允许不可用的节点最大数量。增加此设置允许并行更新更多实例。

该值可以是绝对值(例如 5)或该组节点的百分比(例如“10%”)。绝对值是通过向下取整从百分比计算得出的。

例如,要允许并行更新两个实例

spec:
  rollingUpdate:
    maxUnavailable: 2

如果 maxSurge 字段为 0,则此字段默认为 1,否则默认为 0

如果没有使用当前规范创建的实例,则滚动更新将从更新单个实例开始。这样做是为了限制在新的规范导致节点无法正常工作的情况下造成的损害。

maxSurge

激增是在滚动更新期间暂时增加实例组中的实例数量。它不是先排空和终止实例,然后再创建新的实例,而是有效地先创建新的实例,然后再排空和终止旧实例。

激增是通过“分离”实例实现的,使得它们不计入实例组中所需的实例数量。这会导致云提供商创建新的实例,以满足该组所需的实例数量。分离的实例最后被排空和终止;当它们被终止时,云提供商不会替换它们。

maxSurge 是在更新期间可以创建的额外实例的最大数量。增加此设置允许并行更新更多实例。滚动更新不会创建超过为更新选择的实例数量的新实例。

该值可以是绝对值(例如 5)或该组节点的百分比(例如“10%”)。绝对值是通过向上取整从百分比计算得出的。

主节点无法激增。任何集群范围的默认设置都将被忽略,不会应用于角色为“主”的实例组。在 InstanceGroupSpec 中为角色为“主”的实例组设置此值会导致 API 验证错误。

例如,要在滚动更新期间将组中最多添加两个额外实例,并允许并行更新两个实例

spec:
  rollingUpdate:
    maxSurge: 2

如果没有使用当前规范创建的实例,则滚动更新将从创建单个新实例开始。这样做是为了限制在新的规范导致节点无法正常工作的情况下造成的损害。一旦新的实例成功验证,它就会创建任何剩余的激增实例。

禁用滚动更新

可以通过将 `drainAndTerminate` 字段设置为 `false` 来部分禁用实例组的滚动更新。

spec:
  rollingUpdate:
    drainAndTerminate: false

需要更新的节点仍然会受到污染。如果 `maxSurge` 不为零,则最多会创建 `maxSurge` 个额外节点。