Information in this document may be out of date
This document has an older update date than the original, so the information it contains may be out of date. If you're able to read English, see the English version for the most up-to-date information: API-initiated Eviction
Вытеснение, инициированное через API
Вытеснение, инициированное через API — процесс, при котором с помощью Eviction API
создается объект Eviction
, который запускает корректное завершение работы Pod'а.
Вытеснение можно инициировать напрямую с помощью Eviction API или программно,
используя клиент API-сервера
(например, командой kubectl drain
). В результате будет создан объект Eviction
,
который запустит процесс контролируемого завершения работы Pod'а.
Вытеснения, инициированные через API, учитывают настройки PodDisruptionBudget
и terminationGracePeriodSeconds
.
Создание с помощью API объекта Eviction для Pod'а аналогично выполнению
операции DELETE
для этого Pod'а, которая контролируется политикой.
Вызов API Eviction
Для доступа к API Kubernetes и создания объекта Eviction
можно воспользоваться клиентской библиотекой. Необходимая операция оформляется в виде POST-запроса (см. пример ниже):
policy/v1
доступно начиная с v1.22. Для более ранних релизов используйте policy/v1beta1
.
{
"apiVersion": "policy/v1",
"kind": "Eviction",
"metadata": {
"name": "quux",
"namespace": "default"
}
}
policy/v1
.
{
"apiVersion": "policy/v1beta1",
"kind": "Eviction",
"metadata": {
"name": "quux",
"namespace": "default"
}
}
Также можно попытаться выполнить операцию вытеснения,
обратившись к API с помощью curl
или wget
, как показано в следующем примере:
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
: вытеснение в данный момент не разрешено из-за настроек PodDisruptionBudget. Попытку вытеснения можно повторить позже. Такой ответ также может быть вызван работой механизма по ограничению частоты запросов к API.500 Internal Server Error
: вытесение запрещено из-за неправильной конфигурации; например, несколько PodDisruptionBudget'ов могут ссылаться на один и тот же Pod.
Если Pod, предназначенный для вытеснения, не является частью рабочей нагрузки
с настроенным PodDisruptionBudget'ом, сервер API всегда возвращает 200 OK
и
разрешает вытеснение.
В случае, если вытеснение разрешено, процесс удаления Pod'а выглядит следующим образом:
- К ресурсу
Pod
на сервере API добавляется метка времени удаления, после чего сервер API считает ресурс Pod завершенным (terminated). РесурсPod
также помечается настроенным grace-периодом. - kubelet на узле, где запущен
локальный Pod, замечает, что ресурс
Pod
помечен на удаление, и приступает к корректному завершению работы локального Pod'а. - Пока kubelet завершает работу Pod'а, управляющий слой удаляет Pod из объектов Endpoint и EndpointSlice. В результате контроллеры больше не рассматривают Pod как валидный объект.
- После истечения периода корректного завершения работы (grace-периода) kubelet принудительно завершает работу локального Pod'а.
- kubelet передает API-серверу информацию о необходимости удалить ресурс
Pod
. - Сервер API удаляет ресурс
Pod
.
Зависшие вытеснения
В некоторых ситуациях сбой приводит к тому, что API Eviction начинает возвращать
исключительно ответы 429
или 500
. Такое может случиться, если, например,
за создание Pod'ов для приложения отвечает ReplicaSet, однако новые Pod'ы не
переходят в состояние Ready
. Подобное поведение также может наблюдаться в случаях,
когда у последнего вытесненного Pod'а слишком долгий период завершения работы (grace-период).
Одно из следующих решений может помочь решить проблему:
- Прервите или приостановите автоматическую операцию, вызвавшую сбой. Перед повторным запуском операции внимательно изучите сбойное приложение.
- Подождите некоторое время, затем напрямую удалите Pod из управляющего слоя кластера вместо того, чтобы пытаться удалить его с помощью Eviction API.
Что дальше
- Обеспечение работоспособности приложений с помощью Pod Disruption Budget.
- Вытеснение из-за дефицита ресурсов на узле.
- Приоритет Pod'а и приоритизация.