使用不同主机上的复制容器安排作业

问题描述

我正在尝试运行 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 -

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...