1. 쿠버네티스에서 가장 중요한 전제 2개
상태를 저장하고, 그 상태를 맞추는 구조이다.
- 사용자가 YAML로 “Pod 3개 필요” 같은 원하는 상태를 API로 제출
- 쿠버네티스는 그걸 저장해두고, 실제 상태가 달라지면 계속 다시 맞춤
클러스터에서 상태 저장은 etcd가 한다.
- 리소스(Pod/Deployment 등)는 최종적으로 etcd에 저장
- 다른 컴포넌트들은 etcd를 직접 쓰지 않고 API Server를 통해 읽고/쓰고 Watch 함
2. 컴포넌트 5개만 정확히 역할 구분
| 컴포넌트 | 하는 일 | 설명 |
| kube-apiserver | 모든 요청의 단일 입구 + 저장(etcd) | “모든 변경은 API Server를 통해서만” |
| etcd | 모든 리소스 상태 저장소 | “클러스터의 데이터베이스” |
| controller-manager | “원하는 상태”를 만족시키도록 리소스를 생성/수정 | Deployment→ReplicaSet→Pod 만들게 함 |
| scheduler | Pod가 어느 노드에서 돌지 결정 | spec.nodeName을 채움 |
| kubelet | 노드에서 실제로 컨테이너 실행/상태 보고 | nodeName이 자기 노드인 Pod만 실행 |
3. Pod 생성흐름
kubectl apply -f pod.yaml
1) API Server가 Pod 오브젝트를 저장
- 결과: etcd에 Pod 리소스가 생김
- 이 시점에 Pod는 보통 아직 노드가 정해지지 않아서 spec.nodeName이 비어있음
kubectl get pod <pod> -o wide
# NODE 컬럼이 비어있거나, Pending일 수 있음
2) Scheduler가 노드를 선택하고, spec.nodeName을 채움
- 결과: Pod 오브젝트가 업데이트됨 (nodeName 설정)
kubectl get pod <pod> -o wide
# NODE 컬럼에 노드가 찍힘
3) 해당 노드의 kubelet이 Pod를 실행
- 결과: 컨테이너 런타임(containerd 등)이 컨테이너를 띄움
- kubelet이 Pod 상태를 API Server에 계속 보고 → 상태가 Running 등으로 변함
kubectl describe pod <pod>
# Events에 pulling/created/started 같은 로그가 순서대로 뜸
- API Server/etcd: “Pod 데이터(스펙/상태)를 저장”
- Scheduler: “nodeName 결정”
- kubelet: “실제 실행 + 상태 보고”
4. Deployment 생성 흐름
Deployment → ReplicaSet → Pod
- Deployment
- “업데이트/버전 관리(rollout history), 롤백, 배포 전략” 담당
- ReplicaSet
- “Pod 개수를 지정한 수로 유지” 담당
- Pod
- 실제 컨테이너가 실행되는 단위
kubectl apply -f deployment.yaml
- API Server가 Deployment 리소스를 etcd에 저장
- Deployment Controller가 Deployment를 감지(Watch)
- Deployment Controller가 ReplicaSet 생성
- ReplicaSet Controller가 ReplicaSet을 감지(Watch)
- ReplicaSet Controller가 Pod N개 생성
- Scheduler가 각 Pod에 spec.nodeName을 채움(노드 결정)
- 각 노드의 kubelet이 Pod를 실제로 실행
5. 원하는 상태, 현재 상태를 어디서 볼까?
- 원하는 상태(사용자가 준 스펙): spec
- 현재 상태(클러스터가 보고하는 상태): status
kubectl get pod <pod> -o yaml
# spec: 내가 원한 것
# status: 실제 결과(phase, conditions 등)
kubectl get deploy <name> -o yaml
# spec.replicas: 원한 개수
# status.availableReplicas: 실제로 사용 가능한 개수
6. 막힌 지점 찾는 법
Pod가 안 뜰 때는 어느 단계에서 멈췄는지만 찾으면 됨
1) 스케줄링이 안 됨: Pending + NODE 비어있음
kubectl get pod <pod> -o wide kubectl describe pod <pod> | sed -n '/Events/,$p'
Events에 보통:
- FailedScheduling (리소스 부족, taint, affinity 조건 등)
2) 노드까지 갔는데 실행 준비에서 멈춤: ContainerCreating
Events에 보통:
- 이미지 pull 실패, 볼륨 mount 실패, CNI 문제 등
3) 실행은 됐는데 계속 죽음: CrashLoopBackOff
kubectl logs <pod> -c <container> kubectl describe pod <pod>
- 앱 설정/명령/프로브(liveness/readiness) 문제 비중 큼
'Infra' 카테고리의 다른 글
| KEDA 필요성, HPA 와의 차이점 (0) | 2026.01.18 |
|---|---|
| [Docker] Docker 사용하지 않는 도커 이미지 일괄 삭제 (0) | 2023.11.23 |
| [Infra] Prometheus & Grafana를 이용해 서버 모니터링 구축하기 (3) | 2023.11.06 |