如何防止 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

如果您了解 affinityanity-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 节点上,它只是确保其他事情不会。