최대 1 분 소요

init container

앱 컨테이너 실행 전에 미리 동작시킬 컨테이너

main Container가 실행되기 전에 사전 작업이 필요한 경우 사용

init 컨테이너가 모두 실행된 후에 앱 컨테이너를 실행

예시 파일

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-container
    image: busybox:1.28
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']
  initContainers:
  - name: init-myservice
    image: busybox:1.28
    command: ['sh', '-c', "until nslookup myservice.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for myservice; sleep 2; done"]
  - name: init-mydb
    image: busybox:1.28
    command: ['sh', '-c', "until nslookup mydb.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for mydb; sleep 2; done"]

실행결과

$ kubectl get -f myapp.yaml
NAME        READY     STATUS     RESTARTS   AGE
myapp-pod   0/1       Init:0/2   0          6m

해당 pod를 실행시키기 위해서는

init-myserviceinit-mydb가 동작해야 한다. 다음과 같은 서비스를 실행시키게 되면

---
apiVersion: v1
kind: Service
metadata:
  name: myservice
spec:
  ports:
  - protocol: TCP
    port: 80
    targetPort: 9376
---
apiVersion: v1
kind: Service
metadata:
  name: mydb
spec:
  ports:
  - protocol: TCP
    port: 80
    targetPort: 9377

출력결과

$ kubectl apply -f services.yaml

service/myservice created
service/mydb created

$ kubectl get -f myapp.yaml

NAME        READY     STATUS    RESTARTS   AGE
myapp-pod   1/1       Running   0          9m

정상적으로 실행되는 것을 볼 수 있음

동작 과정

파드 시작 시에 kubelet은 파드의 초기화 컨테이너를 실행한다.

각 초기화 컨테이너는 다음 컨테이너가 시작되기 전에 성공적으로 종료되어야 한다.

파드는 모든 초기화 컨테이너가 성공해야 Ready 된다.

만약 파드가 재시작되었다면, 모든 초기화 컨테이너는 반드시 다시 실행된다.

초기화 컨테이너는 멱등성(idempotent, 항상 같은 결과)을 유지해야 한다.

참고 : https://kubernetes.io/ko/docs/concepts/workloads/pods/init-containers/

댓글남기기