쿠버네티스는 컨테이너를 개별적으로 배포하는 것이 아니라 Pod라는 단위로 컨테이너를 묶어서 관리하게 됩니다. 하나의 파드는 다수의 컨테이너를 가지고 있을 수는 있는데, 왜 개별적으로 하나씩 컨테이너를 배포하지 않고 여러 개의 컨테이너를 Pod 단위로 묶어서 배포하게 될까요? 이와 같은 이유에는 두가지 특징이 있습니다.
Pod 내의 컨테이너는 IP와 Port를 공유합니다.
즉 두개 이상의 컨테이너가 하나의 파드를 통해 배포되었을 때 localhost로 통신이 가능합니다.
Pod내에 배포된 컨테이너 간에는 디스크 볼륨을 공유할 수 있습니다.
최근 애플리케이션들은 실행할 때 애플리케이션만 올라가는 것이 아니라 로그 수집기와 같은 다양한 솔루션이 함께 배포되는 경우가 많습니다.
특히 로그 수집기와 같은 경우에는 애플리케이션의 로그 파일을 읽어서 수집하기 때문에 애플리케이션과 로그 수집기를 다른 컨테이너로 배포하게 될 경우, 일반적으로는 컨테이너에 의해서 독립적이니 환경으로 파일 시스템이 분리되게 때문에 로그 수집기가 애플리케이션에 배포된 컨테이너의 로그 파일을 읽는 것은 불가능하지만, 쿠버네티스의 경우 하나의 파드 안에서 컨테이너 끼리 볼륨을 공유할 수 있기 때문에 다른 컨테이너의 파일을 읽어올 수 있습니다.
아래의 이미지로 좀 더 자세히 살펴보도록 하겠습니다.
아래의 이미지는 worker node를 나타낸 이미지입니다. 노드의 구조를 살펴보면 node안에 여러 개의 pod가 있고, 그 안에 실질적으로 서비스를 수행하는 작은 container들이 동작하게 됩니다. 애플리케이션과 볼륨이 하나의 pod안에 있음으로써 컨테이너끼리 볼륨을 공유할 수 있게 됩니다.
그 외에도 kublet와 docker가 있는데, 앞서서 설명했듯이 kubelet은 node에서 pod와 container를 관리하는 역할을 하고, docker는 k8s에서 기본적으로 사용하는 container runtime 입니다.
sample.yaml
metadata.name: 파드의 이름을 설정합니다.
metadata.labels.app: 오브젝트를 식별하는 레이블을 설정합니다.
spec.containers[].name: 컨테이너의 이름을 설정합니다.
spec.containers[].image: 컨테이너에서 사용할 이미지를 설정합니다.
spec.containers[].ports.containerPort: 해당 컨테이너에 접속할 포트를 설정합니다.
sample.yaml파일을 위와 같이 작성하고 아래의 명령어를 실행해 클러스터에 적용해볼 수 있습니다.
kubectl apply -f sample.yaml
아래의 명령어는 현재 실행중인 pods에 대한 정보를 확인하기 위한 명령어입니다.
kubectl get pods
아래의 명령어는 파드의 상세한 생명주기를 확인하는 명령어입니다.
kubectl describe pods [파드 이름]
전체를 실행한 내용은 아래와 같습니다.
Pending: 쿠버네티스 시스템에 파드를 생성하는 중입니다. 컨테이너 이미지를 다운로드한 후 전체 컨테이너를 실행하기까지의 과정의 상태입니다.
Running: 파드 안 모든 컨테이너가 실행중인 상태입니다.
Succeeded: 파드 안 모든 컨테이너가 정상 실행 종료된 상태입니다.
Failed: 파드 안 컨테이너 중 정상적으로 실행 종료되지 않은 컨테이너가 있는 상태입니다.
Unknown: 파드의 상태를 확인할 수 없는 상태입니다.