pod란?
kubernetes에서 가장 기본적인 배포 단위이다. 간단히 1개의 가상이미지라고 보면 된다.
container란?
pod를 이루는Application으로 생각하면 된다. init container는 app container가 구동되기 이전에pod를 초기화해주는 container이다.
pod의 환경 설정 또는 기타 다른 부수적인 작업을 하기 위해 일회성으로 구동되는 것이다.
init container란?
init container는 말 그대로 초기화를 위한 목적이기 때문에 container 개수로는 잡히지 않는다. app container와 다른 한 가지 특성이 있다면, 반드시 init container -> app container로 구동된다. 그래서 init container에서 에러가 발생할 경우 app container가 구동되지 않는다.
보안상 이유로 앱 컨테이너 이미지와 같이 두면 안 되는 앱의 소스 코드를 별도로 관리할 때 유용하다.
일반적인 컨테이너와의 차이점
초기화 컨테이너는 앱 컨테이너의 리소스 상한(limit), 볼륨, 보안 세팅을 포함한 모든 필드와 기능을 지원한다. 그러나, 초기화 컨테이너를 위한 리소스 요청량과 상한은 리소스에 문서화된 것처럼 다르게 처리된다.
또한, 초기화 컨테이너는 lifecycle, livenessProbe, readinessProbe 또는 startupProbe 를 지원하지 않는다. 왜냐하면 초기화 컨테이너는 파드가 준비 상태가 되기 전에 완료를 목표로 실행되어야 하기 때문이다.
init container 실습하기
1) 파일 작성하기
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app.kubernetes.io/name: 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"]
위의 파일은 두개의 초기화 컨테이너를 포함한다. 첫번째 초기화 컨테이너는 myservice 서비스를 기다리고, 두번째는 mydb 서비스를 기다린다.
2) 파일 생성하기
kubectl apply -f pod-init.yaml
위와 같은 command를 작성하면 pod가 생성된다.
3) pod 상태 확인하기
kubectl get -f pod-init.yaml
kubectl describe -f pod-init.yaml
위의 command를 작성하면 아래와 같이 나온다.
Name: myapp-pod
Namespace: default
[...]
Labels: app.kubernetes.io/name=MyApp
Status: Pending
[...]
Init Containers:
init-myservice:
[...]
State: Running
[...]
init-mydb:
[...]
State: Waiting
Reason: PodInitializing
Ready: False
[...]
Containers:
myapp-container:
[...]
State: Waiting
Reason: PodInitializing
Ready: False
[...]
위의 초기화 컨테이너를 running상태이지만, 나머지 init container는 waiting 상태이다. 초기화 컨테이너가 다 running이 되어야 container가 running상태가 된다.
4) 서비스 생성하기
---
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
mydb 와 myservice 서비스를 생성한다.
5) pod 상태 확인하기
kubectl get -f pod-init.yaml
Name: myapp-pod
Namespace: default
[...]
Labels: app.kubernetes.io/name=MyApp
Status: Pending
[...]
Init Containers:
init-myservice:
[...]
State: Terminated
Reason: Completed
[...]
init-mydb:
[...]
State: Terminated
Reason: Completed
[...]
Containers:
myapp-container:
[...]
State: Running
[...]
위와 같이 상태가 변한 것을 확인할 수 있다.
👇🏻 참고 사이트
https://kubernetes.io/ko/docs/concepts/workloads/pods/init-containers/