【问题标题】:Horizontal Pod Autoscaling (HPA) with an initContainer that requires a Job带有需要作业的 initContainer 的水平 Pod 自动缩放 (HPA)
【发布时间】:2021-08-09 04:42:42
【问题描述】:

我有一个特定的场景,我希望通过水平 pod 自动缩放来控制部署。为了在推送新部署时处理 pod 中的数据库迁移,我遵循了 Andrew Lock here 的这篇优秀教程。

简而言之,您必须为 Kubernetes Job 定义一个 initContainerwaits,以在新的 Pod 运行之前完成一个进程(如运行 db 迁移)。

这很好用,但是,我不确定在初始部署后如何处理 HPA,因为如果系统检测到需要在我的节点中添加另一个 Pod,我的部署中定义的 initContainer 需要一个 @ 987654327@ 将被部署和运行,但由于Jobs 是一次性进程,因此 pod 无法正常初始化和运行(ttlSecondsAfterFinished 属性无论如何都会删除Job)。

如何定义initContainer 在部署应用程序时运行,以便我可以在Job 中推送我的数据库迁移,同时还允许HPA 控制动态添加Pod 而无需initContainer

这是我的deployment 的样子:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: graphql-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: graphql-pod
  template:
    metadata:
      labels:
        app: graphql-pod
    spec:
      initContainers:
        - name: wait-for-graphql-migration-job
          image: groundnuty/k8s-wait-for:v1.4 # This is an image that waits for a process to complete
          args:
            - job
            - graphql-migration-job # this job is defined next
      containers:
        - name: graphql-container
          image: image(graphql):tag(graphql)

下面的Job也部署了

apiVersion: batch/v1
kind: Job
metadata:
  name: graphql-migration-job
spec:
  ttlSecondsAfterFinished: 30
  template:
    spec:
      containers:
      - name: graphql-migration-container
        image: image(graphql):tag(graphql)
        command: ["npm", "run", "migrate:reset"]
      restartPolicy: Never

所以基本上发生的事情是:

  • 我将这两个资源部署到我的节点
  • Job 已初始化
  • initContainer on Pod 使用名为 groundnuty/k8s-wait-for:v1.4 的图像等待 Job 完成
  • Job 完成
  • initContainer 完成
  • Pod 初始化
  • (30 TTL 秒后)Job 从节点中删除

(大量流量)

  • HPA 意识到需要另一个 pod
  • initContainer for NEW pod 已启动,但无法运行,因为 Job 不存在
  • ...crashLoopBackOff

希望对处理这种情况的正确方法有任何见解!

【问题讨论】:

  • 是否需要为每个新 pod 运行作业,或者这只是一件事?
  • @papanito 好问题,只有在初始部署时运行作业才重要。除此之外,不,作业只是运行我的数据库迁移脚本,在水平自动缩放时不需要运行。 initContainer 和 wait-for 的有用特性是它在作业完成之前不会运行任何新的 pod,然后扩展新的 pod 并删除旧的 pod,这样就不会停机

标签: kubernetes kubernetes-pod horizontal-pod-autoscaling


【解决方案1】:

很遗憾,没有简单的 Kubernetes 功能可以解决您的问题。

我建议扩展您的部署工具/脚本以将迁移作业和您的部署分开。在部署过程中,您首先执行迁移作业,然后部署您的部署。如果没有附加作业,HPA 可以很好地扩展您的 pod。

有很多方法可以实现这一点:

  • 首先有一个 bash 等脚本来执行作业,等待然后更新您的部署
  • 利用 Helm 等更复杂的部署工具,它允许您在工作中添加 'pre-install hook',以便在部署应用程序时执行它们

【讨论】:

  • 嗨 Lukas - 感谢您的真实回应,因为我认为这可能是场景。为了以防万一还有其他选项,我将把它保持开放一段时间,但预安装挂钩似乎是最好的折衷方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 2021-01-26
  • 2021-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多