Планирование и масштабирование — Примеры

Пример 1 — Pod, который так и не планируется

Pod в состоянии pending, и дежурный инженер предлагает добавить узлы. Ниже — применённый манифест. Выясните, что на самом деле отказало pod’у, и измените наименьшее, что позволит ему запуститься.

spec:
  nodeSelector:
    disk: ssd
  containers:
    - name: api
      image: myapp:1.4.2

Решение

spec:
  nodeSelector:
    disk: hdd
  containers:
    - name: api
      image: myapp:1.4.2
$ kubectl describe pod api-7d4b2
Events:
  Warning  FailedScheduling  4m
  0/3 nodes are available: 3 node(s) didn't match node selector.

Ограничения сужают поиск раньше, чем вообще учитывается соответствие ресурсам, поэтому этому pod’у отказали на первой проверке, и никакое количество ёмкости не помогло бы. Событие прямо говорит, какое ограничение не прошло, поэтому события pod’а читают прежде, чем добавлять машины; обычная ошибка — считать любой pod в состоянии pending проблемой ёмкости.

Пример 2 — Requests, решающие, кто переживёт давление

Узел испытывает давление по памяти, и один контейнер убивают, а его сосед на том же узле продолжает работать. Два контейнера различаются только полями ниже. Скажите, кого выберут первым, и исправьте уязвимый.

жертва:    memory: (нет request, нет limit)
выживший:  resources: { requests: { memory: 256Mi, cpu: 250m },
                        limits:   { memory: 256Mi, cpu: 250m } }

Решение

жертва:    resources: { requests: { memory: 192Mi, cpu: 200m },
                        limits:   { memory: 384Mi, cpu: 800m } }
выживший:  resources: { requests: { memory: 256Mi, cpu: 250m },
                        limits:   { memory: 256Mi, cpu: 250m } }

Request — это то, что резервирует планировщик; limit — потолок, который контейнер не может превысить, и память выше него приводит к убийству процесса. Кластер вытесняет pod’ы без requests первыми, а pod’ы, у которых requests равны limits, — последними, поэтому контейнер с незаданными значениями и стал очевидной жертвой. Оставлять requests незаданными — обычная ошибка, и она же скрывает реальную стоимость нагрузки.

Подставьте свои имена образов, метки узлов и измерения там, где эти наброски используют заполнители.