- Pod 개념(복습) 및 사용
- livenessProbe를 사용한 self-healing Pod
- init container ← 오늘 볼 내용
- infra container(pause) 이해 ← 오늘 볼 내용
- static pod 만들기
- Pod에 resource 할당
- 환경변수를 이용해 컨테이너에 데이터 전달
- pod 구성 패턴의 종류
3. init container
Init Container(초기화 컨테이너)는 파드 내의 어플리케이션(main) 컨테이너가 시작되기 전에 실행되는 특수한 종류의 컨테이너다.
Init Container는 주로 어플리케이션(main) 컨테이너가 실행되기 전에 필요한 초기화 작업을 수행하는 데 사용된다.
초기화 작업이 완료되면 Init Container는 종료되고, 어플리케이션(main) 컨테이너가 시작된다.
https://kubernetes.io/ko/docs/concepts/workloads/pods/init-containers/
위 공식문서를 통해서 개념에 대해 이해해보자.
init container는 yaml코드의 spec부분에 정의되어 동일한 파드 내에 메인 컨테이너가 실행되기 전 일종의 초기화 작업을 수행하여 메인 컨테이너가 실행되기 위해 필요한 설정이나 데이터 준비, 네트워크 설정 등을 수행한다.
init container는 초기에 한번 생성된 이후에는 더이상 필요가 없으며 삭제되더라도 해당 파드의 실행 상태는 변함이 없다.
myapp.yaml
# myapp.yaml
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"]
위 yaml 코드는 busybox 이미지를 사용하여 3개의 컨테이너가 생성되는데 두개의 컨테이너는 init container로 메인 컨테이너를 실행시키기 위해 선행 동작하게 된다.
첫번째 init container의 command에 기재된 명령은 nslookup을 통해 myservice라는 서비스의 DNS 이름이 해결될 때까지 즉, 실행될 때까지 루프하는 내용이며 myservice가 실행될 때까지 init container의 실행은 완료되지 않는다.
두번째 init container도 마찬가지로 mydb 서비스가 실행되기 전까지는 init container의 실행은 완료되지 않는다.
yaml파일 실행
# myapp.yaml 실행
kubectl create -f myapp.yaml
생성된 파드 확인
# 파드 확인
kubectl get -f myapp.yaml
yaml파일로 파드를 생성하면 파드의 메인 컨테이너가 0/1상태로 실행되지 않음을 볼 수 있다.
또한 STATUS 필드에 Init:0/2 이라 표시되어있는데 이는 보다시피 init container들이 아직 실행되지 않은 상태라는 뜻이다.
좀 더 자세하게 확인해보자.
# 더 자세하게 파드 확인
kubectl describe -f myapp.yaml
현재 상태는 init container가 실행할 수 없는 상태이므로 Ready가 False로 되어있고 마찬가지로 메인 컨테이너도 Ready가 False 상태로 모두 완료 상태가 아니다.
컨테이너 로그 확인
kubectl logs myapp-pod -c init-myservice # Inspect the first init container
kubectl logs myapp-pod -c init-mydb # Inspect the second init container
로그를 보더라도 init container는 myservice와 mydb 서비스를 찾고 있을뿐 완료되지 못하고 있다.
이번에는 init container가 동작하기 위해 필요한 service들을 실행시킴으로 메인 컨테이너가 실행되도록 만들어보자.
services.yaml
# services.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
이 두가지 서비스는 각각 myservice, mydb의 DNS 주소나 클러스터의 IP로 접근을 시도했을 때 처음 80번 포트로 들어오는 트래픽을 9376, 9377번 포트로 전달하는 역할을 한다.
myservice와 mydb 서비스를 실행시킨다.
# 서비스 실행
kubectl create -f services.yaml
서비스를 실행시키니 init container가 동작을 완료하고 메인 컨테이너가 실행됨으로 파드는 완전히 running 상태가 되었다.
이것이 init container에 대한 내용이며 init container를 통해 메인 애플리케이션 컨테이너가 실행되기에 필요한 조건을 달성한 후에 메인 컨테이너를 실행시킴으로 컨테이너 실행에 대한 안정성을 높일 수 있다.
4. infra container(pause)의 이해
인프라 컨테이너(Infrastructure Container)는 주로 시스템 수준의 작업을 수행하는 데 사용되는 컨테이너를 나타낸다.
이러한 컨테이너는 주로 호스트 운영체제의 리소스나 네트워크 설정, 로깅, 감시, 백업 등과 관련된 작업을 담당한다.
인프라 컨테이너는 주로 시스템 관리 및 운영을 위해 생성되며, 어플리케이션의 실행과는 별도로 구성된다.
pause 컨테이너가 바로 그 인프라 컨테이너로 분류된다.
파드가 실행될 때 겉으로는 드러나지 않지만 pause 컨테이너가 함께 생성된다.
실제로 pause 컨테이너는 아무런 동작을 하지 않고 항상 대기 상태에 머물러 있다.
pause 컨테이너는 쿠버네티스에서 네트워크 모델을 구현하기 위한 장치 즉, 파드의 네트워크 네임스페이스를 공유하고, 파드 내의 다른 컨테이너 간 통신을 조율하기 위한 목적으로 존재하며 애플리케이션 컨테이너가 존재하는 한 계속해서 대기 상태로 존재한다.
만약 docker런타임을 이용하고 있는 이전 버전의 쿠버네티스 사용한다면 파드가 실행되고 있는 노드로 접속하여 다음과 같은 명령을 입력하면 pause 컨테이너의 존재를 확인할 수 있다.
# pause 컨테이너 확인하기
docker ps
하지만 containerd를 런타임으로 사용하고 있는 경우 파드 내부에 pause 컨테이너를 확인하는 방법이 없다.
containerd는 파드의 실행과 관리를 중점으로 두기 때문에 프로세스를 직접 확인하는 명령은 containerd의 목적이 아니므로 확인할 방법이 없다(어떻게 잘 찾아보면 나올지도...).
pause 컨테이너는 파드가 생성되면서 함께 생성되는 컨테이너이므로 물론 파드가 사라지면 함께 사라진다.
아래 영상을 참고했습니다.
https://youtube.com/playlist?list=PLApuRlvrZKohaBHvXAOhUD-RxD0uQ3z0c&si=hbPclcPuc-6lTNdE
https://github.com/arisu1000/kubernetes-book-sample/blob/master/pod/pod-init.yaml
'Kubernetes' 카테고리의 다른 글
Kubernetes 기초 - Pod(6) (0) | 2023.12.08 |
---|---|
Kubernetes 기초 - Pod(5) (0) | 2023.12.07 |
Kubernetes 기초 - Pod(3) (0) | 2023.12.07 |
Kubernetes 기초 - Pod(2) (0) | 2023.12.06 |
Kubernetes 기초 - Pod(1) (0) | 2023.12.06 |