# Виселення, ініційоване API

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

---

Виселення, ініційоване API — процес, під час якого використовується <a href="/docs/reference/generated/kubernetes-api/v1.36/#create-eviction-pod-v1-core">Eviction API</a> для створення обʼєкта <code>Eviction</code>, який викликає належне завершення роботи Podʼа. </br>

Ви можете ініціювати виселення, викликавши Eviction API безпосередньо або програмно,
використовуючи клієнт <a class='glossary-tooltip' title='Компонент панелі управління, що обслуговує API Kubernetes.' data-bs-toggle='tooltip' data-bs-placement='top' href='/uk/docs/concepts/architecture/#kube-apiserver' target='_blank' aria-label='API-сервера'>API-сервера</a>, наприклад, команду `kubectl drain`. Це створює обʼєкт `Eviction`, що призводить до завершення роботи Podʼа через API-сервер.

Виселення ініційовані API дотримуються вашого налаштованого [`PodDisruptionBudgets`](/docs/tasks/run-application/configure-pdb/) та [`terminationGracePeriodSeconds`](/docs/concepts/workloads/pods/pod-lifecycle#pod-termination).

Використання API для створення обʼєкта Eviction для Podʼа схоже на виконання контрольованої політикою операції [`DELETE`](/docs/reference/kubernetes-api/workload-resources/pod-v1/#delete-delete-a-pod) на Podʼі.

## Виклик Eviction API {#calling-the-eviction-api}

Ви можете використовувати [клієнт кластера Kubernetes](/docs/tasks/administer-cluster/access-cluster-api/#programmatic-access-to-the-api), щоб отримати доступ до API Kubernetes та створити обʼєкт `Eviction`. Для цього ви надсилаєте POST-запит на виконання операції, схожий на наступний приклад:

<ul class="nav nav-tabs" id="tabs-приклад-виселення" role="tablist"><li class="nav-item"><a data-bs-toggle="tab" class="nav-link active" href="#tabs-%d0%bf%d1%80%d0%b8%d0%ba%d0%bb%d0%b0%d0%b4-%d0%b2%d0%b8%d1%81%d0%b5%d0%bb%d0%b5%d0%bd%d0%bd%d1%8f-0" role="tab" aria-controls="tabs-приклад-виселення-0" aria-selected="true">policy/v1</a></li>
	  
		<li class="nav-item"><a data-bs-toggle="tab" class="nav-link" href="#tabs-%d0%bf%d1%80%d0%b8%d0%ba%d0%bb%d0%b0%d0%b4-%d0%b2%d0%b8%d1%81%d0%b5%d0%bb%d0%b5%d0%bd%d0%bd%d1%8f-1" role="tab" aria-controls="tabs-приклад-виселення-1">policy/v1beta1</a></li></ul>

<div class="tab-content" id="tabs-приклад-виселення-content"><div class="tab-body tab-pane fadeshow active"
        id="tabs-приклад-виселення-0" role="tabpanel" aria-labelledby="tabs-приклад-виселення-0-tab" tabindex="приклад-виселення"><div class="alert alert-info" role="note"><h4 class="alert-heading">Примітка:</h4><code>policy/v1</code> Eviction доступний в v1.22+. Використовуйте <code>policy/v1beta1</code> для попередніх версій.</div>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;apiVersion&#34;</span><span class="p">:</span> <span class="s2">&#34;policy/v1&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;kind&#34;</span><span class="p">:</span> <span class="s2">&#34;Eviction&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;metadata&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;name&#34;</span><span class="p">:</span> <span class="s2">&#34;quux&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;namespace&#34;</span><span class="p">:</span> <span class="s2">&#34;default&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div></div><div class="tab-body tab-pane fade"
        id="tabs-приклад-виселення-1" role="tabpanel" aria-labelledby="tabs-приклад-виселення-1-tab" tabindex="приклад-виселення"><div class="alert alert-info" role="note"><h4 class="alert-heading">Примітка:</h4>Застаріло в v1.22 на користь <code>policy/v1</code></div>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;apiVersion&#34;</span><span class="p">:</span> <span class="s2">&#34;policy/v1beta1&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;kind&#34;</span><span class="p">:</span> <span class="s2">&#34;Eviction&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;metadata&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;name&#34;</span><span class="p">:</span> <span class="s2">&#34;quux&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;namespace&#34;</span><span class="p">:</span> <span class="s2">&#34;default&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div></div></div>


Також ви можете спробувати виконати операцію виселення, звернувшись до API за допомогою `curl` або `wget`, схожу на наступний приклад:

```bash
curl -v -H 'Content-type: application/json' https://your-cluster-api-endpoint.example/api/v1/namespaces/default/pods/quux/eviction -d @eviction.json
```

## Як працює виселення, ініційоване через API {#how-api-initiated-eviction-works}

Коли ви запитуєте виселення за допомогою API, сервер API виконує перевірки допуску
і відповідає одним із таких способів:

* `200 ОК`: виселення дозволено, субресурс `Eviction` створюється, і Pod видаляється, подібно до надсилання `DELETE`-запиту на URL Podʼа.
* `429 Забагато запитів`: виселення на цей момент не дозволено через налаштований <a class='glossary-tooltip' title='Обʼєкт, який обмежує кількість Podʼів реплікованого застосунку, які можуть бути вимкнені одночасно з причини добровільного переривання роботи.' data-bs-toggle='tooltip' data-bs-placement='top' href='/uk/docs/reference/glossary/?all=true#term-pod-disruption-budget' target='_blank' aria-label='PodDisruptionBudget'>PodDisruptionBudget</a>. Можливо, ви зможете спробувати виселення пізніше. Ви також можете отримати цю відповідь через обмеження швидкості API.
* `500 Внутрішня помилка сервера`: виселення не дозволено через помилкову конфігурацію, наприклад, якщо декілька PodDisruptionBudget посилаються на той самий Pod.

Якщо Pod, який ви хочете виселити, не є частиною робочого навантаження, яке має PodDisruptionBudget, сервер API завжди повертає `200 OK` та дозволяє виселення.

Якщо сервер API дозволяє виселення, Pod видаляється наступним чином:

1. Ресурс `Pod` в сервері API оновлюється з часовою міткою видалення, після чого сервер API вважає ресурс `Pod` таким, що завершив роботу. Ресурс `Pod` також позначений налаштованим періодом належного завершення роботи.
2. <a class='glossary-tooltip' title='Агент, запущений на кожному вузлі кластера. Забезпечує запуск і роботу контейнерів у Podʼах.' data-bs-toggle='tooltip' data-bs-placement='top' href='/uk/docs/reference/command-line-tools-reference/kubelet' target='_blank' aria-label='Kubelet'>Kubelet</a> на вузлі, на якому запущений локальний Pod, помічає, що ресурс `Pod` позначений для припинення та починає належним чином завершувати локальний Pod.
3. Під час припинення роботи Podʼа панель управління видаляє Pod з обʼєктів <a class='glossary-tooltip' title='EndpointSlices відстежують IP-адреси Podʼів для Services.' data-bs-toggle='tooltip' data-bs-placement='top' href='/uk/docs/concepts/services-networking/endpoint-slices/' target='_blank' aria-label='EndpointSlice'>EndpointSlice</a>. В результаті контролери більше не вважають Pod за дійсний обʼєкт.
4. Після закінчення періоду належного завершення роботи для Podʼа kubelet примусово завершує локальний Pod.
5. kubelet повідомляє сервер API про видалення ресурсу `Pod`.
6. Сервер API видаляє ресурс `Pod`.

## Виправлення застряглих виселень {#troubleshooting-stuck-evictions}

У деяких випадках ваші застосунки можуть потрапити в непрацездатний стан, де Eviction API буде повертати лише відповіді `429` або `500`, поки ви не втрутитеся. Це може відбуватися, наприклад, якщо ReplicaSet створює Podʼи для вашого застосунку, але нові Podʼи не переходять в стан `Ready`. Ви також можете помітити цю поведінку у випадках, коли останній виселений Pod мав довгий період належного завершення роботи при примусовому завершенні роботи.

Якщо ви помічаєте застряглі виселення, спробуйте одне з таких рішень:

* Скасуйте або призупиніть автоматизовану операцію, що викликає проблему. Дослідіть застряглий застосунок, перш ніж перезапустити операцію.
* Почекайте трохи, а потім безпосередньо видаліть Pod з панелі управління вашого кластера замість використання API виселення.

## Що далі

* Дізнайтеся, як захистити ваші застосунки за допомогою [Бюджету відмови Podʼів](/docs/tasks/run-application/configure-pdb/).
* Дізнайтеся про [Виселення внаслідок тиску на вузол](/docs/concepts/scheduling-eviction/node-pressure-eviction/).
* Дізнайтеся про [Пріоритет та випередження Podʼів](/docs/concepts/scheduling-eviction/pod-priority-preemption/).
