【问题标题】:How do I update container image in a multi container pod如何更新多容器 pod 中的容器映像
【发布时间】:2019-06-04 05:25:48
【问题描述】:

我正在运行一个包含三个容器的 pod。需要在不进行滚动升级的情况下更新其中一个容器的映像。

如何在不接触/重新启动其他两个容器的情况下更新容器映像?

【问题讨论】:

  • 只有在容器紧密耦合的情况下,我们才会选择多容器 pod。如果只重启 1 个容器,当 1 个容器不可用时 POD 的状态应该是什么?它仍然是服务流量吗?因此,通过适当的滚动更新重新启动 pod 是非常有意义的!

标签: kubernetes


【解决方案1】:

如果你问自己这个问题,也许你应该重新考虑一些事情。

正如其他评论/答案中所述,一旦创建的 pod 就是其中的一个单元。

如果您需要扩展 pod 的一部分而不是其余部分,或者只更新一部分并且不想重新启动其余部分(例如缓存系统),您应该考虑取出容器从您的部署中提取并创建另一个独立的部署。

【讨论】:

    【解决方案2】:

    您必须删除并重新创建整个 Pod。如果您查看 Kubernetes PodSpec 的 API 定义,containersinitContainers 字段都包含短语无法更新。 Pod 一经创建便不可变,并且各种更高的关卡对象通过创建和销毁 Pod 来工作。

    在我习惯的标准做法中:

    • 始终使用更高级别的对象来管理您的容器,最常见的是部署;不要直接在 Pod 中交易。您可以更改部署规范中嵌入的 Pod 规范,部署控制器将创建与新规范匹配的新 Pod,然后拆除旧 Pod(即零停机滚动升级)。

    • 尽可能在 Pod 中只放置一个容器。您提到了initContainer,所以这对您来说可能不是 100%,但实现“更新 A 而不重新启动 B”的唯一方法是让它们位于不同的 Pod 中(因此也位于不同的部署中)。

    • 不要因为重新启动而紧张。如果一个节点失败,或者你需要像你展示的那样更新一个容器镜像,或者在其他一些情况下,一个 Pod 可能会被停止和删除,而一个新的 Pod 会在它的位置上启动。这是完全正常的,如果您有一个具有多个副本的部署,则相当透明。您的应用程序可能需要做一些工作才能在这种环境中感到满意(而不是将状态仅保存在内存或本地磁盘中)。

    【讨论】:

      【解决方案3】:

      我认为你不能,因为 pod 是一个原子单元,包含所有容器。

      【讨论】:

        猜你喜欢
        • 2018-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多