[k8s] 4-3. init container
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-myservice
와 init-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/
댓글남기기