Kubernetes在目录中并行化多个示例

时间:2018-12-10 00:08:31

标签: docker kubernetes azure-aks

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

谢谢您的帮助。

2 个答案:

答案 0 :(得分: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 Scheduler,它永远不要在由拓扑密钥定义的域中将两个应用标签为zk的Pod并置。 topologyKey kubernetes.io/hostname表示该域是单个节点。使用不同的规则,标签和选择器,您可以扩展此技术,以在物理,网络和电源故障域中分布整个集合

答案 1 :(得分:0)

如何/在哪里存储样本?您可以将它们(或指向实际样本的指针)加载到像Kafka这样的队列中,并让应用程序一次检索每个样本,然后在计算后将其上传到Blob。然后,您甚至可以确保如果计算失败,则另一个pod将接管它并重新启动计算。