【问题标题】:How to scale up GPU Nodes with autoscaler on AWS如何在 AWS 上使用自动扩缩器扩展 GPU 节点
【发布时间】:2018-11-14 23:12:06
【问题描述】:

我想要一个从 0 扩展到 x 个 pod 的实例组。我得到Insufficient nvidia.com/gpu。有人看到我在这里做错了吗?这是在带有自动缩放器 1.1.2 的 Kubernetes v1.9.6 上。

我有两个实例组,一个带有 cpus,另一个我想缩减到 0 个节点,称为 gpus,所以 kops edit ig gpus 是:

apiVersion: kops/v1alpha2
kind: InstanceGroup
metadata:
  creationTimestamp: 2018-05-31T09:27:31Z
  labels:
    kops.k8s.io/cluster: ci.k8s.local
  name: gpus
spec:
  cloudLabels:
    instancegroup: gpus
    k8s.io/cluster-autoscaler/enabled: ""
  image: ami-4450543d
  kubelet:
    featureGates:
      DevicePlugins: "true"
  machineType: p2.xlarge
  maxPrice: "0.5"
  maxSize: 3
  minSize: 0
  nodeLabels:
    kops.k8s.io/instancegroup: gpus
  role: Node
  rootVolumeOptimization: true
  subnets:
  - eu-west-1c

自动扩缩器部署有:

    spec:
      containers:
      - command:
        - ./cluster-autoscaler
        - --v=4
        - --stderrthreshold=info
        - --cloud-provider=aws
        - --skip-nodes-with-local-storage=false
        - --nodes=0:3:gpus.ci.k8s.local
        env:
        - name: AWS_REGION
          value: eu-west-1
        image: k8s.gcr.io/cluster-autoscaler:v1.1.2

现在我尝试部署一个简单的 GPU 测试:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: simple-gpu-test
spec: 
  replicas: 1
  template:
    metadata:
      labels:
        app: "simplegputest"
    spec:
      containers: 
      - name: "nvidia-smi-gpu"
        image: "nvidia/cuda:8.0-cudnn5-runtime"
        resources: 
          limits: 
             nvidia.com/gpu: 1 # requesting 1 GPU
        volumeMounts:
        - mountPath: /usr/local/nvidia
          name: nvidia
        command: [ "/bin/bash", "-c", "--" ]
        args: [ "while true; do nvidia-smi; sleep 5; done;" ]
      volumes:
      - hostPath:
          path: /usr/local/nvidia
        name: nvidia

我希望实例组从 0 变为 1,但自动缩放器日志显示:

I0605 11:27:29.865576       1 scale_up.go:54] Pod default/simple-gpu-test-6f48d9555d-l9822 is unschedulable
I0605 11:27:29.961051       1 scale_up.go:86] Upcoming 0 nodes
I0605 11:27:30.005163       1 scale_up.go:146] Scale-up predicate failed: PodFitsResources predicate mismatch, cannot put default/simple-gpu-test-6f48d9555d-l9822 on template-node-for-gpus.ci.k8s.local-5829202798403814789, reason: Insufficient nvidia.com/gpu
I0605 11:27:30.005262       1 scale_up.go:175] No pod can fit to gpus.ci.k8s.local
I0605 11:27:30.005324       1 scale_up.go:180] No expansion options
I0605 11:27:30.005393       1 static_autoscaler.go:299] Calculating unneeded nodes
I0605 11:27:30.008919       1 factory.go:33] Event(v1.ObjectReference{Kind:"Pod", Namespace:"default", Name:"simple-gpu-test-6f48d9555d-l9822", UID:"3416d787-68b3-11e8-8e8f-0639a6e973b0", APIVersion:"v1", ResourceVersion:"12429157", FieldPath:""}): type: 'Normal' reason: 'NotTriggerScaleUp' pod didn't trigger scale-up (it wouldn't fit if a new node is added)
I0605 11:27:30.031707       1 leaderelection.go:199] successfully renewed lease kube-system/cluster-autoscaler

当我通过设置最小tot 1来启动一个节点时,我看到它有容量:

Capacity:
 cpu:             4
 memory:          62884036Ki
 nvidia.com/gpu:  1
 pods:            110

and labels
Labels:             beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/instance-type=p2.xlarge
                    beta.kubernetes.io/os=linux
                    failure-domain.beta.kubernetes.io/region=eu-west-1
                    failure-domain.beta.kubernetes.io/zone=eu-west-1c
                    kops.k8s.io/instancegroup=gpus
                    kubernetes.io/role=node
                    node-role.kubernetes.io/node=
                    spot=true

AWS Scale 组中存在所需的标签:

{
    "ResourceId": "gpus.ci.k8s.local",
    "ResourceType": "auto-scaling-group",
    "Key": "k8s.io/cluster-autoscaler/node-template/label/kops.k8s.io/instancegroup",
    "Value": "gpus",
    "PropagateAtLaunch": true
}

最后,当我将最小池大小设置为 1 时,它可以自动从 1 缩放到 3。只是不做 0 到 1。

有没有什么方法可以让我检查模板,看看为什么它没有资源?

【问题讨论】:

  • 有什么方法可以检查模板吗?
  • 嘿,你找到解决办法了吗?我有同样的问题
  • 是的,它现在对我有用。标签不匹配,Autoscaler 需要将启动配置与节点组匹配。通过将污点和标签都添加到 AWS 的启动配置中,自动缩放器现在可以找到正确的组。文档现在也更新了更好的示例。如果你遵循这些,它应该可以工作

标签: amazon-web-services kubernetes kops


【解决方案1】:

还要确保 AWS 账户中所需的实例类型具有非零限制。

【讨论】:

    【解决方案2】:

    Cluster Autoscaler 是一个独立的程序,可以调整 Kubernetes 集群的大小以满足当前的需求。 Cluster Autoscaler 可以以同样的方式管理云提供商提供的 GPU 资源。

    基于集群autoscaler documentation, 对于 AWS,假设满足所有缩减条件,则可以将节点组扩展到 0(显然是从 0)。

    回到您的问题,对于 AWS,如果您使用的是 nodeSelector,则需要使用“k8s.io/cluster-autoscaler/node-template/label/”之类的标签在 ASG 模板中标记您的节点。 请注意,Kubernetes 和 AWS GPU 支持需要不同的标签。

    例如,对于 foo=bar 的节点标签,您可以将 ASG 标记为:

    {
        "ResourceType": "auto-scaling-group",
        "ResourceId": "foo.example.com",
        "PropagateAtLaunch": true,
        "Value": "bar",
        "Key": "k8s.io/cluster-autoscaler/node-template/label/foo"
    }
    

    【讨论】:

    • 我给节点加了标签gpu-group=true,伸缩组有{ "ResourceId": "gpus.ci.k8s.local", "ResourceType": "auto-scaling- group”,“Key”:“k8s.io/cluster-autoscaler/node-template/label/gpu-group”,“Value”:“true”,“PropagateAtLaunch”:true }。但我仍然有同样的错误。
    • 另外,它应该已经在 kops.k8s.io/instancegroup=gpus 上匹配
    • 如果您按照上述所有操作但仍然无法正常工作,请检查自动缩放器 pod 日志。由于某种原因,我的 pod 卡住了,不得不重新启动它才能使配置更改生效
    猜你喜欢
    • 1970-01-01
    • 2017-09-23
    • 2017-04-18
    • 2019-10-07
    • 2014-08-25
    • 2019-06-22
    • 2019-07-26
    • 1970-01-01
    • 2018-08-20
    相关资源
    最近更新 更多