Kubernetes(K8S) 따배쿠 Pod : init container & infra container - Centos7
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