소개

이 실습에서는 Kubernetes 에서 배포할 수 있는 가장 작은 단위인 Pod를 살펴봅니다.

Pod 는 Kubernetes 가 노드에 스케줄링하는 객체입니다. Kubernetes 에서는 일반적으로 컨테이너를 단독으로 직접 실행하지 않습니다. 대신 컨테이너를 Pod 안에 배치합니다.

Pod 에는 네트워크와 스토리지 컨텍스트를 공유하는 하나 이상의 컨테이너가 포함될 수 있습니다. 대부분의 초급 예제에서는 컨테이너 하나만 사용하지만, 공유 환경을 제공하는 설계가 핵심 개념입니다.

다음 작업을 수행합니다.

  • YAML 구성 파일 (청사진) 을 사용해 Pod 를 정의합니다.
  • kubectl을 사용해 클러스터에 Pod 를 생성합니다.
  • Pod 의 상태를 확인해 실행 중인지 확인합니다.
  • Pod 의 상세 구성과 이력을 검사합니다.

이 실습을 마치면 클러스터의 Pod 안에서 실제 웹 서버가 실행됩니다.

Pod 정의하기

이 단계에서는 첫 번째 Pod 를 정의합니다. Kubernetes 는 YAML 형식으로 구성을 작성합니다. YAML 파일은 애플리케이션이 어떤 모습이어야 하는지 정확히 설명하는 청사진 또는 레시피와 같습니다.

Pod 는 Kubernetes 가 스케줄링하는 가장 작은 객체이지만 컨테이너와 같은 것은 아닙니다. 컨테이너는 실행 중인 애플리케이션 프로세스와 파일 시스템 이미지입니다. Pod 는 하나 이상의 컨테이너를 감싸는 Kubernetes 의 래퍼입니다. 이 래퍼는 컨테이너에 공유 네트워크 ID, 공유 수명 주기, 선택적 공유 스토리지를 제공합니다.

Pod 정의에는 다음 네 가지 주요 요소가 필요합니다.

  • apiVersion: 사용하는 Kubernetes 언어의 버전입니다.
  • kind: 생성할 객체의 종류입니다 (이 경우 Pod).
  • metadata: 이름과 레이블처럼 객체를 식별하는 정보입니다.
  • spec: 레시피의 핵심인 "사양"입니다. 실행할 컨테이너를 설명합니다.

nginx-pod.yaml이라는 파일을 생성합니다. 이 파일은 nginx 이미지 (널리 사용되는 웹 서버) 를 사용해 컨테이너 하나를 실행하는 nginx-pod라는 Pod 를 정의합니다.

nano 텍스트 편집기로 파일을 생성합니다.

nano nginx-pod.yaml

다음 내용을 파일에 복사해 붙여넣습니다. 앞에서 설명한 네 가지 섹션이 어떻게 구성되어 있는지 주의 깊게 확인합니다.

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
    - name: nginx
      image: nginx:latest
      ports:
        - containerPort: 80

기본 nano에서 저장하고 종료하려면 Ctrl+X를 누른 다음 저장을 확인하기 위해 Y를 입력하고, 파일 이름에 저장하려면 Enter를 누릅니다.

이제 첫 번째 Kubernetes 청사진을 작성했습니다. 이 파일은 Kubernetes 에 다음과 같이 지시합니다. "nginx-pod라는 Pod를 원합니다. 그 안에서 nginx 이미지를 사용하는 컨테이너 하나를 실행해 주세요."

Pod 생성하기

이제 청사진 (nginx-pod.yaml) 을 Kubernetes 라는 시공 담당자에게 전달할 차례입니다.

이를 위해 kubectl apply 명령을 사용합니다. 이 명령은 Kubernetes 에 다음과 같이 구성합니다. "원하는 상태는 다음과 같습니다. 이 상태가 되도록 만들어 주세요."

**원하는 상태 (desired state)**는 Kubernetes 의 핵심 개념 중 하나입니다. 시스템에 수행할 모든 하위 수준의 단계를 일일이 지시하지 않습니다. 대신 원하는 최종 결과를 선언하면 Kubernetes 컨트롤러가 실제 상태가 선언한 상태와 일치할 때까지 계속 작업합니다.

다음 명령을 실행해 Pod 를 생성합니다.

kubectl apply -f nginx-pod.yaml

다음과 같은 확인 메시지가 표시됩니다.

pod/nginx-pod created

이 명령을 실행하면 청사진이 Kubernetes API 서버 (Control Plane) 로 전송됩니다. 그런 다음 Scheduler 가 Pod 를 배치할 적절한 Node 를 찾고, 해당 Node 의 Kubelet 이 Pod 를 실행하기 위해 Nginx 이미지를 다운로드하기 시작합니다.

