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로 통신 가능
✔️ 볼륨을 활용하여 데이터 공유 가능
✔️ 일시적인 리소스이므로 직접 배포하기보다는 컨트롤러 사용이 권장됨
'Kubernetes > Kubernetes Advanced' 카테고리의 다른 글
Kubernetes 리소스 시리즈 #5: Job & CronJob (워크로드 리소스) (0) | 2025.03.05 |
---|---|
Kubernetes 리소스 시리즈 #4: DaemonSet (워크로드 리소스) (0) | 2025.03.05 |
Kubernetes 리소스 시리즈 #3: StatefulSet (워크로드 리소스) (0) | 2025.03.04 |
Kubernetes 리소스 시리즈 #2: ReplicaSet & Deployment (워크로드 리소스) (0) | 2025.03.04 |
Kubernetes 리소스 정리: 개념과 종류 (0) | 2025.03.04 |