Kubernetes/Kubernetes Advanced

Kubernetes 리소스 시리즈 #1: Pod (워크로드 리소스)

ygtoken 2025. 3. 4. 23:39
728x90

Kubernetes(쿠버네티스)에서 가장 기본적인 실행 단위는 Pod입니다.
Pod는 하나 이상의 컨테이너(Container)로 구성되며, 동일한 네트워크 공간을 공유하는 리소스입니다.
이번 글에서는 Pod의 개념, 네트워킹, 볼륨 활용법, 라이프사이클, 그리고 실전 활용법을 정리하겠습니다.


🔹 Pod란?

Pod는 Kubernetes에서 배포 가능한 가장 작은 단위이며, 하나 이상의 컨테이너와 그 컨테이너들이 실행되는 환경을 정의합니다.
즉, 여러 개의 컨테이너가 하나의 Pod 내부에서 서로 협력하여 애플리케이션을 실행할 수 있습니다.

✔️ 하나 이상의 컨테이너로 구성 가능
✔️ 같은 네트워크 네임스페이스를 공유 (localhost로 통신 가능)
✔️ 컨테이너 간 스토리지 공유 가능
✔️ 일시적인 존재 (기본적으로 영구적이지 않음)


🔹 Pod의 기본 구조

Pod는 YAML 매니페스트 파일을 통해 정의됩니다.
아래는 단일 컨테이너를 실행하는 기본 Pod 예제입니다.

apiVersion: v1  # Kubernetes API 버전 (Pod는 v1 API 사용)
kind: Pod  # 생성할 리소스 종류 (Pod)
metadata:
  name: my-pod  # Pod의 이름
  labels:  # 레이블 추가 (서비스 및 관리 용도)
    app: my-app
spec:
  containers:  # Pod 내부에서 실행될 컨테이너 정의
    - name: my-container  # 컨테이너 이름
      image: nginx  # 사용할 컨테이너 이미지 (nginx 웹서버)
      ports:
        - containerPort: 80  # 컨테이너에서 오픈할 포트 (Nginx 기본 포트)

📌 Pod의 주요 필드 설명

필드 설명

apiVersion: v1 사용할 API 버전 (v1은 기본 Pod API)
kind: Pod 생성할 리소스 종류 (Pod)
metadata.name Pod의 이름 (유일해야 함)
metadata.labels Pod를 식별하는 레이블 (서비스 연동 시 유용)
spec.containers Pod 내부에서 실행될 컨테이너 목록
containers.image 사용할 컨테이너 이미지 (Docker Hub에서 가져옴)
containers.ports.containerPort 컨테이너 내부에서 오픈할 포트

💡 컨테이너의 containerPort는 내부 설정일 뿐, 외부에서 접근하려면 Service를 설정해야 합니다.


🔹 Pod의 네트워킹

Pod는 Kubernetes 클러스터 내에서 각각 고유한 IP 주소를 가지며, 같은 Pod 내 컨테이너들은 localhost를 통해 통신할 수 있습니다.
Pod 간 통신은 Service를 통해 이루어집니다.

📌 여러 개의 컨테이너가 포함된 Pod 예제

apiVersion: v1
kind: Pod
metadata:
  name: multi-container-pod
spec:
  containers:
    - name: web  # 첫 번째 컨테이너 (Nginx 웹서버)
      image: nginx
      ports:
        - containerPort: 80
    - name: sidecar  # 두 번째 컨테이너 (로그 처리)
      image: busybox
      command: ["sh", "-c", "echo 'Sidecar container is running'; sleep 3600"]

💡 Pod 내부에서는 localhost:80을 사용하여 두 컨테이너 간 통신이 가능합니다.


🔹 Pod에서 볼륨(Volume) 사용

Pod 내 여러 컨테이너가 데이터를 공유해야 할 경우, Kubernetes의 Volume을 사용합니다.

apiVersion: v1
kind: Pod
metadata:
  name: pod-with-volume
spec:
  volumes:  # Pod에서 사용할 볼륨 정의
    - name: shared-data  # 볼륨 이름
      emptyDir: {}  # Pod가 실행되는 동안 유지되는 임시 볼륨
  containers:
    - name: writer
      image: busybox
      command: [ "sh", "-c", "echo Hello > /data/message; sleep 3600" ]
      volumeMounts:
        - mountPath: "/data"  # 컨테이너 내부 경로
          name: shared-data  # 위에서 정의한 볼륨 사용
    - name: reader
      image: busybox
      command: [ "sh", "-c", "cat /data/message; sleep 3600" ]
      volumeMounts:
        - mountPath: "/data"  # 동일한 볼륨을 마운트
          name: shared-data

💡 writer 컨테이너가 파일을 생성하면, reader 컨테이너가 이를 읽을 수 있습니다.


🔹 Pod의 라이프사이클과 상태

Pod는 생성부터 종료까지 여러 라이프사이클 상태를 거칩니다.

📌 Pod의 상태

상태 설명

Pending Pod가 생성되었지만, 컨테이너가 아직 실행되지 않은 상태
Running 모든 컨테이너가 정상적으로 실행 중인 상태
Succeeded 모든 컨테이너가 정상적으로 종료된 상태
Failed 하나 이상의 컨테이너가 오류로 인해 종료된 상태
Unknown 노드와의 연결이 끊겨 상태를 알 수 없는 경우

💡 Pod 상태 확인 명령어

kubectl get pods
kubectl describe pod my-pod

🔹 Pod 배포 및 삭제

📌 Pod 생성

kubectl apply -f pod.yaml

📌 Pod 삭제

kubectl delete pod my-pod

📌 Pod 로그 확인

kubectl logs my-pod

📌 Pod 내부 접근

kubectl exec -it my-pod -- /bin/sh

💡 이 명령어를 사용하면 컨테이너 내부에서 직접 명령을 실행할 수 있습니다.


🚀 마무리

Kubernetes에서 Pod는 컨테이너를 실행하는 가장 기본적인 단위이며,
실제 운영에서는 Deployment, StatefulSet, DaemonSet과 같은 컨트롤러를 통해 Pod를 관리하게 됩니다.

 

✔️ Pod는 하나 이상의 컨테이너로 구성됨
✔️ 네트워크를 공유하여 localhost로 통신 가능
✔️ 볼륨을 활용하여 데이터 공유 가능
✔️ 일시적인 리소스이므로 직접 배포하기보다는 컨트롤러 사용이 권장됨

 

728x90