상태 확인하기

이 단계에서는 새 Pod 의 진행 상태를 확인합니다. Pod 생성은 즉시 완료되지 않습니다. 컨테이너 이미지를 다운로드하고 애플리케이션을 시작하는 데 시간이 걸립니다.

기억해야 할 중요한 점이 있습니다. kubectl apply는 요청을 제출하기만 하므로 일반적으로 빠르게 반환됩니다. 실제 작업은 클러스터 내부에서 비동기적으로 수행됩니다. 따라서 상태 확인은 문제가 있다는 의미가 아니라 일반적으로 이어서 수행하는 두 번째 단계입니다.

Pod 의 상태를 확인하려면 get 명령을 사용합니다.

kubectl get pods

Pod 목록이 표 형식으로 표시됩니다. STATUS 열을 확인합니다.

NAME        READY   STATUS    RESTARTS   AGE
nginx-pod   1/1     Running   0          15s
  • STATUS: 가장 중요한 필드입니다.

    • ContainerCreating: 시스템이 아직 이미지를 다운로드하거나 컨테이너를 시작하는 중입니다.
    • Running: 성공입니다. Pod 가 실행 중이며 정상 상태입니다.
    • Pending: 클러스터가 Pod 를 배치할 위치를 결정하는 중입니다.
    • Error 또는 CrashLoopBackOff: 문제가 발생했습니다 (예: 애플리케이션이 비정상 종료됨).
  • READY: 1/1로 표시되며, Pod 에 정의된 컨테이너 1 개 중 1 개가 트래픽을 처리할 준비가 되었다는 뜻입니다.

ContainerCreating이 표시되면 몇 초 기다린 후 kubectl get pods를 다시 실행합니다. Running으로 표시되면 Nginx 웹 서버가 실행 중인 상태입니다.

세부 정보 검사하기

이 단계에서는 내부에서 어떤 일이 일어나는지 확인하는 방법을 배웁니다. get 명령은 요약 정보를 보여 주지만, 특히 문제가 발생했을 때 정확히 어떤 일이 일어났는지 확인해야 할 수 있습니다.

describe 명령은 Kubernetes 리소스에 대한 상세 보고서를 제공합니다.

초보자는 kubectl get과 kubectl describe를 서로 다른 관찰 수준으로 이해하면 됩니다. get은 "현재 주요 상태가 무엇인가?"라는 질문에 답하고, describe는 "현재 상태가 되기까지 무슨 일이 있었는가?"라는 질문에 답합니다. 이 이벤트 이력은 근본 원인을 가장 빠르게 찾는 방법인 경우가 많습니다.

다음 명령을 실행해 nginx-pod를 검사합니다.

kubectl describe pod nginx-pod

많은 정보가 출력됩니다. 출력의 맨 아래로 이동해 Events 섹션을 찾습니다. 이 섹션에는 Pod 가 시작된 과정이 시간 순서대로 표시됩니다.

Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  ...   default-scheduler  Successfully assigned default/nginx-pod...
  Normal  Pulling    ...   kubelet            Pulling image "nginx:latest"
  Normal  Pulled     ...   kubelet            Successfully pulled image "nginx:latest"...
  Normal  Created    ...   kubelet            Created container nginx
  Normal  Started    ...   kubelet            Started container nginx

이 이벤트 로그는 문제를 해결할 때 가장 먼저 확인해야 하는 정보입니다. Pod 가 Pending 또는 Error 상태에서 멈춰 있으면 대개 Events 섹션에서 그 원인을 확인할 수 있습니다 (예: "Insuficient CPU" 또는 "ImagePullBackOff").

이제 첫 번째 Kubernetes Pod 를 생성하고, 상태를 확인하고, 세부 정보를 검사했습니다.

요약

이 실습에서는 Kubernetes 의 기본 구성 요소인 Pod의 개념을 익혔습니다.

다음 작업을 성공적으로 수행했습니다.

  1. Nginx Pod 의 YAML 청사진을 작성했습니다.
  2. kubectl apply를 사용해 클러스터에 배포했습니다.
  3. kubectl get을 사용해 Running 상태인지 확인했습니다.
  4. kubectl describe를 사용해 시작 이력을 자세히 확인했습니다.

Pod 를 이해하는 것은 중요합니다. Kubernetes 의 다른 모든 개념인 Deployment, Service, StatefulSet 도 결국 Pod 를 관리하기 위한 기능이기 때문입니다. 이제 더 고급 주제를 학습할 준비가 되었습니다.