问题描述
我正在尝试运行 Kubernetes 作业,该作业将在每个主机上部署相同的 Pod 并在每个 Pod 中运行相同的命令(相同的执行)。集群中有 5 个工作线程 worker01
,worker02
,...,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
所有的 pod 都应该挂载到同一个 pvc。不确定实现这一目标的最佳方法是什么。守护进程将无法工作,因为它们不提供 restartPolicy: Never
解决方法
作业将被安排到随机节点,这是设计使然。要在每个节点中运行工作负载,请使用 daemonset。
DaemonSet 确保所有(或部分)节点运行 Pod 的副本。作为 节点被添加到集群中,Pod 被添加到它们。由于节点是 从集群中移除后,这些 Pod 将被垃圾回收。删除一个 DaemonSet 将清理它创建的 Pod。
,如果您想为特定应用程序为每个节点安排一个 pod,在 Kubernetes 中这样做的正确方法是使用 Daemonset。
DaemonSet 确保所有(或部分)节点运行 Pod 的副本。作为 节点被添加到集群中,Pod 被添加到它们。由于节点是 从集群中移除后,这些 Pod 将被垃圾回收。删除一个 DaemonSet 将清理它创建的 Pod。
此外,如果您想将每个 Pod 安排在不同的节点中,您可以查看 pod anti-affinity 概念。
,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 -