Kubernetes 根据模板和列表创建多个 Job

92次阅读
没有评论

问题描述

在迁移到 Kubernetes 集群时,用户面临一个需求,需要对多个不同的客户或公司的数据进行处理,并且希望能够按照客户的基础进行数据处理。用户已经创建了一个包含脚本的容器,通过向脚本传递客户的 ID,实现了对单个客户数据的处理。这个需求需要定时为一个或多个客户运行。

用户目前已经成功地使用了一个 CronJob 的定义,针对客户 756 运行,而且效果符合预期。CronJob 的定义如下:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: image-puller-756
spec:
  schedule: "30 * * * *"
  concurrencyPolicy: Forbid
  jobTemplate:
    spec:
      template:
        spec:
          containers:
            - name: image-puller-756
              image: index.docker.io/my_company/image_puller:latest
              imagePullPolicy: Always
              env:
                - name: ALLOW_TTY
                  value: "true"
                - name: PYTHONUNBUFFERED
                  value: "0"
                - name: prodDbUser
                  valueFrom:
                    secretKeyRef:
                      name: image-creds
                      key: username
                - name: prodDbPass
                  valueFrom:
                    secretKeyRef:
                      name: image-creds
                      key: password
              command: ["/bin/bash"]
              args: ["-c", "/usr/bin/python3 -u /go/bin/main.py -c 756"]
          restartPolicy: Never
          imagePullSecrets:
            - name: myregistrykey

现在用户需要一种更好的方式来管理 ~500 个不同客户的类似 CronJob 定义,并将它们应用到 Kubernetes 集群中。用户目前使用模板文件并在客户列表中进行查找和替换,但希望能找到一种更好的方式来管理。每个客户根据一些逻辑只会运行特定的处理流程,用户希望能够运行另一个进程,以动态地为客户添加或删除作业。

解决方案

请注意以下操作可能涉及 Kubernetes 的高级特性,确保在操作之前对 Kubernetes 有足够的了解,并进行适当的测试。

方案1: 使用 Helm 模板

Helm 是 Kubernetes 的包管理工具,可以用来管理预定义的 Kubernetes 资源模板。用户可以使用 Helm 来管理他们的客户作业定义。

以下是使用 Helm 的步骤:

  1. 创建一个 Helm Chart,该 Chart 包含一个 CronJob 定义的模板,并将客户 ID 作为参数。
  2. 使用 Helm 的模板语法,在 Chart 中使用传入的客户 ID 填充 CronJob 定义中的相关部分。
  3. 创建一个客户列表,可以是一个 JSON 文件,包含所有客户的 ID。
  4. 编写一个脚本或工具,该脚本循环遍历客户列表,并使用 Helm 部署每个客户的 CronJob。

这种方式允许用户使用 Helm 的模板功能来管理大量客户的 CronJob,简化了管理过程。

方案2: 自定义 Kubernetes 控制器

如果用户需要更加灵活的管理方式,可以考虑编写自定义 Kubernetes 控制器。用户可以扩展 Kubernetes API,以便定义一个客户资源,然后编写自定义控制器来监视该资源并根据需要创建或删除 CronJob。

以下是实现自定义控制器的基本步骤:

  1. 定义一个客户自定义资源(Custom Resource Definition,CRD),用于表示客户。该 CRD 可以包含客户 ID 和其他与客户相关的信息。
  2. 编写一个控制器,该控制器监视客户资源的创建和删除事件。
  3. 当有新的客户资源创建时,控制器可以根据模板创建对应的 CronJob 定义。
  4. 当客户资源被删除时,控制器相应地删除相关的 CronJob。

这种方式需要编写更多的代码,但可以实现更灵活的管理,适用于用户有定制化需求的情况。

请根据用户的具体需求选择适合的方式来管理客户的 CronJob 定义。

正文完