website/content/ru/docs/concepts/scheduling-eviction/api-eviction.md

122 lines
7.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

---
title: Вытеснение, инициированное через API
content_type: concept
weight: 110
---
{{< glossary_definition term_id="api-eviction" length="short" >}} </br>
Вытеснение можно инициировать напрямую с помощью Eviction API или программно,
используя клиент {{<glossary_tooltip term_id="kube-apiserver" text="API-сервера">}}
(например, командой `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-запроса (см. пример ниже):
{{< tabs name="Eviction_example" >}}
{{% tab name="policy/v1" %}}
{{< note >}}
Вытеснение с версией `policy/v1` доступно начиная с v1.22. Для более ранних релизов используйте `policy/v1beta1`.
{{< /note >}}
```json
{
"apiVersion": "policy/v1",
"kind": "Eviction",
"metadata": {
"name": "quux",
"namespace": "default"
}
}
```
{{% /tab %}}
{{% tab name="policy/v1beta1" %}}
{{< note >}}
Признана устаревшей в v1.22; заменена на `policy/v1`.
{{< /note >}}
```json
{
"apiVersion": "policy/v1beta1",
"kind": "Eviction",
"metadata": {
"name": "quux",
"namespace": "default"
}
}
```
{{% /tab %}}
{{< /tabs >}}
Также можно попытаться выполнить операцию вытеснения,
обратившись к 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`: вытеснение в данный момент не разрешено из-за настроек
{{<glossary_tooltip term_id="pod-disruption-budget" text="PodDisruptionBudget">}}.
Попытку вытеснения можно повторить позже. Такой ответ также может быть вызван
работой механизма по ограничению частоты запросов к API.
* `500 Internal Server Error`: вытесение запрещено из-за неправильной конфигурации;
например, несколько PodDisruptionBudget'ов могут ссылаться на один и тот же Pod.
Если Pod, предназначенный для вытеснения, не является частью рабочей нагрузки
с настроенным PodDisruptionBudget'ом, сервер API всегда возвращает `200 OK` и
разрешает вытеснение.
В случае, если вытеснение разрешено, процесс удаления Pod'а выглядит следующим образом:
1. К ресурсу `Pod` на сервере API добавляется метка времени удаления,
после чего сервер API считает ресурс Pod завершенным (terminated). Ресурс `Pod` также помечается
настроенным grace-периодом.
1. {{<glossary_tooltip term_id="kubelet" text="kubelet">}} на узле, где запущен
локальный Pod, замечает, что ресурс `Pod` помечен на удаление, и приступает к
корректному завершению работы локального Pod'а.
1. Пока kubelet завершает работу Pod'а, управляющий слой удаляет Pod из объектов
{{<glossary_tooltip term_id="endpoint" text="Endpoint">}} и
{{<glossary_tooltip term_id="endpoint-slice" text="EndpointSlice">}}.
В результате контроллеры больше не рассматривают 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.
## {{% heading "whatsnext" %}}
* Обеспечение работоспособности приложений с помощью [Pod Disruption Budget](/docs/tasks/run-application/configure-pdb/).
* [Вытеснение из-за дефицита ресурсов на узле](/docs/concepts/scheduling-eviction/node-pressure-eviction/).
* [Приоритет Pod'а и приоритизация](/docs/concepts/scheduling-eviction/pod-priority-preemption/).