我正在尝试在Kubernetes中复制Azure Batch API,我有一个Web API作为服务运行,并依次使用Kubernetes API动态创建批处理作业。
到目前为止很好。
我要解脱的地方通常是这些工作中的每个任务都对TensorFlow深度学习有一定的打击,因此理想情况下,我希望Kubernetes每个节点仅调度一个Pod,然后结合节点自动伸缩器来扩展我的集群根据需要。
在Azure批处理中,您可以按作业指定每个虚拟机的任务,类似于Kubernetes中每个节点的Pod。看来Kubernetes API中不支持此功能,只能通过kubelet max pods配置来使用,这并不理想,因为那比我想要的要难编码。
所以我的问题是有一种方法可以在作业规范上使用某种指标来迫使Kubernetes限制每个节点的pod实例。理想情况下,这是调度程序的一项主动决策,因为它不会调度pod只是为了以后才知道它没有资源。
答案 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缓存实例正在运行。一些重要的注意事项:
标签app=store
对于识别应用程序很重要
使用标签-匹配节点的主机名来确定调度:topologyKey: "kubernetes.io/hostname"
requiredDuringSchedulingIgnoredDuringExecution
的扩展性确保在计划期间这是一个艰难的决定,如果不满足条件,则不会进行pod的计划。
请查看各种安排here的选项,以了解更多详细信息。