학습 예시 안내: 본문의 상황과 출력은 개념 설명을 위한 예시로 정리했습니다. 당시 실행 여부는 확인되지 않았으며, 현재 환경에서의 클러스터 실습도 별도 검증이 필요합니다.
🎯 학습 목표
이 글을 통해 다음을 학습할 수 있습니다:
- 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.Pod 생성과 관리 - 쿠버네티스의 기본 단위 이해하기읽는 중
- 2.ReplicaSet과 Deployment로 Pod 관리하기 - 확장성과 가용성 확보
- 3.Service를 통한 Pod 네트워킹 - 안정적인 접근 경로 만들기
- 4.ConfigMap과 Secret으로 설정 관리하기 - 환경별 설정 분리
- 5.Pod 리소스 제한과 요청 설정 - 안정적인 클러스터 운영을 위한 리소스 관리
- 6.Liveness와 Readiness Probe 구성 - 헬스체크와 자동 복구
- 7.네임스페이스를 통한 리소스 격리와 다중 테넌시 - 팀별, 환경별 격리
- 8.Ingress를 통한 외부 트래픽 관리와 라우팅 - 클러스터의 똑똑한 관문 구축