diff --git a/Containerization-Orchestration/Kubernetes/workloads/15-lifecycle.md b/Containerization-Orchestration/Kubernetes/workloads/15-lifecycle.md new file mode 100644 index 0000000..13e2f8e --- /dev/null +++ b/Containerization-Orchestration/Kubernetes/workloads/15-lifecycle.md @@ -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 | +