0

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

4

3 回答 3

1

如果您想为特定应用程序的每个节点安排一个 pod,在 Kubernetes 中这样做的正确方法是使用Daemonset

DaemonSet 确保所有(或部分)节点运行 Pod 的副本。随着节点被添加到集群中,Pod 也被添加到它们中。当从集群中删除节点时,这些 Pod 会被垃圾回收。删除 DaemonSet 将清理它创建的 Pod。

此外,如果您想将每个 pod 安排在不同的节点中,您可以查看pod 反亲和性概念。

于 2021-01-28T06:36:20.933 回答
1

作业将被安排到一个随机节点,这是设计使然。要在每个节点中运行工作负载,请使用daemonset

DaemonSet 确保所有(或部分)节点运行 Pod 的副本。随着节点被添加到集群中,Pod 也被添加到它们中。当从集群中删除节点时,这些 Pod 会被垃圾回收。删除 DaemonSet 将清理它创建的 Pod。

于 2021-01-28T06:34:37.280 回答
0

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 -
于 2021-01-29T03:38:47.280 回答