1

我能够在 AKS 上启动并运行 kubernetes 作业(使用 docker hub 映像处理生物样本,然后将输出上传到 blob 存储 - 这是通过我在 yaml 文件的 args 部分中提供的 bash 命令完成的)。但是,我有 20 个样本,并且想启动 20 个节点,以便我可以并行处理样本(每个节点一个样本)。如何将每个样本发送到不同的节点?yaml 文件中的“并行”选项处理 20 个节点中每个节点上的所有 20 个样本,这不是我想要的。

感谢您的帮助。

4

2 回答 2

1

如果您希望作业的每个实例位于不同的节点上,您可以使用 daemonSet,这正是它所做的,为每个工作节点提供 1 个 pod。

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd-elasticsearch
  namespace: kube-system
  labels:
    k8s-app: fluentd-logging
spec:
  selector:
    matchLabels:
      name: fluentd-elasticsearch
  template:
    metadata:
      labels:
        name: fluentd-elasticsearch
    spec:
      tolerations:
      - key: node-role.kubernetes.io/master
        effect: NoSchedule
      containers:
      - name: fluentd-elasticsearch
        image: k8s.gcr.io/fluentd-elasticsearch:1.20
        resources:
          limits:
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 200Mi
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
      terminationGracePeriodSeconds: 30
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers

https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/

另一种方法 - 使用 pod 反亲和性:

  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        - labelSelector:
            matchExpressions:
              - key: "app"
                operator: In
                values:
                - zk
          topologyKey: "kubernetes.io/hostname"

requiredDuringSchedulingIgnoredDuringExecution 字段告诉 Kubernetes 调度程序,它不应该将两个应用标签为 zk 的 Pod 放在由 topologyKey 定义的域中。topologyKey kubernetes.io/hostname 表示该域是一个单独的节点。使用不同的规则、标签和选择器,您可以扩展此技术以将您的集合分散到物理、网络和电源故障域

于 2018-12-10T06:09:13.223 回答
0

样本的存储方式/位置?您可以将它们(或指向实际样本的指针)加载到 Kafka 之类的队列中,让应用程序检索每个样本一次,并在计算后将其上传到 blob。然后,您甚至可以保证,如果计算失败,另一个 pod 将接收它并重新启动计算。

于 2018-12-10T23:06:14.693 回答