# Перевищення ємності вузла для кластера

LLMS index: [llms.txt](/llms.txt)

---

<!-- overview -->

Ця сторінка допоможе вам налаштувати перевищення ємності <a class='glossary-tooltip' title='Вузол — це робоча машина в Kubernetes.' data-bs-toggle='tooltip' data-bs-placement='top' href='/uk/docs/concepts/architecture/nodes/' target='_blank' aria-label='вузла'>вузла</a> у вашому кластері Kubernetes. Перевищення ємності вузла — це стратегія, яка проактивно резервує частину обчислювальних ресурсів вашого кластера. Це резервування допомагає зменшити час, необхідний для планування нових podʼів під час подій масштабування, підвищуючи чутливість вашого кластера до раптових сплесків трафіку або навантаження.

Підтримуючи деяку невикористану ємність, ви забезпечуєте негайну доступність ресурсів при створенні нових podʼів, запобігаючи їх переходу в стан очікування під час масштабування кластера.

## Перш ніж ви розпочнете

- Вам потрібен кластер Kubernetes, і інструмент командного рядка kubectl має бути налаштований для звʼязку з вашим кластером.
- Ви повинні мати базове розуміння про [Deployments](/docs/concepts/workloads/controllers/deployment/), <a class='glossary-tooltip' title='Пріоритет Podʼа вказує на важливість Podʼа в порівнянні з іншими Podʼами.' data-bs-toggle='tooltip' data-bs-placement='top' href='/uk/docs/concepts/scheduling-eviction/pod-priority-preemption/#pod-priority' target='_blank' aria-label='пріоритет'>пріоритет</a> podʼів, та <a class='glossary-tooltip' title='Зіставлення імені класу з пріоритетом планування, який повинен мати Pod.' data-bs-toggle='tooltip' data-bs-placement='top' href='/uk/docs/concepts/scheduling-eviction/pod-priority-preemption/#priorityclass' target='_blank' aria-label='PriorityClasses'>PriorityClasses</a>.
- У вашому кластері має бути налаштований з [автомасштабувальник](/docs/concepts/cluster-administration/node-autoscaling/), який керує вузлами на основі попиту.

<!-- steps -->

## Створіть PriorityClass {#create-a-priorityclass}

Почніть з визначення PriorityClass для podʼів-заповнювачів. Спочатку створіть PriorityClass з негативним значенням пріоритету, який ви незабаром призначите podʼам-заповнювачам. Пізніше ви налаштуєте Deployment, яке використовує цей PriorityClass.


















<div class="highlight code-sample">
    <div class="copy-code-icon">
    <a href="https://raw.githubusercontent.com/kubernetes/website/main/content/uk/examples/priorityclass/low-priority-class.yaml" download="priorityclass/low-priority-class.yaml"><code>priorityclass/low-priority-class.yaml</code>
    </a><img src="/images/copycode.svg" class="icon-copycode" onclick="copyCode('priorityclass-low-priority-class-yaml')" title="Копіювати priorityclass/low-priority-class.yaml до буферу обміну"></img></div>
    <div class="includecode" id="priorityclass-low-priority-class-yaml"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">scheduling.k8s.io/v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">PriorityClass</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">placeholder</span><span class="w"> </span><span class="c"># ці Podʼи передставляють ємність заповнювача</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">value</span><span class="p">:</span><span class="w"> </span>-<span class="m">1000</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">globalDefault</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">description</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Відʼємний пріоритет для pod-заповнювачів, щоб увімкнути надлишкове розміщення.&#34;</span><span class="w">
</span></span></span></code></pre></div></div>
</div>

Потім створіть PriorityClass:

```shell
kubectl apply -f https://k8s.io/examples/priorityclass/low-priority-class.yaml
```

Далі ви визначите Deployment, який використовує PriorityClass з негативним пріоритетом і запускає мінімальний контейнер. Коли ви додасте його до свого кластера, Kubernetes запустить ці podʼи-заповнювачі для резервування ємності. У разі нестачі ємності, панель управління вибере один з цих podʼів-заповнювачів як першого кандидата для <a class='glossary-tooltip' title='Логіка пріоритетів в Kubernetes допомагає Podʼу, що очікує, знайти відповідний Вузол, виселяючи Podʼи з низьким пріоритетом, що вже існують на цьому Вузлі.' data-bs-toggle='tooltip' data-bs-placement='top' href='/uk/docs/concepts/scheduling-eviction/pod-priority-preemption/#preemption' target='_blank' aria-label='випередження'>випередження</a>.

## Запустіть Podʼи, що запитують ємність вузла {#run-pods-that-request-node-capacity}

Перегляньте зразок маніфесту:


















