In Kubernetes, Init Containers are specialized containers that run before the main application containers within a Pod. They are designed to perform setup tasks or ensure certain conditions are met before the primary containers start.​

Purpose of Init Containers

Init Containers are useful for:​

  • Performing setup tasks: Such as initializing databases or configuring services.
  • Ensuring dependencies are available: For instance, waiting for a service to become accessible.
  • Preparing the environment: Like setting up configuration files or directories.​

They run sequentially, and each must complete successfully before the next starts. If any Init Container fails, Kubernetes restarts the Pod until all Init Containers succeed.

Example: Implementing Init Containers

In order to run a simple Init Containers I used a yaml configuration from the kubernetes documentation

#
apiVersion: v1
kind: Pod
metadata:
  name: initpod-app
  labels:
    app.kubernetes.io/name: initpod
spec:
  containers:
  - name: app-container
    image: busybox
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']
  initContainers:
  - name: init-myservice
    image: busybox
    command: ["sleep", "20"]
  - name: init-mydb
    image: busybox
    command: ["sleep", "10"]

In this setup:​

  • init-myservice sleeps in 20 seconds after initialization
  • init-mydb container sleeps in 10 seconds after initialization
  • Once both Init Containers complete does the main app-container start.​

To deploy this Pod:​

[admin@workstation kubernetes]$ kubectl apply -f practice/initpod.yaml 
pod/initpod-app created
[admin@workstation kubernetes]$ kubectl get pods
NAME          READY   STATUS     RESTARTS      AGE
initpod-app   0/1     Init:0/2   0             19s

Additional Use Cases

Beyond the basic example, Init Containers can be employed for various tasks:​

  • Fetching configuration files: Downloading necessary configs from external sources.
  • Running database migrations: Ensuring the database schema is up-to-date before the application starts.
  • Setting permissions: Adjusting file or directory permissions required by the main container.
  • Loading secrets: Retrieving sensitive information securely before application initialization. ​

References: