Init container
초기화 컨테이너는 pods의 앱 컨테이너들이 실행되기 전에 실행되는 특수한 컨테이너이다.
초기화 컨테이너는 앱 이미지에는 없는 유틸리티 또는 설정 스크립트 등을 포함할 수 있다.
초기화 컨테이너와 일반 컨테이너 차이점
- 초기화 컨테이너는 항상 완료를 목표로 실행된다.
- 각 초기화 컨테이너는 다음 초기화 컨테이너가 시작되기 전에 성공적으로 완료되어야 한다.
만약 파드의 초기화 컨테이너가 실패하면, kubelet은 초기화 컨테이너가 성공할 때까지 반복적으로 재시작한다.
그러나, 만약 파드의 restartPolicy 를 절대 하지 않음(Never)으로 설정하고,
해당 파드를 시작하는 동안 초기화 컨테이너가 실패하면, 쿠버네티스는 전체 파드를 실패한 것으로 처리한다.
https://kubernetes.io/ko/docs/concepts/workloads/pods/init-containers/
실습
master node에서 작업
busybox 컨테이너와 이에 대한 서비스를 실행하는 init 컨테이너를 yaml파일로 작성해보자.
vi init-container-main.yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busybox
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: busybox
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
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"]
이쪽은 서비스를 지정해주는 yaml이다.
vi init-container-srv.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
k create -f init-container-main.yaml
k create -f init-container-srv.yaml
k get services
이때, 한번 서비스를 삭제해보자.
k delete services mydb myservice
서비스를 삭제해도 pods가 동작하고 있다.
init 컨테이너는 pods가 시작할 때만 필요하기 때문이다.
k delete pods myapp-pod
'Kubernetes' 카테고리의 다른 글
pods 및 컨테이너 리소스 관리 (0) | 2022.12.29 |
---|---|
스태틱(static) pods (1) | 2022.12.29 |
kubernetes Probe (0) | 2022.12.27 |
kubectl config 명령어 (클러스터 context 변경) (0) | 2022.12.27 |
Namespace (0) | 2022.12.26 |