Kubernetes节点自动缩放和对每个节点的Pod的精细控制

时间:2018-08-26 23:53:28

标签: kubernetes

我正在尝试在Kubernetes中复制Azure Batch API,我有一个Web API作为服务运行,并依次使用Kubernetes API动态创建批处理作业。

到目前为止很好。

我要解脱的地方通常是这些工作中的每个任务都对TensorFlow深度学习有一定的打击,因此理想情况下,我希望Kubernetes每个节点仅调度一个Pod,然后结合节点自动伸缩器来扩展我的集群根据需要。

在Azure批处理中,您可以按作业指定每个虚拟机的任务,类似于Kubernetes中每个节点的Pod。看来Kubernetes API中不支持此功能,只能通过kubelet max pods配置来使用,这并不理想,因为那比我想要的要难编码。

所以我的问题是有一种方法可以在作业规范上使用某种指标来迫使Kubernetes限制每个节点的pod实例。理想情况下,这是调度程序的一项主动决策,因为它不会调度pod只是为了以后才知道它没有资源。

1 个答案:

答案 0 :(得分:1)

您可以使用Pod相似性/反相似性规则来确保将特定应用程序的Pod安排在一个节点上,然后再在该节点上没有安排同一应用程序的其他Pod。

复制Redis from docs website的示例部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-cache
spec:
  selector:
    matchLabels:
      app: store
  replicas: 3
  template:
    metadata:
      labels:
        app: store
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - store
            topologyKey: "kubernetes.io/hostname"
      containers:
      - name: redis-server
        image: redis:3.2-alpine

这将确保在单个节点上-只有一个Redis缓存实例正在运行。一些重要的注意事项:

  1. 标签app=store对于识别应用程序很重要

  2. 使用标签-匹配节点的主机名来确定调度:topologyKey: "kubernetes.io/hostname"

  3. requiredDuringSchedulingIgnoredDuringExecution的扩展性确保在计划期间这是一个艰难的决定,如果不满足条件,则不会进行pod的计划。

请查看各种安排here的选项,以了解更多详细信息。