← 모든 글

Pod 생성과 관리 - 쿠버네티스의 기본 단위 이해하기

CKA 시험 준비를 시작하며 쿠버네티스의 가장 기본이 되는 Pod에 대해 학습한 내용을 정리했습니다

CKA 준비 · 1 / 8편

이 글의 목차

학습 예시 안내: 본문의 상황과 출력은 개념 설명을 위한 예시로 정리했습니다. 당시 실행 여부는 확인되지 않았으며, 현재 환경에서의 클러스터 실습도 별도 검증이 필요합니다.

🎯 학습 목표

이 글을 통해 다음을 학습할 수 있습니다:

  • Pod의 개념과 쿠버네티스에서의 역할
  • kubectl을 이용한 Pod 생성과 관리 방법
  • YAML 매니페스트를 활용한 Pod 정의
  • Pod 상태 확인과 디버깅 기본기
  • CKA 준비 과정에서 연습할 Pod 관련 문제 패턴

📚 CKA 준비를 시작하며

이 연재는 CKA(Certified Kubernetes Administrator) 준비를 위한 쿠버네티스 개념과 구성 예제를 정리합니다.

첫 글에서는 쿠버네티스의 기본 배포 단위인 Pod의 생성과 관리 방법을 다룹니다.

💡 Pod란 무엇인가?

Pod의 기본 개념

Pod는 쿠버네티스에서 배포 가능한 가장 작은 단위입니다. 하나 이상의 컨테이너를 포함할 수 있으며, 같은 Pod 내의 컨테이너들은 다음을 공유합니다:

  • 네트워크: 같은 IP 주소와 포트 공간
  • 스토리지: 볼륨을 통한 데이터 공유
  • 라이프사이클: Pod가 생성되고 삭제될 때 함께 관리

Pod vs Container

Container: 애플리케이션이 실행되는 환경
Pod: 하나 이상의 컨테이너를 묶어서 관리하는 단위

컨테이너와 Pod를 구분할 때는 같은 Pod에 속한 컨테이너가 네트워크와 볼륨을 공유한다는 점을 살펴보면 좋습니다.

🛠 실습 환경 구성

로컬 쿠버네티스 클러스터 준비

로컬 실습 환경을 준비할 때 사용할 수 있는 명령 예시입니다:

# minikube 설치 및 시작
minikube start --driver=docker
minikube status

# kubectl 설치 확인
kubectl version --client
kubectl cluster-info

기본 네임스페이스 확인

# 현재 네임스페이스 확인
kubectl config get-contexts

# 기본 네임스페이스의 Pod 목록 확인
kubectl get pods

📝 Pod 생성 방법 학습

1. 명령어로 직접 생성 (Imperative)

먼저 명령어로 Pod를 생성하는 예제입니다:

# nginx Pod 생성
kubectl run nginx-pod --image=nginx

# Pod 생성 확인
kubectl get pods
kubectl get pods -o wide  # 더 자세한 정보 확인

출력 형식 예시:

NAME        READY   STATUS    RESTARTS   AGE   IP           NODE
nginx-pod   1/1     Running   0          30s   172.17.0.3   minikube

2. YAML 매니페스트로 생성 (Declarative)

같은 구성을 파일로 관리할 수 있도록 YAML 매니페스트로 작성합니다:

# simple-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: simple-pod
  labels:
    app: web
    environment: dev
spec:
  containers:
  - name: nginx-container
    image: nginx:1.21
    ports:
    - containerPort: 80
# YAML 파일로 Pod 생성
kubectl apply -f simple-pod.yaml

# 적용된 내용 확인
kubectl get pods simple-pod -o yaml

3. 복잡한 Pod 구성 예제

여러 컨테이너를 하나의 Pod에 배치하는 예제입니다:

# multi-container-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: multi-container-pod
spec:
  containers:
  - name: web-server
    image: nginx
    ports:
    - containerPort: 80
    volumeMounts:
    - name: shared-data
      mountPath: /usr/share/nginx/html
  
  - name: content-manager
    image: busybox
    command: ['sh', '-c']
    args:
    - |
      while true; do
        echo "Current time: $(date)" > /shared/index.html
        sleep 30
      done
    volumeMounts:
    - name: shared-data
      mountPath: /shared
  
  volumes:
  - name: shared-data
    emptyDir: {}

이 예제에서 살펴볼 내용은 다음과 같습니다:

  • 한 Pod에 여러 컨테이너 배치하기
  • 볼륨을 통한 데이터 공유
  • 컨테이너 간 협력 관계 구성

🔍 Pod 상태 확인과 관리

기본 조회 명령어들

# Pod 목록 확인
kubectl get pods                    # 기본 정보
kubectl get pods -o wide           # 노드, IP 정보 포함
kubectl get pods --show-labels     # 라벨 정보 포함
kubectl get pods -A                # 모든 네임스페이스

# 특정 Pod 상세 정보
kubectl describe pod nginx-pod

# Pod의 YAML 매니페스트 확인
kubectl get pod nginx-pod -o yaml

Pod 상태 이해하기

Pod 상태를 해석할 때 참고할 각 phase의 의미입니다:

상태 의미 설명
Pending 대기 중 스케줄링 되지 않았거나 이미지 다운로드 중
Running 실행 중 노드에 배치되어 컨테이너가 생성됐고, 하나 이상이 실행·시작·재시작 중
Succeeded 성공 완료 모든 컨테이너가 성공적으로 종료
Failed 실패 모든 컨테이너가 종료됐고, 하나 이상이 실패로 종료
Unknown 알 수 없음 Node와의 통신 문제로 상태 확인 불가

Running만으로 요청을 처리할 준비가 됐다고 판단할 수는 없습니다. Ready 조건도 확인해야 하며, kubectl get pods의 STATUS 표시는 위 Pod phase와 항상 같지는 않습니다. Pod 생명주기

