自动创建多个 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 脚本。
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 脚本。