对 DaemonSet 执行滚动更新

    • Kubernetes 1.6 或者更高版本中才支持 DaemonSet 滚动更新功能。

    DaemonSet 有两种更新策略:

    • OnDelete: 使用 更新策略时,在更新 DaemonSet 模板后,只有当您手动删除老的 DaemonSet pods 之后,新的 DaemonSet pods *才会*被自动创建。跟 Kubernetes 1.6 以前的版本类似。
    • RollingUpdate: 这是默认的更新策略。使用 RollingUpdate 更新策略时,在更新 DaemonSet 模板后,老的 DaemonSet pods 将被终止,并且将以受控方式自动创建新的 DaemonSet pods。

    要启用 DaemonSet 的滚动更新功能,必须设置 .spec.updateStrategy.typeRollingUpdate

    您可能想设置.spec.updateStrategy.rollingUpdate.maxUnavailable (默认为 1) 和 (默认为 0)。

    首先,检查 DaemonSet 的更新策略,确保已经将其设置为 RollingUpdate:

    如果还没在系统中创建 DaemonSet,请使用以下命令检查 DaemonSet 的清单:

      两个命令的输出都应该为:

      1. RollingUpdate

      如果输出不是 ,请返回并相应地修改 DaemonSet 对象或者清单。

      验证 DaemonSet 清单的更新策略后,创建 DaemonSet:

      1. kubectl create -f ds.yaml

      或者,您打算使用 kubectl apply 更新 DaemonSet,请使用 kubectl apply 创建相同的 DaemonSet。

      RollingUpdate DaemonSet .spec.template 的任何更新都将触发滚动更新。这可以通过几个不同的 kubectl 命令来完成。

      声明式命令

      如果您使用来更新 DaemonSets,请使用 kubectl apply:

      1. kubectl apply -f ds-v2.yaml

      命令式命令

      如果您使用来更新 DaemonSets,请使用 或者 kubectl patch:

      1. kubectl edit ds/<daemonset-name>
      1. kubectl patch ds/<daemonset-name> -p=<strategic-merge-patch>
      只更新容器镜像

      如果您只需要更新 DaemonSet 模板里的容器镜像,比如,.spec.template.spec.containers[*].image, 请使用 kubectl set image:

      最后,观察 DaemonSet 最新滚动更新的进度:

      1. kubectl rollout status ds/<daemonset-name>
      1. daemonset "<daemonset-name>" successfully rolled out

      有时,DaemonSet 滚动更新可能会卡住。可能原因如下:

      一些节点资源用尽

      由于新 DaemonSet pods 无法调度到至少一个节点时,滚动更新就会卡住。这可能是由于节点已经资源用尽

      发生这种情况时,通过对 kubectl get nodes 和下面命令行的输出作比较,找出没有调度部署 DaemonSet pods 的节点:

      一旦找到这些节点,从节点上删除一些非 DaemonSet pods,为新的 DaemonSet pods 腾出空间。

      滚动更新中断

      如果最近的 DaemonSet 模板更新被破坏了,比如,容器处于崩溃循环状态或者容器镜像不存在(通常由于拼写错误),就会发生 DaemonSet 滚动更新中断。

      要解决此问题,只需再次更新 DaemonSet 模板即可。以前不健康的滚动更新不会阻止新的滚动更新。

      时钟偏差

      • 查看