실시간 로그 확인

# Pod 로그 확인
kubectl logs nginx-pod

# 실시간 로그 스트리밍
kubectl logs nginx-pod -f

# 다중 컨테이너 Pod의 특정 컨테이너 로그
kubectl logs multi-container-pod -c web-server

🚨 문제 해결과 디버깅

Pod가 실행되지 않을 때

Pod가 Pending 상태에서 진행되지 않는 상황을 가정해 봅니다:

# 문제 상황 확인
kubectl get pods
# NAME        READY   STATUS    RESTARTS   AGE
# test-pod    0/1     Pending   0          2m

# 상세 정보로 원인 파악
kubectl describe pod test-pod

Events 섹션을 보면 원인을 찾을 수 있습니다:

Events:
  Warning  FailedScheduling  2m    default-scheduler  0/1 nodes are available: 1 insufficient memory.

컨테이너 접속하기

# Pod 내부 컨테이너에 접속
kubectl exec -it nginx-pod -- /bin/bash

# 다중 컨테이너의 경우 컨테이너 지정
kubectl exec -it multi-container-pod -c web-server -- /bin/bash

# 간단한 명령어 실행
kubectl exec nginx-pod -- ls -la /usr/share/nginx/html

Pod 삭제와 강제 삭제

# 정상 삭제 (Graceful termination)
kubectl delete pod nginx-pod

# YAML 파일로 생성한 리소스 삭제
kubectl delete -f simple-pod.yaml

# 강제 삭제 (비상시에만 사용)
kubectl delete pod nginx-pod --force --grace-period=0

🎯 CKA 대비 연습 패턴

다음은 Pod 관리를 익히기 위한 연습 예제입니다. 실제 시험의 출제 빈도나 문제를 확인한 목록은 아닙니다:

1. 빠른 Pod 생성

# 시험에서 시간 단축을 위한 명령어
kubectl run test-pod --image=nginx --dry-run=client -o yaml > pod.yaml
kubectl apply -f pod.yaml

2. 특정 조건의 Pod 생성

# 환경변수가 설정된 Pod 생성
kubectl run env-pod --image=nginx --env="ENV=production"

# 특정 포트를 노출하는 Pod 생성
kubectl run web-pod --image=nginx --port=80

3. Pod 문제 해결

  • Pod가 실행되지 않는 이유 찾기
  • 리소스 부족 문제 해결
  • 이미지 Pull 실패 문제 해결

💡 오늘의 핵심 정리

꼭 기억할 kubectl 명령어

# Pod 관리 필수 명령어 모음
kubectl run <pod-name> --image=<image>          # Pod 생성
kubectl get pods -o wide                        # Pod 조회
kubectl describe pod <pod-name>                 # 상세 정보
kubectl logs <pod-name> -f                      # 로그 확인
kubectl exec -it <pod-name> -- /bin/bash        # 컨테이너 접속
kubectl delete pod <pod-name>                   # Pod 삭제

YAML 작성 시 주의사항

  • 들여쓰기: 공백을 일관되게 사용하며, 이 글에서는 2칸을 사용 (탭 X)
  • apiVersion: Pod는 항상 v1
  • metadata.name: DNS 서브도메인 규칙 준수
  • spec.containers: 배열 형태로 작성

자주 하는 실수들

  • ❌ kind: pod (소문자) → ✅ kind: Pod (대문자)
  • ❌ 탭으로 들여쓰기 → ✅ 공백으로 들여쓰기
  • ❌ 컨테이너 이름 중복 → ✅ Pod 내에서 고유한 이름 사용

🚀 다음 학습 계획

Pod 기초를 어느 정도 익혔으니 다음에는 이런 내용들을 학습할 예정입니다:

다음 주제들

  • ReplicaSet과 Deployment를 이용한 Pod 관리
  • Service를 통한 Pod 네트워킹
  • ConfigMap과 Secret으로 설정 관리
  • Pod 리소스 제한과 요청 설정
  • Liveness와 Readiness Probe 구성

실습 목표

  • kubectl 명령어 속도 향상 (CKA 시험 대비)
  • 복잡한 YAML 매니페스트 작성 능력 향상
  • 문제 상황 발생 시 빠른 디버깅 능력 개발

이 글의 핵심은 컨테이너와 Pod의 차이, 같은 Pod 안에서의 네트워크·볼륨 공유, 상태와 이벤트를 읽는 방법입니다. 이 개념은 여러 Pod를 관리하는 리소스를 이해하는 기초가 됩니다.

다음 글에서는 ReplicaSet과 Deployment로 여러 Pod를 관리하는 방법을 다룹니다.


🔗 참고 자료:


yellow.log · 2025.07.29에 작성 · 2026.09.29에 수정

CKA 준비 전체 8편

  1. 1.Pod 생성과 관리 - 쿠버네티스의 기본 단위 이해하기읽는 중
  2. 2.ReplicaSet과 Deployment로 Pod 관리하기 - 확장성과 가용성 확보
  3. 3.Service를 통한 Pod 네트워킹 - 안정적인 접근 경로 만들기
  4. 4.ConfigMap과 Secret으로 설정 관리하기 - 환경별 설정 분리
  5. 5.Pod 리소스 제한과 요청 설정 - 안정적인 클러스터 운영을 위한 리소스 관리
  6. 6.Liveness와 Readiness Probe 구성 - 헬스체크와 자동 복구
  7. 7.네임스페이스를 통한 리소스 격리와 다중 테넌시 - 팀별, 환경별 격리
  8. 8.Ingress를 통한 외부 트래픽 관리와 라우팅 - 클러스터의 똑똑한 관문 구축