将 Kubernetes pod 缩放偏移一秒

offset Kubernetes pod scaling by a second

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

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

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

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

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

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

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

几个“hacks/solutions”

1。初始化容器

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

2。探测 'PostStart'

  • 向您的 pods 添加一个 PostStart 探针,它将读取所需 pods 的当前数量与实际数量的对比,如果需要,执行一个比例
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 扩展您的 pods,使用文件或配置映射来设置所需的 pods 数量。
  • 应用可扩展 pods 的 Cron 作业,当您达到所需 pods 时删除 CronJob