mingming

kubernetes init container 본문

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 등 관리하고 생성해주는 컨테이너 

 

 

 

'kubernetes' 카테고리의 다른 글

kubernetes static Pod  (0) 2023.08.30
kubernets Metal LB 설치하기  (0) 2023.08.30
kubernetes livenessProve  (1) 2023.08.27
EKS Amazon EFS CSI Driver (helm)  (1) 2023.08.25
EKS AWS Load Balancer Controller (helm)  (0) 2023.08.25