k8s lifecycle doc

This commit is contained in:
2025-10-04 09:55:15 +03:30
parent 6beeea3e5c
commit bec8b349be

View File

@@ -0,0 +1,140 @@
# Kubernetes Lifecycle Hooks: `postStart` and `preStop`
## Overview
In Kubernetes, **lifecycle hooks** allow you to run specific code when a container starts or stops. These hooks are part of a containers lifecycle and are useful for performing setup and cleanup tasks.
The two main lifecycle hooks are:
* **`postStart`** Executed immediately after the container starts.
* **`preStop`** Executed just before the container stops.
These hooks can be defined inside the container specification in a Pod manifest.
---
## 1. `postStart` Hook
### Description
The `postStart` hook runs **immediately after a container is created**, but before it is marked as *Running*. It can be used to perform initialization tasks that need to occur right after startup.
The `postStart` hook supports two types of actions:
* `exec` Run a command inside the container.
* `httpGet` Send an HTTP request to a specified endpoint inside the container.
### Notes
* The `postStart` hook and the containers main process run **concurrently**.
* If the hook fails, the container is considered to have failed and will be restarted according to its restart policy.
### Example
```yaml
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "echo Container started at $(date) >> /var/log/startup.log"]
```
Using an HTTP GET action:
```yaml
lifecycle:
postStart:
httpGet:
path: /startup
port: 8080
```
### Common Use Cases
* Initializing configuration files or environment data.
* Sending startup notifications to monitoring systems.
* Preparing application dependencies.
---
## 2. `preStop` Hook
### Description
The `preStop` hook runs **just before a container is terminated**. Kubernetes will execute the hook and wait for it to complete before sending the `SIGTERM` signal to the containers main process.
This hook is typically used to ensure a **graceful shutdown** of the application.
Like `postStart`, it supports:
* `exec`
* `httpGet`
### Notes
* The hook must complete within the time defined by `terminationGracePeriodSeconds`.
* If the hook does not finish within that time, the container will be forcibly terminated.
### Example
```yaml
lifecycle:
preStop:
exec:
command: ["/bin/sh", "-c", "echo Shutting down... >> /var/log/shutdown.log && sleep 5"]
```
### Common Use Cases
* Closing active connections.
* Flushing logs or metrics.
* Deregistering the service from a load balancer or discovery system.
* Notifying external systems about the shutdown event.
---
## 3. Full Example
```yaml
apiVersion: v1
kind: Pod
metadata:
name: lifecycle-demo
spec:
containers:
- name: demo-container
image: nginx
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "echo 'Container started!' > /usr/share/nginx/html/index.html"]
preStop:
exec:
command: ["/bin/sh", "-c", "echo 'Container stopping...' >> /usr/share/nginx/html/index.html && sleep 10"]
terminationGracePeriodSeconds: 15
```
---
## 4. Best Practices for DevOps Engineers
1. **Handle Signals in Your Application**
Ensure your application properly handles `SIGTERM` and `SIGKILL` for clean shutdowns.
2. **Combine Hooks with Grace Periods**
Use `preStop` together with `terminationGracePeriodSeconds` to allow sufficient cleanup time.
3. **Monitor Hook Execution**
Log hook outputs for debugging and verification.
4. **Avoid Long-Running or Blocking Hooks**
Hooks should be lightweight to avoid delaying container lifecycle events.
---
## 5. Summary
| Hook Type | Trigger Time | Purpose | Common Actions |
| ----------- | ---------------------------------- | ----------------- | ------------------------------------------------- |
| `postStart` | Immediately after container starts | Initialization | Load configs, warm cache, notify service |
| `preStop` | Before container termination | Graceful shutdown | Flush data, close connections, deregister service |