【问题标题】:Kubernetes: maximum pod lifetimeKubernetes:最大 pod 生命周期
【发布时间】:2017-08-22 23:13:34
【问题描述】:

我使用 Kubernetes 1.6 和 Docker 来部署微服务的实例/pod。

我有一项服务需要定期从外部存储库中提取不断更新的数据。此更新可以在运行时手动触发,但该服务在此期间不可用。此外,始终在启动时检索最新数据,以便新启动的服务实例具有最新的外部数据。

因此,我想每小时(或其他频率)自动创建一个新的 pod,然后杀死旧的 pod。

从概念上讲,我似乎应该在部署中配置每个 pod 的最大生命周期,以便 Kubernetes 启动一个新实例/pod 并在最大生命周期已过期时终止旧实例/pod,同时确保始终存在至少在 pod 运行时。 但是,Kubernetes does not seem to provide a maximum pod lifetime

另外,由于启动过程中的数据更新,启动 Pod 需要 1-2 分钟才能准备好。

【问题讨论】:

  • 您可以将该数据存储在 pv 中,然后安排一个 cron 作业定期运行以更新数据存储?
  • @user2983542 听起来很干净,但不幸的是我无法直接访问该外部数据,因此除了定期提取之外别无他法。
  • 数据有多大?
  • @TarunLalwani 它各不相同,介于 500MB 和 10GB 之间。
  • 而且大部分时间都花在了引导过程中下载文件上? Rest程序启动时间快吗?

标签: docker kubernetes


【解决方案1】:

这意味着作为评论,但可能会成为答案。我将其发布为答案,以便该方法易于阅读。

所以我有可能对你有用的方法。您运行一个全局下载 pod,它将文件下载到特定文件夹中。假设下载每 1 小时发生一次。因此,您将创建一个类似22-08-2017-20-00 的文件夹,并创建一个名为latest 的文件。这个latest 文件的内容将是22-08-2017-20-00

下载器在获取新更新时,将创建一个新文件夹并将数据下载到该文件夹​​。下载数据后,会将最新文件夹的内容更改为该名称。

现在您的主应用程序 pod 将引用此主机卷,读取文件内容并使用该文件夹开始数据处理。

现在您应该运行几个副本。如果您设置 cron 并重新启动 pod,它们将快速启动(无需下载数据)并获取最新数据。您可以通过更改没有影响的虚假参数来进行滚动更新并进行滚动更新。

或者您也可以将 pod 设置为在 1 小时后失败。怎么做?确保你的图片有超时命令

$ time timeout 2 sleep 12

real    0m2.002s
user    0m0.000s
sys 0m0.000s

现在你不希望所有的 pod 同时失效,所以可以生成一个 50min 到 70min 之间的随机数,让每个 pod 在不同的时间失效,并被 k8s 自动重启

看看这个方法是否有意义

【讨论】:

  • 谢谢,看起来很有希望,我稍后再试。只是为了确保我正确理解了 timeout 命令:time 命令仅用于演示。 2 是 pod 应该死亡的值(即被随机值替换)。 12 只是“大于 2”,以确保某些东西的运行时间比所需的超时时间长。对吗?
  • 请注意,使用随机延迟是有风险的,因为如果随机延迟太小,可能没有足够的时间来重新启动已被杀死的第一个 pod(在两个 pod 运行的情况下)。解决这个问题的方法很简单,当然,它只需要对延迟随机化多加注意。
  • @Carsten,这种方法对你有用吗?
  • 我正在努力清理一开始就需要这样做的烂摊子,但它现在有效,谢谢!
【解决方案2】:

这里有一个可以帮助你的例子:https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/

apiVersion: v1
kind: Pod

metadata:
  labels:
    test: liveness
  name: liveness-exec
spec:
  containers:

  - name: liveness

    args:
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600

    image: gcr.io/google_containers/busybox

    livenessProbe:
      exec:
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 5
      periodSeconds: 5

使用运行状况检查,您可以强制在一段时间后重新安排容器。我认为这可能适合您的情况。

【讨论】:

  • 利用活性检查似乎是个好主意,但我看不出有一种方法可以确保在旧 pod 被杀死之前启动并准备好新 pod。
  • 在我看来,在我看来,应该有另一种替代方案,这并不意味着必须提取整个数据集(让服务在 1-2 分钟内无法使用)。值得检查其他替代方案,例如边车容器,因此您不必完全重新启动服务。 blog.kubernetes.io/2015/06/…
  • @Carsten 当您配置就绪探测时,它会自动工作 - 就绪后新的 pod 会添加到服务中,然后旧的 pod 会停止。
  • @JavierSalmeron 还有,我们到底为什么需要sleep 600
  • @Carsten 这是页面中的一个示例。在此示例中,它们没有守护进程,因此处于睡眠状态。在您的情况下,您必须在脚本或应用程序本身中指定某种逻辑。
猜你喜欢
  • 2021-01-03
  • 1970-01-01
  • 1970-01-01
  • 2017-06-23
  • 2021-09-27
  • 2019-08-13
  • 1970-01-01
  • 1970-01-01
  • 2018-05-17
相关资源
最近更新 更多