Kubernetes部署滚动更新

Kubernetes部署滚动更新,kubernetes,kubernetes-deployment,Kubernetes,Kubernetes Deployment,我在Kubernetes上部署了一个应用程序 这个应用程序有4个副本,我正在对每个部署进行滚动更新 此应用程序有一个优雅的关机过程,可能需要数十分钟(它必须等待正在运行的任务完成) 我的问题是,在更新期间,我的容量过大,因为所有旧版本的pod在创建所有新pod时都处于“终止”状态 在更新过程中,我最终运行了8个容器,这是我试图避免的 我尝试将maxsupge设置为0,但此设置没有考虑“终止”POD,因此部署期间服务器上的负载太高 我试图得到的行为是,只有在旧版本的pod成功完成后,才能创建新的p

我在Kubernetes上部署了一个应用程序

这个应用程序有4个副本,我正在对每个部署进行滚动更新

此应用程序有一个优雅的关机过程,可能需要数十分钟(它必须等待正在运行的任务完成)

我的问题是,在更新期间,我的容量过大,因为所有旧版本的pod在创建所有新pod时都处于“终止”状态

在更新过程中,我最终运行了8个容器,这是我试图避免的

我尝试将
maxsupge
设置为0,但此设置没有考虑“终止”POD,因此部署期间服务器上的负载太高

我试图得到的行为是,只有在旧版本的pod成功完成后,才能创建新的pod,因此我始终没有超过我设置的副本数量


我想知道是否有办法实现这种行为。

让我提出以下策略:

  • 部署实现了就绪吊舱的概念,以帮助滚动更新准备就绪探测器允许部署逐步更新POD,同时让您控制确定滚动更新何时可以继续

  • 就绪pod是指部署认为已成功更新的pod,不再计入部署的激增计数。如果pod就绪探测成功并且自pod创建以来已通过
    spec.minReadySeconds
    ,则认为pod已就绪。这些选项的默认值将导致一个pod在其容器启动时立即就绪

  • 因此,您可以做的是(如果您还没有这样做的话)为您的POD实现一个
    spec.minReadySeconds
    设置一个值,该值将对POD终止所需的时间有意义(最坏情况)

    这将确保根据您的需求逐步推出

    除此之外,别忘了为卷展设定一个截止日期。
    默认情况下,在卷展栏无法在10分钟内取得任何进展后,它将被视为失败。部署失败的时间可以通过部署规范中的
    progressDeadlineSeconds
    属性进行配置。

    我最后做的是使用
    podManagementPolicy:Parallel
    updateStrategy
    创建一个
    statefolset

    我还将
    terminationGracePeriodSeconds
    设置为pod终止所需的最长时间

    作为部署过程的一部分,我对新映像应用新的
    StatefulSet
    ,然后删除所有正在运行的pod

    通过这种方式,所有pod都将进入终止状态,每当pod完成其任务并终止时,一个新pod将用新映像替换它


    通过这种方式,我可以在整个部署过程中保持静态数量的副本。

    使用
    maxsupge
    您可以告诉kubernetes您允许多少个pod生存在所需的数量上。您是否尝试将
    maxUnavailable
    设置为1?更新过程中可能会有大量的播客不可用。这不会减少播客数量,因为每次部署都需要几个小时,因为它将逐个替换播客。将minReadySeconds设置为一小时将导致我的部署太慢,因为可能需要几个小时才能准备好所有播客。我不确定你的意思是什么“将导致我的部署太慢”。卷展过程将很慢,您将没有任何停机时间。请注意,这是您在问题中要求的:“只有在旧版本的POD成功完成后,才会创建POD“。请澄清。我还有另一项要求,即任何时候都不得超过副本的数量。