我正在尝试运行一个Kubernetes作业,它将在每个主机上部署相同的pod,并在每个pod中运行相同的命令(相同的执行)。集群worker01
,worker02
,…中有5个工人。,worker05
。这个定义在一个随机主机上调度一个pod:
apiVersion: batch/v1
kind: Job
metadata:
name: hdd-integrity
labels:
job: hdd-integrity
spec:
template:
spec:
containers:
- name: hdd-integrity
image: some-image
imagePullPolicy: IfNotPresent
command: ["python", "check.py"]
args:
- "--threads=88"
- "--md5=2a3f98b6eb50326cf69257c5c5fc7e35"
- "--dir=/mnt"
volumeMounts:
- name: store
mountPath: /mnt
restartPolicy: Never
volumes:
- name: store
persistentVolumeClaim:
claimName: subgrp1-subvol1-pvc
readOnly: false
backoffLimit: 1
所有的吊舱应该安装在相同的pvc上。不知道什么是实现这一目标的最佳方式。守护进程不能工作,因为它们不提供restartPolicy: Never
作业将被安排到一个随机节点,这是设计的。要在每个节点上运行工作负载,请使用daemonset。
守护进程确保所有(或部分)节点运行Pod的副本。作为节点被添加到集群中,pod被添加到集群中。当节点从集群中移除后,这些pod将被垃圾收集。删除一个守护进程将清理它创建的pod。
如果您想为特定的应用程序在每个节点上调度一个pod,那么在Kubernetes中正确的方法是使用Daemonset。
守护进程确保所有(或部分)节点运行Pod的副本。作为节点被添加到集群中,pod被添加到集群中。当节点从集群中移除后,这些pod将被垃圾收集。删除一个守护进程将清理它创建的pod。
此外,如果您想在不同的节点中调度每个pod,您可以查看pod反亲和概念。
DaemonSets没有restartPolicy: Never
,但是这个作业只需要运行一次。因此,一个简单的解决方案是使用jinja2模板:
{%- set workers = ["worker01", "worker02", "worker03", "worker04", "worker05"]
%}
{%- for w in workers %}
{%- set worker = w %}
---
apiVersion: batch/v1
kind: Job
metadata:
name: hdd-integrity-job-{{ worker }}
labels:
job: hdd-integrity
tag: "0.0.6"
spec:
template:
spec:
containers:
- name: hdd-integrity
image: my-image
imagePullPolicy: IfNotPresent
command: ["/bin/bash", "-c", "--"]
args:
- "time python check.py --threads=3"
volumeMounts:
- name: cephfs-store
mountPath: /mnt
nodeSelector:
node: {{ worker }}
restartPolicy: Never
volumes:
- name: cephfs-store
persistentVolumeClaim:
claimName: subgrp1-subvol1-pvc
readOnly: false
backoffLimit: 0
{%- endfor %}
pip install jinja2
alias render_template='python -c "from jinja2 import Template; import sys; print(Template(sys.stdin.read()).render());"'
cat hdd-integrity.yaml.j2 | render_template | kubectl apply -f -