나그네소

kubernetes init container pod 본문

Cloud/Kubernetes

kubernetes init container pod

나그네소티 2022. 11. 9. 20:33

kubernetes에서 제공 하고 있는 init container에서 알아 본다. 

 

하나의 pod에 init container , main container가 2개 있다고 하였을 때 main container에서는 init container에서의 정보를
가지고 와서 수행을 하게 되는데 이러한 환경에서 init container가 성공 해야지만 main container를 실행 할 수 있다.
위와 같은 환경을 적용한 pod를 얘기한다.

: db를 container를 만든다고 했을 때 무작정 생성 하는 것이 아니라 생성 할 때 어떠한 기준이 있어야 한다면 db main

container 에서 init container 에서의 검증 조건을 생성 하고 main container에서는 init container에서 생성 한 검증 결과가

정상 적이어야만 생성하는 pod를 만들 수 있다. 

 

1. init container

2. example(init-container-exam.yaml)

위의 kubernetes.io/ko link 가면 예제가 있다. 자주 참고 하자.
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"]

  • name: myapp-container 
    • main container
    • init myservice, mydb가 성공 적으로 실행 되어야지 main container가 수행
  • name: init-myservice
    • init container
    • until nslookup myservice
      myservice가 동작 중이어야 돼.
      • myservice가 실패 하면 아래의 shell를 계속 반복 수행 해라.
      • myservice가 실행 될 때까지 계속 수행
      • myservice가 수행 되고 있으면 sleep 2 done으로 종료 된다.
  • name: init-mydb
    mydb가 동작 중이어야 돼
    • init container
    • until nslookup mydb
      • mydb가 실패 하면 아래의 shell을 계속 반복 수행 해라
      • mydb가 실행 될때까지 계속 수행
      • mydb가 수행 되고 있으면 sleep 2 done으로 종료 된다.

 

3. init example container 수행 단계

 

3-1) init-container-exam.yaml exeucte

kuber-master:/home/son_kube/tmp] k apply -f init-container-exam.yaml

 

3-2) 현재 상태

kuber-master:/home/son_kube] k get pods -o wide --watch
NAME        READY   STATUS     RESTARTS   AGE   IP             NODE          NOMINATED NODE   READINESS GATES
myapp-pod   0/1     Init:0/2   0          43s   10.244.1.235   kuber-node1   <none>           <none>
: init container가 아직 수행 중이여서 main container(myapp-pod)가 redy중인것을 알 수 있다. 
: kuber-master:/home/son_kube/tmp] k describe pods myapp-pod
Init Containers:
  init-myservice:
    Container ID:  containerd://e7a4062543495e323e6cbe7cd521c12111be5d0693f23032d90ec759edfbcd8e
    Image:         busybox:1.28
    Image ID:      docker.io/library/busybox@sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47
    Port:          <none>
    Host Port:     <none>
    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
    State:          Running
      Started:      Wed, 09 Nov 2022 08:35:45 +0900
    Ready:          False
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-jhxjb (ro)
  init-mydb:
    Container ID:  
    Image:         busybox:1.28
    Image ID:      
    Port:          <none>
    Host Port:     <none>
    Command:
      sh

......
main, init container 상태를 확인 한다.

 

3-3)  init container에서 확인 하는 service type에서 myservice,mydb를 수행 한다.

[service.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 apply -f service.yaml

step4. 동작 상태 확인
kuber-master:/home/son_kube] k get pods -o wide --watch
NAME        READY   STATUS     RESTARTS   AGE   IP             NODE          NOMINATED NODE   READINESS GATES
myapp-pod   0/1     Init:0/2   0          43s   10.244.1.235   kuber-node1   <none>           <none>
myapp-pod   0/1     Init:1/2   0          18m   10.244.1.235   kuber-node1   <none>           <none>
myapp-pod   0/1     PodInitializing   0          18m   10.244.1.235   kuber-node1   <none>           <none>
myapp-pod   1/1     Running           0          18m   10.244.1.235   kuber-node1   <none>           <none>

: myapp-pod main container가 init container가 수행 되면서 정상 적으로 기동 되는 것을 알 수 있다.  

 

[infra container(pause)]
pod가 생성 될 때 생성 되는 ip나 환경을 관리해 주는 안보이는 컨테이너가 있는데 이를 pause 컨테이너라 한다.
pod에서 container가 생성이 되면 자동으로 이를 관리해주는 pause컨테이너가 하나 생성이 된다.
: 이게 예전에는 docker ps로 보면 컨테이너 생성 시 pasue 컨테이너 생성이 보였는데 kuernetes 1.20 이후로docker 지원 하지 않기에 볼 수 없다. 그래서 생성이 되는지 확인을 할 수가 없다.

 

'Cloud > Kubernetes' 카테고리의 다른 글

kubernetes Pod Resource 조절 하기  (0) 2022.11.17
kubernetes Pod - static Pod  (0) 2022.11.17
kubernetes livenessProbe  (0) 2022.11.09
kubernetes POD 동작 Flow  (0) 2022.11.09
kubernetes pod container 정리  (0) 2022.11.09