728x90
Init 컨테이너
init 컨테이너의 특징
- 포드 컨테이너 실행 전에 초기화 역할을 하는 컨테이너
- 완전히 초기화가 진행된 다음에야 주 컨테이너를 실행
- Init 컨테이너가 실패하면, 성공할때까지 포드를 반복해서 재시작
- restartPolicy에 Never를 하면 재시작하지 않음
- 이 yaml은 mydb와 myservice가 탐지될 때까지 init 컨테이너가 멈추지 않고 돌아감
https://kubernetes.io/docs/concepts/workloads/pods/init-containers/#init-containers-in-use
pod-init-container.yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busybox:1.28
command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 3600']
initContainers:
- name: init-myservice
image: busybox:1.28
command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
- name: init-mydb
image: busybox:1.28
command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']
- init 프로세스를 끝낼 수 있는 종결자 등장!
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
함께하기
- pod-init-container.yaml를 작성하여 리소스를 생성하라
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로 생성 및 확인
$ kubectl create -f pod-init-container.yaml
pod/myapp-pod created
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:0/2 0 4s
- myapp-pod 포드에서 주 컨테이너가 실행되지 않는 현상을 관찰하라
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:0/2 0 4s
- 주 컨테이너가 실행되지 않는 이유는 무엇인가?
- init 이 완료되어야 myapp-pod 가 정상 구동되는데 init 이 완료되지 않음
- svc-pod-mydb.yaml을 작성 및 실행하고 주 컨테이너의 반응을 관찰하라
svc-pod-mydb.yaml
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로 생성 후 확인
$ kubectl create -f svc-pod-mydb.yaml
service/myservice created
service/mydb created
$ kubectl get pod -w
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:0/2 0 3m28s
myapp-pod 0/1 Init:1/2 0 4m47s
myapp-pod 0/1 PodInitializing 0 4m48s
myapp-pod 1/1 Running 0 4m49s
- 주 컨테이너가 정상적으로 실행되었는가? 그렇다면 그 이유는 무엇인가?
- init에 대한 조건이 채워지면서 pod이 Initializing 만족하고 구동됨
- 서비스가 다른 서비스에 의존적이라면 init 조건을 걸어서 점검 후에 구동이 되도록 하기 때문임
728x90
'개발강의정리 > DevOps' 카테고리의 다른 글
[데브옵스를 위한 쿠버네티스 마스터] 애플리케이션 스케줄링과 라이프사이클 관리 - 데몬셋 (0) | 2021.01.19 |
---|---|
[데브옵스를 위한 쿠버네티스 마스터] 애플리케이션 스케줄링과 라이프사이클 관리 - 시스템 리소스 요구사항과 제한 설정 (0) | 2021.01.19 |
[데브옵스를 위한 쿠버네티스 마스터] 애플리케이션 스케줄링과 라이프사이클 관리 - 한 포드에 멀티 컨테이너 (0) | 2021.01.19 |
[데브옵스를 위한 쿠버네티스 마스터] 애플리케이션 스케줄링과 라이프사이클 관리 - 초기 명령어 및 아규먼트 전달과 실행 (0) | 2021.01.19 |
[데브옵스를 위한 쿠버네티스 마스터] 애플리케이션 스케줄링과 라이프사이클 관리 - 애플리케이션 변수 관리 (0) | 2021.01.19 |
댓글