【问题标题】:offset Kubernetes pod scaling by a second将 Kubernetes pod 缩放偏移一秒
【发布时间】:2021-09-08 17:12:30
【问题描述】:

我有一个应用程序,我想并行扩展,但希望在每个新 pod 创建之间有一个短暂的暂停。

我需要这个,因为在创建 pod 期间我更新了一个文件,如果在下一个 pod 尝试打开并更新它时文件没有关闭,它将失败。

所以我只需要在 pod 打开和关闭这个文件之间有 1 秒的缓冲时间。

现在,如果发生规模并添加了 1 个以上的新 pod,它们会同时命中文件。所以一个 pod 会工作,另一个会失败,我必须等待 pod 超时让 k8s 杀死它并重新创建它,此时它会起作用,但是在我需要的时候在扩展事件期间浪费了很多宝贵的时间尽快新的 pod 来处理负载。

不确定我的搜索措辞是否正确,但无法在 k8s 网站上找到。任何想法都会有所帮助。

(附加说明,我知道在StatefulSet 上,默认情况下它会一次扩展 1 个 pod,但是,该方法要求所有 pod 都健康才能继续一次添加一个节点,如果任何 pod 变为unhealthy 它将停止扩展,直到所有 pod 再次健康为止。在高负载情况下,这不是理想的)

【问题讨论】:

  • 这是什么文件?如果文件是静态的并且不经常更改,那么您可以在部署中将文件挂载为 configMap,以便所有 pod 都具有相同的文件。或者您可以做的另一种方法是您可以使用 ReadWriteMany 访问权限将此文件挂载到 PVC 上,然后您的 pod 可以在启动时访问这些文件。
  • 我无权对文件管理执行任何操作(我无法移动它、更改其使用方式等)。基本上,我有一个 initContainer 在我的主容器启动之前运行,它使用新 pod 需要存在的数据更新这个文件。它似乎有某种策略,一次只允许 1 个并发连接。

标签: kubernetes kubernetes-pod horizontal-scaling


【解决方案1】:

你需要做一些工作才能实现它。

很少有“黑客/解决方案”

1。初始化容器

  • 将初始化容器添加到您的部署中
  • init 容器将写入/删除目标文件,如lock.txt
  • init 容器会检查这个文件是否存在,如果存在,他会等到文件被删除
  • 删除文件后,init 容器将退出,因此 pod 将“启动”

2。探测“PostStart”

  • PostStart 探针添加到您的 pod,它将读取所需 pod 的当前数量与实际数量,并在需要时执行缩放
apiVersion: v1
kind: Pod
metadata:
  name: lifecycle-demo
spec:
  containers:
  - name: ...
    image: ...
    lifecycle:
      postStart:
        exec:
          command: [<get the current number of pods from the replica> 
                    <check to see if you need to restart a new pod> 
                    <scale a new pod if required>]
      

3。定时任务

  • 使用 CronJob 扩展您的 pod,使用文件或配置映射来设置所需的 pod 数量。
  • 应用一个 Cron 作业来扩展您的 pod,当您到达所需的 pod 时,删除 CronJob

【讨论】:

    猜你喜欢
    • 2021-01-26
    • 2019-08-07
    • 1970-01-01
    • 2017-05-20
    • 1970-01-01
    • 2021-01-26
    • 2022-10-04
    • 2020-04-16
    • 1970-01-01
    相关资源
    最近更新 更多