【问题标题】:Automated way to create multiple kubernetes Job manifests创建多个 Kubernetes 作业清单的自动化方式
【发布时间】:2021-02-18 13:37:51
【问题描述】:

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

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

到目前为止,我已经尝试过 https://kustomize.io/https://ballerina.io/https://github.com/mikefarah/yq。但我找不到适合该场景的好例子。

【问题讨论】:

    标签: kubernetes automation manifest kustomize yq


    【解决方案1】:

    这对于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://stackoverflow.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://stackoverflow.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://stackoverflow.com
          loop_control:
            index_var: count
    

    假设上面的内容存储在playbook.yml,运行这个 ansible-playbook playbook.yml 将创建与 早期的 shell 脚本。

    【讨论】:

    • ansible 将是另一个不可行的工具,YQ / bash 看起来很有希望,感谢您抽出宝贵的时间。
    猜你喜欢
    • 2016-07-22
    • 2022-10-13
    • 2021-12-22
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    • 1970-01-01
    • 2021-06-02
    • 2018-11-03
    相关资源
    最近更新 更多