Pod란?
쿠버네티스는 컨테이너를 개별적으로 배포하는 것이 아니라 Pod라는 단위로 컨테이너를 묶어서 관리하게 됩니다. 하나의 파드는 다수의 컨테이너를 가지고 있을 수 있는데, 왜 개별적으로 하나씩 컨테이너를 배포하지 않고 여러 개의 컨테이너를 Pod단위로 묶어서 배포하게 될까요? 이와 같은 이유에는 두 가지 특징이 있습니다.
- Pod 내의 컨테이너는 IP와 Port를 공유합니다.
즉 두개 이상의 컨테이너가 하나의 파드를 통해 배포되었을 때 localhost로 통신이 가능합니다. - Pod내에 배포된 컨테이너 간에는 디스크 볼륨을 공유할 수 있습니다.
최근 애플리케이션들은 실행할 때 애플리케이션만 올라가는 것이 아니라 로그 수집기와 같은 다양한 솔루션이 함께 배포되는 경우가 많습니다.
특히 로그수집기 같은 경우에는 애플리케이션의 로그 파일을 읽어서 수집하기 때문에 애플리케이션과 로그 수집기를 다른 컨테이너로 배포하게 될 경우, 일반적으로는 컨테이너에 의해서 독립적인 환경으로 파일 시스템이 분리되기 때문에 로그 수집기가 애플리케이션에 배포된 컨테이너의 로그 파일을 읽는 것이 불가능하지만, 쿠버네티스의 경우 하나의 파드 안에서 컨테이너끼리 볼륨을 공유할 수 있기 때문에 다른 컨테이너의 파일을 읽어올 수 있습니다.
아래의 이미지로 좀 더 자세히 살펴보도록 하겠습니다.
아래의 이미지는 worker node를 나타낸 이미지입니다. 노드의 구조를 살펴보면 node안에 여러 개의 pod가 있고, 그 안에 실질적으로 서비스를 수행하는 작은 container들이 동작하게 됩니다. 이때 애플리케이션과 볼륨이 하나의 pod안에 있음으로써 컨테이너끼리 볼륨을 공유할 수 있게 됩니다.
그 외에도 kubelet와 docker가 있는데, 앞선 포스팅에서 설명했듯이 kubelet는 node에서 pod와 container를 관리하는 역할을 하고 그 옆의 docker는 k8s에서 기본적을 사용하는 container runtime입니다.
Pod 사용하기
그렇다면 pod를 직접 사용해보도록 하겠습니다. 해당 포스팅에서는 kubernetes가 설치되어 있다는 가정하에 진행됩니다.
sample.yaml
apiVersion: v1
kind: Pod
metadata:
name: kubernetes-simple-pod
labels:
app: kubernetes-simple-pod
spec:
containers:
- name: kubernetes-simple-pod
image: arisu1000/simple-container-app:latest
ports:
- containerPort: 8080
- .metadata.name : 파드의 이름을 설정합니다.
- .metadata.labels.app : 오브젝트를 식별하는 레이블을 설정합니다.
- .spec.containers[].name : 컨테이너의 이름을 설정합니다.
- .spec.containers[].image : 컨테이너에서 사용할 이미지를 설정합니다.
- .spec.containers[].ports[].containerPort : 해당 컨테이너에 접속할 포트를 설정합니다.
sample.yaml라는 이름으로 저장하고 kubectl apply -f sample.yaml 명령어를 실행해 클러스터에 적용해보도록 하겠습니다.
그리고 kubectl get pods(po, pod) 명령어로 현재 실행 중인 pods를 출력했을 때 STATUS 항목이 Running인 경우 정상적으로 파드를 실행시킨 것입니다.
파드를 실행시켜보았다면 kubectl delete pod kubernetes-simple-pod 명령어로 파드를 삭제합니다.
Pod Life Cycle
방금 실행시켰던 Pod에서 SATUS가 Running이라면 정상적으로 실행된 것이라고 이야기했습니다.
이와 같이 파드에는 생성부터 삭제까지 과정에 생명주기가 존재합니다. 파드의 상세한 생명주기는 kubectl describe pods <파드 이름>의 명령어로 확인할 수 있습니다. 방금 전 삭제했던 파드를 다시 실행시킨 후 명령어를 입력해 보겠습니다.
먼저 필드 중 STATUS 항목을 살펴보겠습니다. 앞서 말씀드렸다시피 Running상태는 컨테이너가 정상적으로 실행 중인 상태입니다. 그렇다면 다른 상태는 어떤 것이 있는지 알아보겠습니다.
STATUS
- Pending : 쿠버네티스 시스템에 파드를 생성하는 중입니다. 컨테이너 이미지를 다운로드한 후 전체 컨테이너를 실행하기까지의 과정의 상태입니다.
- Running : 파드 안 모든 컨테이너가 실행 중인 상태입니다.
- Succeeded : 파드 안 모든 컨테이너가 정상 실행 종료된 상태입니다.
- Failed : 파드 안 컨테이너 중 정상적으로 실행 종료되지 않은 컨테이너가 있는 상태입니다.
- Unknown : 파드의 상태를 확인할 수 없는 상태입니다. 보통 파드 들어있는 노드와 통신할 수 없을 때 이러한 현상이 나타납니다.
STATUS 밑으로 내려가다 보면 Conditions라는 항목이 있습니다. Conditions는 파드의 상태 정보를 나타낸 정보입니다.
Conditions
Type | Status | 설명 |
Initialized | True / False / Unknown (상태 알 수 없음) | 모든 초기화 컨테이너가 성공적으로 시작함 |
Ready | True / False / Unknown | 파드가 요청을 수행할 수 있음 |
ContainerReady | True / False / Unknown | 파드 안 모든 컨테이너가 준비 상태임 |
PodScheduled | True / False / Unknown | 파드가 하나의 노드로 스케줄을 완료함 |
Unschedulable | True / False / Unknown | 스케줄러가 자원의 부족이나 기타 제약으로 현재 파드를 스케줄 할 수 없음. |
'DevOps > Kubernetes' 카테고리의 다른 글
[Kubernetes] Service / Ingress: L4 L7 Load Balancer (0) | 2020.07.16 |
---|---|
[Kubernetes] 쿠버네티스 컨트롤러: Pod를 동적으로 관리 (0) | 2020.07.13 |
[Kubernetes] Pod #2: 쿠버네티스 셀프 힐링 및 자원 할당 (0) | 2020.07.13 |
[Kubernetes] 쿠버네티스의 기본 구조와 개념 (0) | 2020.07.10 |
[Kubernetes] 쿠버네티스의 등장 배경 (0) | 2020.02.02 |