k8s lifecycle doc
This commit is contained in:
@@ -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 container’s 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 container’s 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 container’s 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 |
|
||||||
|
|
||||||
Reference in New Issue
Block a user