kubernetes

kubernetes init container

mingming_96 2023. 8. 29. 17:23

init container 

main container를 시작하기 위한 초기화 컨테이너 

- 앱 컨테이너 실행 전에 미리 동작 시킬 컨테이너 ( init container가 동작하지 않으면 main container도 동작하지 않음)

- init container 가 모두 실행 된 후에 main container를 실행 

 

Kubernetes에서 "Init Container"는 Pod 내에서 메인 컨테이너가 시작되기 전에 실행되는 부가적인 컨테이너입니다. Init Container는 주로 메인 컨테이너가 시작되기 전에 필요한 초기화 작업을 수행하는 데 사용됩니다. 이는 애플리케이션의 시작 전에 필요한 준비 작업이나 데이터 로딩, 설정 구성 등을 처리하는 데 유용합니다.

 

초기화 및 사전 조건 작업: Init Container는 메인 컨테이너가 시작되기 전에 실행되므로, 애플리케이션이 동작하기 전에 필요한 초기화 작업을 수행할 수 있습니다. 예를 들어, 데이터베이스 초기화, 파일 다운로드, 환경 변수 설정 등을 처리할 수 있습니다.

종속성 해결: 애플리케이션이 여러 종속성을 가지고 있는 경우, Init Container를 사용하여 이러한 종속성을 미리 처리하고 애플리케이션을 시작할 때에는 완전히 준비된 상태로 실행할 수 있습니다.

병렬 처리: Init Container와 메인 컨테이너는 병렬로 실행될 수 있습니다. 따라서 Init Container가 작업을 처리하는 동안 메인 컨테이너가 시작되도록 할 수 있습니다.

컨테이너 간 데이터 공유: Init Container는 Pod 내의 다른 컨테이너와 동일한 볼륨을 공유하므로, 데이터를 생성하거나 처리한 후에 해당 데이터를 볼륨에 저장하고 메인 컨테이너와 공유할 수 있습니다.

실행 완료 후 종료: Init Container는 자신의 작업을 완료한 후 종료됩니다. 따라서 메인 컨테이너가 시작될 때에는 더 이상 필요하지 않은 컨테이너가 제거되게 됩니다.

Init Container는 Kubernetes의 Deployment, StatefulSet, Job 등과 함께 사용될 수 있으며, 애플리케이션 배포 및 관리 과정에서 초기화 및 사전 조건 작업을 효과적으로 처리하는 데 도움을 줍니다.

 

init-container.yaml

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 

until nslookup myservice.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for myservice; sleep 2; done

nslookup myservice 명령어가 실행되지 않으면  echo wating for myservice 명령어를 반복하게 하는 명령어 입니다.

 

 

mydb

until nslookup mydb.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for mydb;

nslookup mydb 명령어가 실행되지 않으면 echo wating for mydb 명령어를 반복하게 하는 명령어 입니다. 

 

따라서 initContainer가 동작하지 않아 main container가 동작하지 않는다 .

 

myservice.yaml

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

myservice를 먼저 동작시켜보기 ! 

kubectl apply -f myservice.yaml

 

두개의 init container 중 init-service container가 실행된 것을 확인할 수 있습니다.

 

mydb.yaml

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

mydb 동작 시켜보기

kubectl apply -f mydb.yaml

init-service container가 실행되고 메인 컨테이너가 실행되었습니다. 

 

Infra Container

실행되는 Pod 안에 아무일도 하지 않는 Pause라는 컨테이너가 생성된다. Pod에 대한 ip , hostname 등 관리하고 생성해주는 컨테이너