Как масштабировать узлы GPU с помощью автоматического масштабирования на AWS - PullRequest
0 голосов
/ 05 июня 2018

Я хочу иметь группу экземпляров, которая масштабируется от 0 до x модулей.Я получаю Insufficient nvidia.com/gpu.Кто-то видит, что я здесь делаю не так?Это на Kubernetes v1.9.6 с автоскалером 1.1.2.

У меня есть две группы экземпляров, одна с 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:

{
    "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.

Есть ли способ, с помощью которого я могу проверить шаблон, чтобы узнать, почему у него нет ресурса?

1 Ответ

0 голосов
/ 06 июня 2018

Cluster Autoscaler - это отдельная программа, которая регулирует размер кластера Kubernetes в соответствии с текущими потребностями.Cluster Autoscaler может управлять ресурсами GPU, предоставленными провайдером облака, таким же образом.

На основе кластера Документация по автоскальсеру , для AWS возможно масштабирование группы узлов до 0 (и, очевидно,от 0), при условии, что все условия сокращения выполнены.

Возвращаясь к вашему вопросу, для AWS, если вы используете nodeSelector, вам нужно пометить свои узлы в шаблоне ASG с помощью меток типа "k8s"..io / кластер autoscaler / узел-шаблон / этикетка /».Обратите внимание, что для поддержки 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"
}
...