# Вытеснение, инициированное через 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>, который запускает корректное завершение работы пода. </br>

Вытеснение можно инициировать напрямую с помощью Eviction API или программно, 
используя клиент <a class='glossary-tooltip' title='Компонент управляющего слоя, предоставляющий Kubernetes API.' data-bs-toggle='tooltip' data-bs-placement='top' href='/ru/docs/reference/generated/kube-apiserver/' target='_blank' aria-label='API-сервера'>API-сервера</a> 
(например, командой `kubectl drain`). В результате будет создан объект `Eviction`, 
который запустит процесс контролируемого завершения работы Pod'а.

Вытеснения, инициированные через API, учитывают настройки [`PodDisruptionBudget`](/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'а, которая контролируется политикой. 

## Вызов API Eviction

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

<ul class="nav nav-tabs" id="tabs-eviction-example" role="tablist"><li class="nav-item"><a data-bs-toggle="tab" class="nav-link active" href="#tabs-eviction-example-0" role="tab" aria-controls="tabs-eviction-example-0" aria-selected="true">policy/v1</a></li>
	  
		<li class="nav-item"><a data-bs-toggle="tab" class="nav-link" href="#tabs-eviction-example-1" role="tab" aria-controls="tabs-eviction-example-1">policy/v1beta1</a></li></ul>

<div class="tab-content" id="tabs-eviction-example-content"><div class="tab-body tab-pane fadeshow active"
        id="tabs-eviction-example-0" role="tabpanel" aria-labelledby="tabs-eviction-example-0-tab" tabindex="eviction-example"><div class="alert alert-info" role="note"><h4 class="alert-heading">Примечание:</h4>Вытеснение с версией <code>policy/v1</code> доступно начиная с 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-eviction-example-1" role="tabpanel" aria-labelledby="tabs-eviction-example-1-tab" tabindex="eviction-example"><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

При вытеснении, инициированном через API, сервер API выполняет admission-проверки 
и отвечает одним из следующих способов:

* `200 OK`: вытеснение разрешено, подресурс `Eviction` создан, 
  Pod удален (аналогично отправке запроса `DELETE` на URL Pod'а).
* `429 Too Many Requests`: вытеснение в данный момент не разрешено из-за настроек
 <a class='glossary-tooltip' title='An object that limits the number of Pods of a replicated application that are down simultaneously from voluntary disruptions.' data-bs-toggle='tooltip' data-bs-placement='top' href='/ru/docs/reference/glossary/?all=true#term-pod-disruption-budget' target='_blank' aria-label='PodDisruptionBudget'>PodDisruptionBudget</a>.
  Попытку вытеснения можно повторить позже. Такой ответ также может быть вызван 
  работой механизма по ограничению частоты запросов к API.
* `500 Internal Server Error`: вытесение запрещено из-за неправильной конфигурации; 
  например, несколько PodDisruptionBudget'ов могут ссылаться на один и тот же Pod.

Если Pod, предназначенный для вытеснения, не является частью рабочей нагрузки 
с настроенным PodDisruptionBudget'ом, сервер API всегда возвращает `200 OK` и 
разрешает вытеснение. 

В случае, если вытеснение разрешено, процесс удаления Pod'а выглядит следующим образом:

1. К ресурсу `Pod` на сервере API добавляется метка времени удаления, 
   после чего сервер API считает ресурс Pod завершенным (terminated). Ресурс `Pod` также помечается 
   настроенным grace-периодом.
1. <a class='glossary-tooltip' title='Агент, работающий на каждом узле в кластере. Он следит за тем, чтобы контейнеры были запущены в поде.' data-bs-toggle='tooltip' data-bs-placement='top' href='/ru/docs/reference/command-line-tools-reference/kubelet' target='_blank' aria-label='kubelet'>kubelet</a> на узле, где запущен 
   локальный Pod, замечает, что ресурс `Pod` помечен на удаление, и приступает к 
   корректному завершению работы локального Pod'а.
1. Пока kubelet завершает работу Pod'а, управляющий слой удаляет Pod из объектов 
   <a class='glossary-tooltip' title='(Deprecated) API representing endpoints of a Service' data-bs-toggle='tooltip' data-bs-placement='top' href='/ru/docs/concepts/services-networking/service/#endpoints' target='_blank' aria-label='Endpoint'>Endpoint</a> и 
   <a class='glossary-tooltip' title='EndpointSlices track the IP addresses of Pods for Services.' data-bs-toggle='tooltip' data-bs-placement='top' href='/ru/docs/concepts/services-networking/endpoint-slices/' target='_blank' aria-label='EndpointSlice'>EndpointSlice</a>. 
   В результате контроллеры больше не рассматривают Pod как валидный объект.
1. После истечения периода корректного завершения работы (grace-периода) kubelet 
   принудительно завершает работу локального Pod'а.
1. kubelet передает API-серверу информацию о необходимости удалить ресурс `Pod`.
1. Сервер API удаляет ресурс `Pod`.

## Зависшие вытеснения

В некоторых ситуациях сбой приводит к тому, что API Eviction начинает возвращать 
исключительно ответы `429` или `500`. Такое может случиться, если, например, 
за создание Pod'ов для приложения отвечает ReplicaSet, однако новые Pod'ы не 
переходят в состояние `Ready`. Подобное поведение также может наблюдаться в случаях, 
когда у последнего вытесненного Pod'а слишком долгий период завершения работы (grace-период).

Одно из следующих решений может помочь решить проблему: 

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

## Что дальше

* Обеспечение работоспособности приложений с помощью [Pod Disruption Budget](/docs/tasks/run-application/configure-pdb/).
* [Вытеснение из-за дефицита ресурсов на узле](/docs/concepts/scheduling-eviction/node-pressure-eviction/).
* [Приоритет Pod'а и приоритизация](/docs/concepts/scheduling-eviction/pod-priority-preemption/).
