如何防止 GCE Kubernetes pod 在 GPU 实例上工作?
How to prevent a GCE Kubernetes pod from working on a GPU instance?
我的项目使用 Google Cloud Platform。
现在,我有一个包含 4 个节点池的集群:
- "micro-pool":使用最少的机器来管理集群
- "cpu-pool":只有 cpu 机器用于不需要 GPU 的进程
- 2 "gpu-pools":两个池中的机器附有 GPU。
现在,我需要的是让我的 CPU 进程永远不会在 GPU 机器上运行,因为它们会花费太多时间,而在 GPU 机器上这样做只会白花钱。
我 运行 我的 pods 使用
kubectl run dc-1 --image={image-name} --replicas=1 --restart=Never --limits="nvidia.com/gpu=0,cpu=4000m,memory=2Gi" -- bash -c "command to execute"
现在,如果没有从以前的 GPU 运行 创建的 "GPU-machines",这可以正常工作。但是,如果有一个非常新的 GPU 运行,此命令将在该实例上 运行,因为它具有最低 cpu 和内存要求。我认为 --limits="nvidia.com/gpu=0
可以解决问题,但显然没有。
我该怎么办?
如果您想在特定实例或节点上分配 pod,您可以使用 kubernetes 节点选择器
例如:
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
env: test
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
nodeSelector:
disktype: ssd
这里会根据磁盘类型的节点选择器分配pod。
您还可以查看此 url 以获取更多文档:https://kubernetes.io/docs/concepts/configuration/assign-pod-node
编辑 1:
因为你在 GCP 上,你也可以使用这种方式:
nodeSelector:
#<labelname>:value
cloud.google.com/gke-nodepool: pool-highcpu8 (poolname)
编辑 2:
如果您了解 affinity
和 anity-affinity
,您也可以实施它。
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/node-type
operator: In
values:
- gpu
对于cpu:
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: resources
operator: In
values:
- cpu-only
这是 taints and tolerations 的一个很好的用例。您可以使用 NoSchedule 污染 GPU 节点。这将防止pods(甚至系统pods)无法容忍GPU节点运行上的污点
kubectl taint nodes gpuNode1 nodetype=gpu:NoSchedule
然后,在 pods 上,您确实希望在这些节点上 运行,您可以添加对污点的容忍度:
tolerations:
- key: "nodetype"
operator: "Equal"
value: "gpu"
effect: "NoSchedule"
我不确定在 GCP 上,但在 Azure 的 AKS 上,您可以在创建集群和节点池时配置污点。
编辑:
您需要将此与 Harsh Manvar 对节点选择器 and/or 亲和力的建议结合起来。仅仅因为您的 pod 可以容忍污点,并不意味着它肯定会被安排在 GPU 节点上,它只是确保其他事情不会。
我的项目使用 Google Cloud Platform。
现在,我有一个包含 4 个节点池的集群:
- "micro-pool":使用最少的机器来管理集群
- "cpu-pool":只有 cpu 机器用于不需要 GPU 的进程
- 2 "gpu-pools":两个池中的机器附有 GPU。
现在,我需要的是让我的 CPU 进程永远不会在 GPU 机器上运行,因为它们会花费太多时间,而在 GPU 机器上这样做只会白花钱。
我 运行 我的 pods 使用
kubectl run dc-1 --image={image-name} --replicas=1 --restart=Never --limits="nvidia.com/gpu=0,cpu=4000m,memory=2Gi" -- bash -c "command to execute"
现在,如果没有从以前的 GPU 运行 创建的 "GPU-machines",这可以正常工作。但是,如果有一个非常新的 GPU 运行,此命令将在该实例上 运行,因为它具有最低 cpu 和内存要求。我认为 --limits="nvidia.com/gpu=0
可以解决问题,但显然没有。
我该怎么办?
如果您想在特定实例或节点上分配 pod,您可以使用 kubernetes 节点选择器
例如:
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
env: test
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
nodeSelector:
disktype: ssd
这里会根据磁盘类型的节点选择器分配pod。
您还可以查看此 url 以获取更多文档:https://kubernetes.io/docs/concepts/configuration/assign-pod-node
编辑 1:
因为你在 GCP 上,你也可以使用这种方式:
nodeSelector:
#<labelname>:value
cloud.google.com/gke-nodepool: pool-highcpu8 (poolname)
编辑 2:
如果您了解 affinity
和 anity-affinity
,您也可以实施它。
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/node-type
operator: In
values:
- gpu
对于cpu:
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: resources
operator: In
values:
- cpu-only
这是 taints and tolerations 的一个很好的用例。您可以使用 NoSchedule 污染 GPU 节点。这将防止pods(甚至系统pods)无法容忍GPU节点运行上的污点
kubectl taint nodes gpuNode1 nodetype=gpu:NoSchedule
然后,在 pods 上,您确实希望在这些节点上 运行,您可以添加对污点的容忍度:
tolerations:
- key: "nodetype"
operator: "Equal"
value: "gpu"
effect: "NoSchedule"
我不确定在 GCP 上,但在 Azure 的 AKS 上,您可以在创建集群和节点池时配置污点。
编辑:
您需要将此与 Harsh Manvar 对节点选择器 and/or 亲和力的建议结合起来。仅仅因为您的 pod 可以容忍污点,并不意味着它肯定会被安排在 GPU 节点上,它只是确保其他事情不会。