自动创建多个 kubernetes 作业清单的方法

Automated way to create multiple kubernetes Job manifests

Cron 模板

kind: CronJob
metadata:
  name: some-example
  namespace: some-example
spec:
  schedule: "* 12 * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: some-example
            image: gcr.io/some-example/some-example
            imagePullPolicy: Always
            env:
             - name: REPO_URL
               value: https://example.com/12/some-example

我需要创建多个 REPO_URL 不同 URL 的作业文件保存在一个文件中。我正在寻找一种解决方案,我可以在其中设置作业模板并从另一个文件中获取所需的 key:value。

到目前为止,我已经尝试过 https://kustomize.io/, https://ballerina.io/, and https://github.com/mikefarah/yq。但是我找不到适合这种情况的很好的例子。

如果使用 yq 和 shell 脚本,那将是非常微不足道的。假设 你的模板在cronjob.yml,我们可以这样写:

let count=0
while read url; do
  yq -y '
    .metadata.name = "some-example-'"$count"'"|
    .spec.jobTemplate.spec.template.spec.containers[0].env[0].value = "'"$url"'"
  ' cronjob.yml
  echo '---'
  let count++
done < list_of_urls.txt | kubectl apply -f-

例如,如果我的 list_of_urls.txt 包含:

https://google.com
https://whosebug.com

以上脚本将产生:

[...]
metadata:
  name: some-example-0
  namespace: some-example
spec:
  [...]
              env:
                - name: REPO_URL
                  value: https://google.com
---
[...]
metadata:
  name: some-example-1
  namespace: some-example
spec:
  [...]
              env:
                - name: REPO_URL
                  value: https://whosebug.com

如果您只想查看 输出而不是实际创建资源。


或者对于更结构化的方法,我们可以使用 Ansible 的 k8s 模块:

- hosts: localhost
  gather_facts: false
  tasks:
    - k8s:
        state: present
        definition:
          apiVersion: batch/v1beta1
          kind: CronJob
          metadata:
            name: "some-example-{{ count }}"
            namespace: some-example
          spec:
            schedule: "* 12 * * *"
            jobTemplate:
              spec:
                template:
                  spec:
                    containers:
                    - name: some-example
                      image: gcr.io/some-example/some-example
                      imagePullPolicy: Always
                      env:
                       - name: REPO_URL
                         value: "{{ item }}"
      loop:
        - https://google.com
        - https://whosebug.com
      loop_control:
        index_var: count

假设以上存储在playbook.yml,运行这个用 ansible-playbook playbook.yml 将创建与 较早的 shell 脚本。