# Обробники подій життєвого циклу контейнера

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

---

<!-- overview -->

Ця сторінка показує, як прикріплювати обробники до подій життєвого циклу контейнера. Kubernetes підтримує події postStart та preStop. Kubernetes надсилає подію postStart безпосередньо після того, як контейнер стартує, і він надсилає подію preStop безпосередньо перед завершенням роботи контейнера. Контейнер може вказати один обробник для кожної події.

## Перш ніж ви розпочнете

<p>Вам треба мати кластер Kubernetes, а також інструмент командного рядка kubectl має бути налаштований для роботи з вашим кластером. Рекомендується виконувати ці настанови у кластері, що має щонайменше два вузли, які не виконують роль вузлів управління. Якщо у вас немає кластера, ви можете створити його, за допомогою <a href="https://minikube.sigs.k8s.io/docs/tutorials/multi_node/">minikube</a> або використовувати одну з цих пісочниць:</p>
<ul>
<li><a href="https://labs.iximiuz.com/playgrounds?category=kubernetes&filter=all">iximiuz Labs</a></li>
<li><a href="https://killercoda.com/playgrounds/scenario/kubernetes">Killercoda</a></li>
<li><a href="https://kodekloud.com/public-playgrounds">KodeKloud</a></li>
</ul>
 
  <p>Для перевірки версії введіть  <code>kubectl version</code>.</p>


<!-- steps -->

## Визначте обробники postStart та preStop {#define-poststart-and-prestop-handlers}

У цьому завдані ви створите Pod, який має один контейнер. У контейнері встановлені обробники для подій postStart та preStop.

Ось файл конфігурації для Podʼа:


















<div class="highlight code-sample">
    <div class="copy-code-icon">
    <a href="https://raw.githubusercontent.com/kubernetes/website/main/content/uk/examples/pods/lifecycle-events.yaml" download="pods/lifecycle-events.yaml"><code>pods/lifecycle-events.yaml</code>
    </a><img src="/images/copycode.svg" class="icon-copycode" onclick="copyCode('pods-lifecycle-events-yaml')" title="Копіювати pods/lifecycle-events.yaml до буферу обміну"></img></div>
    <div class="includecode" id="pods-lifecycle-events-yaml"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">Pod</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">lifecycle-demo</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">containers</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">lifecycle-demo-container</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">nginx</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">lifecycle</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">postStart</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">exec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">command</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;/bin/sh&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;-c&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;echo Hello from the postStart handler &gt; /usr/share/message&#34;</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">preStop</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">exec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">command</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;/bin/sh&#34;</span><span class="p">,</span><span class="s2">&#34;-c&#34;</span><span class="p">,</span><span class="s2">&#34;nginx -s quit; while killall -0 nginx; do sleep 1; done&#34;</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span></code></pre></div></div>
</div>

У файлі конфігурації ви бачите, що команда postStart записує файл `message` в теку `/usr/share` контейнера. Команда preStop відповідним чином вимикає nginx. Це корисно, якщо контейнер перериває роботу через помилку.

Створіть Pod:

```shell
kubectl apply -f https://k8s.io/examples/pods/lifecycle-events.yaml
```

Перевірте, що контейнер у Podʼі працює:

```shell
kubectl get pod lifecycle-demo
```

Отримайте доступ до оболонки контейнера, який працює в Podʼі:

```shell
kubectl exec -it lifecycle-demo -- /bin/bash
```

У своїй оболонці перевірте, що обробник postStart створив файл `message`:

```shell
root@lifecycle-demo:/# cat /usr/share/message
```

Вивід показує текст, записаний обробником postStart:

```none
Hello from the postStart handler
```

<!-- discussion -->

## Обговорення {#discussion}

Kubernetes надсилає подію postStart безпосередньо після створення контейнера. Проте, немає гарантії, що обробник postStart буде викликаний перед тим, як буде викликано точку входу контейнера. Обробник postStart працює асинхронно відносно коду контейнера, але керування Kubernetes блокується до завершення обробника postStart. Статус контейнера не встановлюється як RUNNING до завершення обробника postStart.

Kubernetes надсилає подію preStop безпосередньо перед завершенням роботи контейнера. Керування Kubernetes контейнером блокується до завершення обробника preStop, якщо тайм-аут оновлення Podʼа не закінчився. Докладніше див. [Життєвий цикл Podʼа](/docs/concepts/workloads/pods/pod-lifecycle/).


<div class="alert alert-info" role="note"><h4 class="alert-heading">Примітка:</h4>Kubernetes надсилає подію preStop лише тоді, коли Pod або контейнер у Podʼі <em>завершується</em>. Це означає, що обробник preStop не викликається, коли Pod <em>завершує роботу</em>. Про це обмеження дізнайтеся більше в розділі <a href="/uk/docs/concepts/containers/container-lifecycle-hooks/#container-hooks">Контейнерні обробники</a>.</div>


## Що далі

* Дізнайтеся більше про [обробників життєвого циклу контейнера](/docs/concepts/containers/container-lifecycle-hooks/).
* Дізнайтеся більше про [життєвий цикл Podʼа](/docs/concepts/workloads/pods/pod-lifecycle/).

### Довідка {#reference}

* [Життєвий цикл](/docs/reference/generated/kubernetes-api/v1.36/#lifecycle-v1-core)
* [Контейнер](/docs/reference/generated/kubernetes-api/v1.36/#container-v1-core)
* Дивіться `terminationGracePeriodSeconds` в [Spec Podʼа](/docs/reference/generated/kubernetes-api/v1.36/#podspec-v1-core)
