pod/ flow & init container & infra container
# 파드 생성 순서
우리가 마스터 노드에서 kubectl 명령어를 치면 먼저 api 가 문법 맞는지 체크부터한다.
그다음, etcd정보(node정보들)를 가져와서 스케줄러에 보낸다. etcd가 노드 관리하는듯?
스케줄러는 어느 노드에 pod를 띄울지 정하는애니까 이런 정보를 받아야 노드를 정할 수 있을것이다.
스케줄러는 파드를 어느 node에 띄울지 선택하고 띄워준다.
띄워주고 나서는 running상태가 된다.
배치 받고나서는 running상태 or fail상태
뭐 단순하게 배웠는데, 실제 환경에서 테스트를 해보면..
현재 위아래로 세션을 두개 띄웠고 위 세션에서는
kubectl get pods -o wide --watch
명령어로 파드생성을 실시간으로 모니터링하고 있다.
이제 아래 세션에서 새로운 파드를 띄우면 어떻게 될까?
kubectl run test-pod --image=nginx:latest
test-pod가 pending상태였다가 containercreateing상태가 되었다가
최종적으로 running상태가 되며 ready상태가 1/1이 되었다
pending상태까지 마스터노드에서 이것저것 일어나다가
containercreating상태로 되고 최종적으로 container가 만들어지면 running 상태가 되는것이다.
만약 삭제를 한다면
kubectl delete pod test-pod
terminating상태로되면서 최종적으로 없어진다.
edit으로 쓰잘데기없는거 삭제해봤는데 파드상태 watch는 변하지 않았음.
edit은 너무 제한이 많아서 테스트하기 좀 짱난다
이전 redis파일로 edit수정한걸 해봤더니
이렇게 image가 없어서 에러띄웠다가 pull하고 running상태가 되었다.
얘는 노드단까진 문제가 없으니 pending상태는 지난상태에서 동작안됐다가
edit으로 이미지를 제대로 수정해주니 running상태가 된거다.
때문에 get pods명령으로 파드는 있으나 에러있다고 뜨는거..
# 컨테이너 생성을 주물럭거리고 싶을땐? init 컨테이너
파드내에서 이닛컨테이너가 성공해야 메인컨테이너를 띄워줌
https://github.com/arisu1000/kubernetes-book-sample/tree/master/pod
여기서 예제코드들 가져왔다.
암튼 init컨테이너 관련 예제를 살펴보면..
요로코롬 생겼다.
이 pod에서는 총 세 컨테이너를 띄우는데,
서비스컨테이너와 db컨테이너를 init 컨테이너로 띄우고 나서 최종적으로 메인컨테이너인 simple-pod를 띄우게 된다는 뜻이다.
커맨드들땜에 리눅스를 좀 이해해야 순서가 보일듯 하다.
커맨드가 모두 실행되고나서 메인컨테이너가 생성이 되는거다.
해당 yaml파일로 pod를 생성해보면,
이렇게 처음 pending상태였다가, init container를 생성하려고한다.
yaml파일의 sleep2라는 명령어때문에 기다리다가 컨테이너가 하나 생성되고,
또 하나 더 생성되고 최종적으로 메인컨테이너가 실행되는 구조로 되어있다.
쿠버네티스 공식홈페이지 예제는 더욱 더 적나라하다
https://kubernetes.io/docs/concepts/workloads/pods/init-containers/
Init Containers
This page provides an overview of init containers: specialized containers that run before app containers in a Pod. Init containers can contain utilities or setup scripts not present in an app image. You can specify init containers in the Pod specification
kubernetes.io
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"]
위 코드가 init container예제인데,
init container가 두 개 있다.
첫번째로는 myservice라는 init 컨테이너는 myservice라는 서비스가 발견될때까지 계속 기다리고 서비스가 발견되면 생성되고, mydb라는 컨테이너도 같은 로직으로 mydb라는 서비스가 발견되야 생성되는 로직으로 sh스크립트파일이 커맨드에 들어있다.
떄문에 저 파일로 실행을 해보면
pod의 status가 Init:0/2라고 되어있다.
이닛컨테이너 모두 생성 아직 안되어서 메인컨테이너도 생성안된 상태라는 거다.
해당 서비스를 만드는 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
이렇게 두개서비스를 만드는 yaml파일이 있는데 난 파일 두개로 나눴다.
init-service1.yaml과 init-service2.yaml 이렇게 두 개를 만들었다.
kubectl create -f init-service1.yaml
먼저 서비스 하나를 만들어줬더니 init:0/2가 init:1/2로 바뀌었다.
그럼 마저남은 서비스 하나를 더 만들어보자.
이렇게 컨테이너가 하나더 만들어지면서 pod initializing상태에서 바로 running상태가 되었다.
ready가 1/1로도 바뀌었다.
암튼 싱기방기하다.
# infra container (pause)
얘는 개념적인건데 파드가 만들어지면 싱클컨테이너파드라도 몰래 컨테이너가 조그만게 더 만들어진다는거다.
이렇게 싱글 컨테이너 파드를 만들었는데 컨테이너는 분명 한 개만 만들었지만
옆에 조그맣게 infra container가 생긴다는거다.
얘는 pod를 만들면 자동으로 생성이되고 환경을 만들어주는 역할을 한다고 한다.
멀티컨테이너 파드에도 한개가 생긴다. 즉 파드당 한개씩 자동으로 생성되는 컨테이너다.
따라서 해당 pod를 생성하면 같이 생성되고, pod를 삭제하면 얘도 같이 삭제된다.
# 진짜 pod가 있는지 노드에서 직접 확인하기.
난 docker로 구성한게 아니라 containerd로 구성했었다. 이건 사실 글에서 추가해서 적는건데.. 난 노드에서 직접 컨테이너를 찾으려고 ctr containers ls 로 쳤었는데 안됐다.
분명 test1 pod와 test3 pod가 각각 worker1, worker2노드에 띄워져있다. 그리고 worker2노드에 가서,
ctr containers ls
이걸로 현재 띄워져있는 컨테이너를 확인하려고 해봤는데, (docker ps 랑 같은 명령어임. containerd에서)
안뜬다..
그래서 선생님 찬스썼는데 선생님도 해맸었다.
암
containerd는 네임스페이스가 있다고 한다.
쿠버네티스용 컨테이너들은 워커노드에서 k8s.io라는 네임스페이스에서 존재한다고 한다.
때문에 아래 명령어를 치면 나온다.
ctr --namespace k8s.io containers ls
컨테이너 뜬다.
이거 마스터노드에서 컨테이너 데이터? 들어있는 어디에 비슷하게 다 들어있는데 그렇게까지 전문적으로는 볼 레벨이아니라 여기까지 쓰겠다