|
| 1 | +--- |
| 2 | +title: Вытеснение, инициированное через API |
| 3 | +content_type: concept |
| 4 | +weight: 110 |
| 5 | +--- |
| 6 | + |
| 7 | +{{< glossary_definition term_id="api-eviction" length="short" >}} </br> |
| 8 | + |
| 9 | +Вытеснение можно инициировать напрямую с помощью Eviction API или программно, |
| 10 | +используя клиент {{<glossary_tooltip term_id="kube-apiserver" text="API-сервера">}} |
| 11 | +(например, командой `kubectl drain`). В результате будет создан объект `Eviction`, |
| 12 | +который запустит процесс контролируемого завершения работы Pod'а. |
| 13 | + |
| 14 | +Вытеснения, инициированные через API, учитывают настройки [`PodDisruptionBudget`](/docs/tasks/run-application/configure-pdb/) |
| 15 | +и [`terminationGracePeriodSeconds`](/docs/concepts/workloads/pods/pod-lifecycle#pod-termination). |
| 16 | + |
| 17 | +Создание с помощью API объекта Eviction для Pod'а аналогично выполнению |
| 18 | +[операции `DELETE`](/docs/reference/kubernetes-api/workload-resources/pod-v1/#delete-delete-a-pod) |
| 19 | +для этого Pod'а, которая контролируется политикой. |
| 20 | + |
| 21 | +## Вызов API Eviction |
| 22 | + |
| 23 | +Для доступа к API Kubernetes и создания объекта `Eviction` можно воспользоваться [клиентской библиотекой](/docs/tasks/administer-cluster/access-cluster-api/#programmatic-access-to-the-api). Необходимая операция оформляется в виде POST-запроса (см. пример ниже): |
| 24 | + |
| 25 | +{{< tabs name="Eviction_example" >}} |
| 26 | +{{% tab name="policy/v1" %}} |
| 27 | +{{< note >}} |
| 28 | +Вытеснение с версией `policy/v1` доступно начиная с v1.22. Для более ранних релизов используйте `policy/v1beta1`. |
| 29 | +{{< /note >}} |
| 30 | + |
| 31 | +```json |
| 32 | +{ |
| 33 | + "apiVersion": "policy/v1", |
| 34 | + "kind": "Eviction", |
| 35 | + "metadata": { |
| 36 | + "name": "quux", |
| 37 | + "namespace": "default" |
| 38 | + } |
| 39 | +} |
| 40 | +``` |
| 41 | +{{% /tab %}} |
| 42 | +{{% tab name="policy/v1beta1" %}} |
| 43 | +{{< note >}} |
| 44 | +Признана устаревшей в v1.22; заменена на `policy/v1`. |
| 45 | +{{< /note >}} |
| 46 | + |
| 47 | +```json |
| 48 | +{ |
| 49 | + "apiVersion": "policy/v1beta1", |
| 50 | + "kind": "Eviction", |
| 51 | + "metadata": { |
| 52 | + "name": "quux", |
| 53 | + "namespace": "default" |
| 54 | + } |
| 55 | +} |
| 56 | +``` |
| 57 | +{{% /tab %}} |
| 58 | +{{< /tabs >}} |
| 59 | + |
| 60 | +Также можно попытаться выполнить операцию вытеснения, |
| 61 | +обратившись к API с помощью `curl` или `wget`, как показано в следующем примере: |
| 62 | + |
| 63 | +```bash |
| 64 | +curl -v -H 'Content-type: application/json' https://your-cluster-api-endpoint.example/api/v1/namespaces/default/pods/quux/eviction -d @eviction.json |
| 65 | +``` |
| 66 | + |
| 67 | +## Как работает вытеснение, инициированное через API |
| 68 | + |
| 69 | +При вытеснении, инициированном через API, сервер API выполняет admission-проверки |
| 70 | +и отвечает одним из следующих способов: |
| 71 | + |
| 72 | +* `200 OK`: вытеснение разрешено, подресурс `Eviction` создан, |
| 73 | + Pod удален (аналогично отправке запроса `DELETE` на URL Pod'а). |
| 74 | +* `429 Too Many Requests`: вытеснение в данный момент не разрешено из-за настроек |
| 75 | + {{<glossary_tooltip term_id="pod-disruption-budget" text="PodDisruptionBudget">}}. |
| 76 | + Попытку вытеснения можно повторить позже. Такой ответ также может быть вызван |
| 77 | + работой механизма по ограничению частоты запросов к API. |
| 78 | +* `500 Internal Server Error`: вытесение запрещено из-за неправильной конфигурации; |
| 79 | + например, несколько PodDisruptionBudget'ов могут ссылаться на один и тот же Pod. |
| 80 | + |
| 81 | +Если Pod, предназначенный для вытеснения, не является частью рабочей нагрузки |
| 82 | +с настроенным PodDisruptionBudget'ом, сервер API всегда возвращает `200 OK` и |
| 83 | +разрешает вытеснение. |
| 84 | + |
| 85 | +В случае, если вытеснение разрешено, процесс удаления Pod'а выглядит следующим образом: |
| 86 | + |
| 87 | +1. К ресурсу `Pod` на сервере API добавляется метка времени удаления, |
| 88 | + после чего сервер API считает ресурс Pod завершенным (terminated). Ресурс `Pod` также помечается |
| 89 | + настроенным grace-периодом. |
| 90 | +1. {{<glossary_tooltip term_id="kubelet" text="kubelet">}} на узле, где запущен |
| 91 | + локальный Pod, замечает, что ресурс `Pod` помечен на удаление, и приступает к |
| 92 | + корректному завершению работы локального Pod'а. |
| 93 | +1. Пока kubelet завершает работу Pod'а, управляющий слой удаляет Pod из объектов |
| 94 | + {{<glossary_tooltip term_id="endpoint" text="Endpoint">}} и |
| 95 | + {{<glossary_tooltip term_id="endpoint-slice" text="EndpointSlice">}}. |
| 96 | + В результате контроллеры больше не рассматривают Pod как валидный объект. |
| 97 | +1. После истечения периода корректного завершения работы (grace-периода) kubelet |
| 98 | + принудительно завершает работу локального Pod'а. |
| 99 | +1. kubelet передает API-серверу информацию о необходимости удалить ресурс `Pod`. |
| 100 | +1. Сервер API удаляет ресурс `Pod`. |
| 101 | + |
| 102 | +## Зависшие вытеснения |
| 103 | + |
| 104 | +В некоторых ситуациях сбой приводит к тому, что API Eviction начинает возвращать |
| 105 | +исключительно ответы `429` или `500`. Такое может случиться, если, например, |
| 106 | +за создание Pod'ов для приложения отвечает ReplicaSet, однако новые Pod'ы не |
| 107 | +переходят в состояние `Ready`. Подобное поведение также может наблюдаться в случаях, |
| 108 | +когда у последнего вытесненного Pod'а слишком долгий период завершения работы (grace-период). |
| 109 | + |
| 110 | +Одно из следующих решений может помочь решить проблему: |
| 111 | + |
| 112 | +* Прервите или приостановите автоматическую операцию, вызвавшую сбой. |
| 113 | + Перед повторным запуском операции внимательно изучите сбойное приложение. |
| 114 | +* Подождите некоторое время, затем напрямую удалите Pod из управляющего слоя |
| 115 | + кластера вместо того, чтобы пытаться удалить его с помощью Eviction API. |
| 116 | + |
| 117 | +## {{% heading "whatsnext" %}} |
| 118 | + |
| 119 | +* Обеспечение работоспособности приложений с помощью [Pod Disruption Budget](/docs/tasks/run-application/configure-pdb/). |
| 120 | +* [Вытеснение из-за дефицита ресурсов на узле](/docs/concepts/scheduling-eviction/node-pressure-eviction/). |
| 121 | +* [Приоритет Pod'а и приоритизация](/docs/concepts/scheduling-eviction/pod-priority-preemption/). |
0 commit comments