<div class="highlight code-sample">
    <div class="copy-code-icon">
    <a href="https://raw.githubusercontent.com/kubernetes/website/main/content/uk/examples/deployments/deployment-with-capacity-reservation.yaml" download="deployments/deployment-with-capacity-reservation.yaml"><code>deployments/deployment-with-capacity-reservation.yaml</code>
    </a><img src="/images/copycode.svg" class="icon-copycode" onclick="copyCode('deployments-deployment-with-capacity-reservation-yaml')" title="Копіювати deployments/deployment-with-capacity-reservation.yaml до буферу обміну"></img></div>
    <div class="includecode" id="deployments-deployment-with-capacity-reservation-yaml"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">apps/v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">Deployment</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">capacity-reservation</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># Ви маєте вирішити, в якому просторі імен розгортати</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">replicas</span><span class="p">:</span><span class="w"> </span><span class="m">1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">selector</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">matchLabels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">app.kubernetes.io/name</span><span class="p">:</span><span class="w"> </span><span class="l">capacity-placeholder</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">template</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">app.kubernetes.io/name</span><span class="p">:</span><span class="w"> </span><span class="l">capacity-placeholder</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">annotations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">kubernetes.io/description</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Capacity reservation&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">priorityClassName</span><span class="p">:</span><span class="w"> </span><span class="l">placeholder</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">affinity</span><span class="p">:</span><span class="w"> </span><span class="c"># Спробуйте розмістити ці додаткові Podʼи на різних вузлах</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                </span><span class="c"># якщо це можливо</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">podAntiAffinity</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">preferredDuringSchedulingIgnoredDuringExecution</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="nt">weight</span><span class="p">:</span><span class="w"> </span><span class="m">100</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">podAffinityTerm</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">labelSelector</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                </span><span class="nt">matchLabels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                  </span><span class="nt">app.kubernetes.io/name</span><span class="p">:</span><span class="w"> </span><span class="l">capacity-placeholder</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">topologyKey</span><span class="p">:</span><span class="w"> </span><span class="l">topology.kubernetes.io/hostname</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">containers</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">pause</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">registry.k8s.io/pause:3.6</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">resources</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">requests</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">cpu</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;50m&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">memory</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;512Mi&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">limits</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">memory</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;512Mi&#34;</span><span class="w">
</span></span></span></code></pre></div></div>
</div>

### Оберіть простір імен для podʼів-заповнювачів {#pick-a-namespace-for-the-placeholder-pods}

Виберіть, або створіть, <a class='glossary-tooltip' title='Абстракція, що використовується в Kubernetes для ізоляції груп ресурсів в межах одного кластера.' data-bs-toggle='tooltip' data-bs-placement='top' href='/uk/docs/concepts/overview/working-with-objects/namespaces' target='_blank' aria-label='простір імен'>простір імен</a>, в якому ви будете запускати podʼи-заповнювачі.

### Створіть Deployment-заповнювач {#create-the-placeholder-deployment}

Створіть Deployment на основі цього маніфесту:

```shell
# Змініть `example` на простір імен, який ви вибрали
kubectl --namespace example apply -f https://k8s.io/examples/deployments/deployment-with-capacity-reservation.yaml
```

## Налаштуйте запити ресурсів для заповнювачів {#adjust-placeholder-resource-request}

Налаштуйте запити та обмеження ресурсів для podʼів-заповнювачів, щоб визначити кількість зарезервованих ресурсів, які ви хочете підтримувати. Це резервування забезпечує наявність певної кількості CPU та памʼяті для нових podʼів.

Щоб редагувати Deployment, змініть розділ `resources` у файлі маніфесту Deployment, щоб встановити відповідні запити та обмеження. Ви можете завантажити цей файл локально та відредагувати його за допомогою будь-якого текстового редактора.

Ви можете редагувати маніфест Deployment використовуючи kubectl:

```shell
kubectl edit deployment capacity-reservation
```

Наприклад, щоб зарезервувати 0.5 CPU та 1GiB памʼяті для 5 podʼів-заповнювачів, визначте запити та обмеження ресурсів для одного podʼа-заповнювача наступним чином:

```yaml
  resources:
    requests:
      cpu: "100m"
      memory: "200Mi"
    limits:
      cpu: "100m"
```

## Встановіть бажану кількість реплік {#set-the-desired-replica-count}

### Розрахуйте загальні зарезервовані ресурси{#calculate-the-total-reserved-resources}

<!-- пробіли в кінці рядків в наступних абзацах треба зберегти -->
Наприклад, з 5 репліками, кожна з яких резервує 0.1 CPU та 200MiB памʼяті:
Загальна зарезервована ємність CPU: 5 × 0.1 = 0.5 (у специфікації podʼа ви напишете кількість `500m`)
Загальна зарезервована памʼять: 5 × 200MiB = 1GiB (у специфікації podʼа ви напишете `1 Gi`)

Щоб масштабувати Deployment, налаштуйте кількість реплік відповідно до розміру вашого кластера та очікуваного навантаження:

```shell
kubectl scale deployment capacity-reservation --replicas=5
```

Перевірте масштабування:

```shell
kubectl get deployment capacity-reservation
```

Вихідні дані повинні відображати оновлену кількість реплік:

```none
NAME                   READY   UP-TO-DATE   AVAILABLE   AGE
capacity-reservation   5/5     5            5           2m
```


<div class="alert alert-info" role="note"><h4 class="alert-heading">Примітка:</h4>Деякі автомасштабувальники, зокрема <a href="/docs/concepts/cluster-administration/cluster-autoscaling/#autoscaler-karpenter">Karpenter</a>, розглядають правила переважної спорідненості як жорсткі правила при розгляді масштабування вузлів. Якщо ви використовуєте Karpenter або інший автомасштабувальник вузлів, який використовує той самий евристичний підхід, кількість реплік, яку ви встановлюєте тут, також встановлює мінімальну кількість вузлів для вашого кластера.</div>


## Що далі

- Дізнайтеся більше про [PriorityClasses](/docs/concepts/scheduling-eviction/pod-priority-preemption/#priorityclass) та як вони впливають на планування podʼів.
- Дізнайтеся більше про [автомасштабування вузлів](/docs/concepts/cluster-administration/node-autoscaling/), щоб динамічно налаштовувати розмір вашого кластера на основі навантаження.
- Зрозумійте [Випередження podʼів](/docs/concepts/scheduling-eviction/pod-priority-preemption/), ключовий механізм Kubernetes для обробки конфліктів ресурсів. Та ж сторінка охоплює поняття _виселення_, що менш актуально для підходу з podʼами-заповнювачами, але також є механізмом для Kubernetes для реагування на конфлікти ресурсів.
