포드의 생명주기

포드(Pod)는 쿠버네티스에서 아주 기본적이고 필수적인 개념입니다. 강의를 들으면서 “포드의 생명주기(Pod Lifecycle)”라는 것을 알게 되었는데, 단순히 여러 단계에 대한 설명을 간략히 들었었습니다.

개인적으로 Kubernetes를 공부하다보니 “포드의 생명주기를 이해하는것”이 왜 중요한지를 알고 싶어졌고, 이 중요성을 알기전엔 포드의 생명주기가 뜻하는 바와 동작 원리를 먼저 알아야 된다고 생각했습니다.

오늘 포스팅에서는 포드가 지닌 여러 상태를 눈으로 직접 확인해볼 수 있는 예제를 실습해보려 합니다.

포드의 상태 실습하기

Pending

포드가 API 서버에 처음 생성되면 Pending 상태가 됩니다. 이 단계에서는 포드에 필요한 모든 데이터 볼륨을 할당하고, 초기화 컨테이너를 실행하며, 포드가 실행될 노드를 스케쥴링하기 위해 컨트롤 플레인과 통신합니다.

Pending상태는 일반적으로 직접 관찰하기가 어렵습니다. 대부분의 경우 빠르게 포드를 스케줄링하기 때문인데요. 보통 리소스 부족, 스토리지 문제, 네트워크 문제 등 다양한 원인으로 인해 발생할 수 있습니다.

실습은 간단한 busybox를 사용할 예정이고, Pending 상태를 확인하기 위해 없는 라벨을 노드 셀렉터로 지정해보겠습니다.

# busybox-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: busybox
spec:
  containers:
    - name: busybox
      image: busybox
  nodeSelector:
    disktype: ssd

위와 같이 yaml 파일을 생성했습니다.

그리고 나서 포드를 생성해주는 명령어를 입력하면

pending

짠. 없는 라벨을 지정해주었기 때문에 Pending상태에 빠진 포드를 볼 수 있습니다.

kubectl describe pod busybox

를 실행해서 자세히 살펴보면

describe

포드의 스케줄링에 실패했음을 확인할 수 있습니다. 또한, 자세한 내용을 살펴보면 노드 선택 조건이 불일치했음을 확인할 수 있습니다.

CrashLoopBackOff

이는 직접적인 포드의 상태가 아니라 컨테이너가 반복적으로 실패하고 재시작될 때 나타나는 문제상태입니다. yaml파일을 조금 수정해서 CrsahLoopBackOff상태를 확인해보겠습니다.

# busybox-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: busybox
spec:
  containers:
    - name: busybox
      image: busybox
      command: ['/bin/sh']
      args: ['-c', 'exit 1']

이 yaml 파일은 쉘 스크립트에 exit 1명령어를 직접 전달하여 비정상적인 종료코드 1로 프로세스를 종료시키고자 했습니다. 따라서 컨테이너는 지속해서 실패 상태로 종료될 것입니다.

그럼 아래와 같은 내용을 볼 수 있습니다.

스크린샷 2023-09-30 오후 11 37 49

포드가 가지는 생명주기 중 일부 상태를 실습을 통해 간단히 확인해봤는데요. 다음 포스팅에선 생명주기를 아주 자세히 다뤄보겠습니다.