kubernetes init container CrashLoopBackOff

2/12/2017

I am creating a Replication controller with one init-container. however the init container fails to start and the status of the pod is:

NAME                       READY     STATUS             RESTARTS   AGE
testcontainer   0/1       CrashLoopBackOff   12         37m

I am not sure what part is failing exactly, and the logs do not help. My kubectl server version is 1.4 (different from client version) so I am using:

annotations:
        pod.beta.kubernetes.io/init-containers:

Here is the replication controller yaml file I am using. I am using the "hello-world" image (instead of the nginx to make it faster)

apiVersion: v1
kind: ReplicationController
metadata:
  name: testcontainer
spec:
  replicas: 1
  selector:
    app: nginx
  template:
    metadata:
      labels:
        app: nginx
      annotations:
        pod.beta.kubernetes.io/init-containers: '[
            {
                "name": "install",
                "image": "hello-world"
            }
        ]'
    spec:
      containers:
      - name: nginx
        image: hello-world
      dnsPolicy: Default
      nodeName: x.x.x.x

logs from kubectl describe pod:

Warning FailedSync      Error syncing pod, skipping: failed to "StartContainer" for "nginx" with CrashLoopBackOff: "Back-off 5m0s restarting failed container=nginx pod=testcontainer()"

  32m   16s     145     {kubelet x.x.x.x}  spec.containers{nginx}  Warning BackOff Back-off restarting failed docker container

when I check the logs of both containers (nginx and testcontainer) it shows the output of running the hello-world image, so I guess the image is downloaded and started successfully. Im not sure what fails after that ( I even tried creating a single pod, using the example provided on https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-initialization/#creating-a-pod-that-has-an-init-container , but still fails)

-- greg
kubernetes

1 Answer

2/12/2017

I think the problem here isn't the init container. The hello-world image print a text and exits immediately. Since .spec.restartPolicy of the pod defaults to Always, it just restarts the pod every time.

The error message might be a bit confusing, but since the pod is intended to run forever it quite makes sense to display an error, even if the exit code is 0.

If you want to run a pod only a single time, you should use the job API.


Since you are interested in an example for the init-container, I fixed your example:

apiVersion: v1
kind: ReplicationController
metadata:
  name: testcontainer
spec:
  replicas: 1
  selector:
    app: nginx
  template:
    metadata:
      labels:
        app: nginx
      annotations:
        pod.beta.kubernetes.io/init-containers: '[
            {
                "name": "install",
                "image": "hello-world"
            }
        ]'
    spec:
      containers:
      - name: nginx
        image: nginx # <--- this image shouldn't be a single shot application
      dnsPolicy: Default
      nodeName: x.x.x.x
-- svenwltr
Source: StackOverflow