나그네소
kubernetes init container pod 본문
kubernetes에서 제공 하고 있는 init container에서 알아 본다.
하나의 pod에 init container , main container가 2개 있다고 하였을 때 main container에서는 init container에서의 정보를
가지고 와서 수행을 하게 되는데 이러한 환경에서 init container가 성공 해야지만 main container를 실행 할 수 있다.
위와 같은 환경을 적용한 pod를 얘기한다.
가지고 와서 수행을 하게 되는데 이러한 환경에서 init container가 성공 해야지만 main container를 실행 할 수 있다.
위와 같은 환경을 적용한 pod를 얘기한다.
: db를 container를 만든다고 했을 때 무작정 생성 하는 것이 아니라 생성 할 때 어떠한 기준이 있어야 한다면 db main
container 에서 init container 에서의 검증 조건을 생성 하고 main container에서는 init container에서 생성 한 검증 결과가
정상 적이어야만 생성하는 pod를 만들 수 있다.
1. init container
- 앱 컨테이너 실행 전에 미리 동작시킬 컨테이너
- main container가 실행도기 전에 사전 작업이 필요할 경우 사용
- 초기화 컨테이너가 모두 실해오딘 후에 앱 컨테이너를 실행
- sample : https://kubernetes.io/ko/docs/concepts/workloads/pods/init-containers/
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컨테이너가 하나 생성이 된다.
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 |