【问题标题】:Update a DaemonSet without downtime like a deployment更新 DaemonSet 而无需像部署那样停机
【发布时间】:2019-01-09 18:47:54
【问题描述】:

我想在任何节点上运行应用程序。每个节点应始终至少有一个实例,但允许更多实例,主要是在更新期间以防止该 pod(和节点)停机。

Kubernetes 部署更新通常通过启动一个新的 pod 来工作,一旦它可用,旧的就会终止。这是完美的,但在我的情况下,我需要一个 DaemonSet 来始终在所有节点上启动一个特定的应用程序。然而,当更新这个 DaemonSet 时,Kubernetes 会一个一个地杀死一个 pod(即逐个节点)然后然后启动一个新的 pod,这意味着在更新期间的任何给定时间,该 pod 都可能没有运行在一个节点上。

与部署相比,似乎 DaemonSet 是正确的方法,但在更新 DaemonSet 时我找不到任何方法来防止停机。有没有办法做到这一点?我还考虑过使用 Deployments 并手动更新副本数量和 antiPodAffinity,以便每个节点只部署一个 pod,但这有点 hacky。

【问题讨论】:

  • 这被搁置了 (github.com/kubernetes/kubernetes/pull/51161)。所以这是不可能的。
  • 另一种方法是蓝绿部署。运行旧的和新的守护程序集,然后一旦您满意不会发生回滚,您可以删除旧的守护程序集。作为不利因素,您会暂时将足迹翻倍。

标签: kubernetes


【解决方案1】:

关于添加此功能的讨论很长。你可以看到他们herehere

长话短说,这是不可能的。您可以尝试将 maxUnavailable: 0type: rollingUpdate 组合到您的 updateStrategy 中,但我认为这并未得到正式支持。

例子:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: my-daemonset
  labels:
    service: my-daemonset
spec:
  selector:
    matchLabels:
      service: my-daemonset
  updateStrategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 0
  template:
    metadata:
      labels:
        service: my-daemonset
    spec:
      containers:
      - name: daemonset-update
        image: my-image:latest

【讨论】:

  • 从今天开始,不允许使用 DeamonSet 将 maxUnavailable 设置为 0。
【解决方案2】:

从今天开始,可以使用 DeamonSet 执行滚动更新而无需停机!您需要在集群上运行至少 2 个节点,并在 DaemonSet 配置中将 maxUnavailable 设置为 1。

假设之前的配置,当推送更新时,第一个节点将开始更新。第二个将等到第一个完成。成功后,第二个也会这样做。

主要缺点是您需要保持 2 个节点连续运行,或者在更新之前/之后采取措施生成/杀死一个节点。

【讨论】:

  • 酷!我现在不能尝试,但我会的。您能否提供更改日志的链接或记录在哪里?
  • 除了 maxUnavailable 的文档外,我没有要链接的特定文档。您的用例与我的相似。最近几天我经历了一些事情,最终得到了这个答案中描述的内容。
【解决方案3】:

假设您的应用程序可以容忍每个节点有多个 pod(似乎是这种情况),您可以创建第二个 DaemonSet,并在您确定新的 DaemonSet 正常运行后删除原来的那个。 这个过程有点复杂,但它可以让您控制何时删除旧的 pod。

请注意,您最终会得到一个不同名称的 DaemonSet。如果这让您感到困扰,您可以再次重复该过程以恢复原来的名称。

【讨论】:

  • 不确定这是否可行,因为我在它上面运行了一个 http 服务器,所以它必须以某种方式重新路由?
  • @LucaSteeb,这适用于 OP,但您的需求似乎与 OP 的需求有很大不同,因此创建您自己的问题可能会更好。话虽如此...升级意味着用更新的版本替换您的 pod。如果在这方面没有太多经验,并且假设您的工作负载无法动态转移到另一个 Pod,您可能需要引入一些逻辑来防止旧 Pod 在新 Pod 运行时被分配新工作负载。这样,一旦所有旧 pod 完成工作负载,您就可以删除 DaemonSet。
  • 我是 OP :P 不管怎样,我不再从事这个项目了,所以对我个人而言,这无论如何都无关紧要了。
猜你喜欢
  • 2017-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-03
  • 2011-11-07
  • 1970-01-01
  • 2016-01-11
相关资源
最近更新 更多