개발강의정리/DevOps

[데브옵스를 위한 쿠버네티스 마스터] 애플리케이션 스케줄링과 라이프사이클 관리 - Init 컨테이너

nineDeveloper 2021. 1. 19.
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

댓글

💲 추천 글