Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

클라우드 엔지니어 꿈나무

Kubernetes(K8S) 따배쿠 Pod : init container & infra container - Centos7 본문

kubernetes

Kubernetes(K8S) 따배쿠 Pod : init container & infra container - Centos7

새싹싹이 2023. 10. 14. 16:44

init container

main container를 실행하는데 필요로 하는 환경 세팅

db 를 접속해서 정보들을 가져오는 컨테이너

login application - main container 

init 컨테이너가 실행되지 않으면 main container 실행 안 됨 (앱 컨테이너를 실행하기 전에 미리 동작 시킬 컨테이너)

main 컨테이너가 실행되기 전에 사전 작업이 필요한 경우 사용

 

# vi 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: #초기화 컨테이너, name2개로 init 컨테이너가 2개인 것을 볼 수 있다.
  - 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"]
    #until command 조건이 false인 경우에만 반복 until 뒤의 명령이 실패되면! 
    # myservice가 동작하지 않으면 계속 반복해라 do까지 계속 반복하다가 동작하면 sleep2; 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"]
    #mydb가 실행되지 않는 동안 반복 (실행되면 종료)
    
    #init container 가 두 개면 두 개다 실행되어야 main container가 실행된다

# kubectl create namespace alone

# kubectl create -f init-container.yaml -n alone

# watch kubectl get pod -n alone

status init 및 READY 0/1 t => 메인 컨테이너가 동작 중이지 않은 것을 확인할 수 있음

# vi myser.yaml

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

# kubectl create-f myser.yaml -n alone

myservice 가 실행됐기 때문에 Init container 하나가 실행되어 init:1/2 로 변경

# vi myser.yaml 

yaml 파일에 db 추가

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 create -f myser.yaml -n alone

(이미 myservice 가 있다고 뜨지만 mydb 서비스도 잘 생성됨)

mydb 까지 실행되어 main container가 실행된 것을 확인할 수 있음

 

Infra Container(pause)

Pod 안에는 pause 라는 컨테이너가 자동으로 생성됨 (kubectl get pod로는 보이지 않음)

Pod 에 대한 infra를 관리하고 생성

 

#ssh node2 => node2 접속(pod 가 생성된 node로 접속)

docker ps 또는 crictl ps로 확인 가능

 

<<참고>>

컨테이너를 도커로 사용한 경우, docker ps 로 pauser container 확인이 가능하나 containerd의 경우, crictl ps 로 확인이 불가하다. 때문에 docker images로 이미지 생성 여부로 확인해야 한다.

 

<<참고>>

https://youtu.be/ChArV14J6Ek?si=7gec4WQxUhZe70GD