DevOps/Kubernetes

[Kubernetes] Pod #1: 쿠버네티스에서 컨테이너를 담당하는 기본 단위

ooeunz 2020. 7. 10. 19:05
반응형

Pod란?

쿠버네티스는 컨테이너를 개별적으로 배포하는 것이 아니라 Pod라는 단위로 컨테이너를 묶어서 관리하게 됩니다. 하나의 파드는 다수의 컨테이너를 가지고 있을 수 있는데, 왜 개별적으로 하나씩 컨테이너를 배포하지 않고 여러 개의 컨테이너를 Pod단위로 묶어서 배포하게 될까요? 이와 같은 이유에는 두 가지 특징이 있습니다.

 

 

  1. Pod 내의 컨테이너는 IP와 Port를 공유합니다.
    즉 두개 이상의 컨테이너가 하나의 파드를 통해 배포되었을 때 localhost로 통신이 가능합니다.
  2. 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 명령어로 파드를 삭제합니다.

 

cluster에 sample app 배포해보기

 

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 스케줄러가 자원의 부족이나 기타 제약으로 현재 파드를 스케줄 할 수 없음.

 

반응형