[CKAD] Pods

HongSeokChoi·2025년 8월 27일

ckad

목록 보기
4/14


1. Pod란?

  • 쿠버네티스에서 배포 가능한 가장 작은 컴퓨팅 단위
  • 보통 하나의 Pod는 하나의 애플리케이션을 포함한다
  • Pod는 Node 위에서 동작하며, 자원이 부족하면 새로운 Node가 추가되어 Pod가 생성된다
  • 스케일 아웃 시 애플리케이션 단위가 아니라 Pod 단위로 증가한다
  • 하나의 Pod 안에 여러 컨테이너가 있을 경우, 스토리지 공유와 상호 통신이 가능하다
    → 예전 Docker의 --link 옵션을 대체하는 개념

2. 매니페스트 파일 구조 (YAML)

쿠버네티스의 매니페스트 파일은 YAML 포맷을 사용한다.
필수 항목은 다음 네 가지다:

  • 'apiVersion': 우리가 만드려는 kubernetes object의 version을 적어주면 된다.
  • 'kind': kuberntes object를 적어주면 된다. 가령 pod인지 service인지를 써주면 된다.
  • 'metadata': object의 이름, label들을 타겟으로 쓸 수 있다.
  • 'spec': spec안은 kuberntes object의 특성들을 적어주면 된다. 이는 object가 무엇이냐에 따라 다르지만, 대부분 container를 포함한다.

예시: pod-definition.yaml

apiVersion: v1               # API 버전 (v1, apps/v1, apps/v1-beta 등)
kind: Pod                    # 리소스 종류 (Pod, Service, ReplicaSet, Deployment 등)

metadata:                    # 메타데이터 (name, labels 등)
  name: myapp-pod
  label:
    app: myapp
    type: server

spec:                        # Pod의 구체적 스펙 정의
  containers:                # 컨테이너는 배열 형태로 여러 개 정의 가능
  - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80

※ 주석 처리된 예시처럼 backend-container 등을 추가해 여러 컨테이너를 정의할 수 있음.

3. Pod 생성 및 접근 방법

Pod 생성

kubectl create -f pod-definition.yaml

Port Forwarding

kubectl port-forward my-app-nginx 8080:80

RESULT

Forwarding from 127.0.0.1:8080 -> 80
Forwarding from [::1]:8080 -> 80
Handling connection for 8080

→ 이렇게 설정하면 로컬에서 http://localhost:8080 으로 접근 가능


4. 단일 vs 다중 컨테이너 Pod

  • 단일 컨테이너 Pod: 가장 일반적인 형태

  • 다중 컨테이너 Pod (Sidecar 패턴)

    • 헬퍼 컨테이너와 함께 실행
    • 컨테이너 간 통신은 localhost 사용 (동일 네트워크 네임스페이스 공유)
    • 스토리지 공유 가능 (Volume 활용)
    • Pod 단위로 스케줄링되므로, 모든 컨테이너는 반드시 같은 노드에 배치됨

5. Pod 생명주기 (Lifecycle)

상태설명관련 명령어
PendingPod가 생성됐지만 스케줄링/이미지 Pull 중kubectl get pods
ContainerCreating컨테이너 생성 중kubectl get pods
Running컨테이너 정상 실행 중kubectl describe pod <name>
kubectl logs <name>
Succeeded정상 종료 후 재시작 없음kubectl get pods
Failed실행 실패, 종료 코드 확인 가능kubectl describe pod <name>
CrashLoopBackOff반복 실패/재시작kubectl logs <name>
TerminatingPod 삭제 중 상태kubectl delete pod <name>

6. Pod 네트워킹

  • 각 Pod는 클러스터 내에서 고유 IP를 가짐
  • Pod 내부 컨테이너는 같은 네트워크 네임스페이스를 공유 → localhost로 통신 가능
  • Pod 간 통신은 기본적으로 열려 있음 → 필요 시 NetworkPolicy로 제한
  • 안정적인 접근을 위해 Pod는 Service 오브젝트와 함께 사용

7. Pod 볼륨 (Volume)

  • Pod 내부 컨테이너끼리 파일 공유 가능
  • Pod가 죽으면 로컬 볼륨도 함께 사라짐
  • 영속성이 필요하면 PersistentVolume (PV) + PersistentVolumeClaim (PVC) 사용

8. Pod 모니터링 및 관리

  • Probe 활용

    • Liveness Probe: 살아있는지 체크 → 실패 시 재시작
    • Readiness Probe: 요청을 받을 준비가 됐는지 확인
    • Startup Probe: 앱 기동이 오래 걸릴 때 사용
  • 주요 명령어

    kubectl describe pod <name>   # 이벤트/로그/오류 확인
    kubectl logs <name>           # 로그 확인 (-c 옵션으로 컨테이너 지정)

9. Pod와 Controller

Pod는 단독으로 쓰이지 않으며, 보통 아래 리소스들이 Pod를 관리한다.

  • ReplicaSet: Pod 복제본 개수 유지

  • Deployment: 롤링 업데이트/롤백 관리

  • DaemonSet: 각 노드마다 Pod 하나씩 실행

  • StatefulSet: 고정 ID와 스토리지가 필요한 Pod 관리

10. Pod 관리 명령어 요약

kubectl run nginx --image=nginx    // Pod 바로 생성

kubectl apply -f pod.yaml	// YAML 기반 생성/업데이트

kubectl get pods	// 파드 확인

kubectl describe pod <name>	// 이벤트 로그, 에러 원인

kubectl logs <name>	 // 다중 컨테이너일 경우 -c 필요

kubectl delete pod <name>	// Pod 제거

kubectl run redis --image=redis --dry-run=client -o yaml > redis.yaml	// YAML만 생성

kubectl edit pod <name>	// 간단한 속성만 수정 가능
profile
Network/Cloud

0개의 댓글