본문으로 바로가기
2. 클러스터는 명령을 어떻게 Pod로 바꿀까
LinkedInGitHub
WORKSPACE

EXPLORER

157 POSTS
BLOG
면접질문
해야하는 거
AI 시대, 개발자는 사라지는가?
Python Counter, 빈도수를 쉽게 세는 방법
정렬
1. 투 포인터
DFS와 BFS
알고리즘 논리
코딩 테스트 핵심 알고리즘 정리파이썬 딕셔너리와 코딩 테스트 활용
예시로 살펴보는 AXAX 프로젝트, 문제 정의부터 확산까지AX 시대의 가치 정의와 현장 리딩
MSA
1. Singleton PatternSOLID
Kafka의 핵심 설계 원리Kafka 메시징 시스템의 구성과 동작 방식Kafka 기본 개념과 EC2 Docker 구성
쿠버네티스 입문
Modular Monolith1. MonolithMSA, 서비스 분리와 운영의 원리
Socket이란 무엇인가
네크워크 참조 모델
전체 데이터 구조REST API의 개념과 설계 원칙2. Field/ Parameter / Argument/ this
Actuator 란?EntityManagerJPA 연관관계 매핑JPA 트랜잭션(Transaction)입력값 검증Java의 AOP(Aspect Oriented Programming)Async : AsynchronousBeanJPA(Java Persistence API)Proxy 패턴Spring MVCdocker container1. Spirng 필요컴포넌트 스캔
Spring 컨테이너
application.yamlLombok
이번 강의는 무엇을 노리고 있을까?Spring AI를 배우기 전에 정리할 것23
1. 기술 스택
개발 문서를 읽기 위한 핵심 기술 용어
Docker를 이해하기 위한 운영체제 기초
sigterm
6. 설정과 저장소, 앱을 운영할 수 있는 상태로 만들기5. Service와 Ingress, 요청은 어디로 흐를까4. 직접 실험하는 Kubernetes, Pod 복구부터 롤백까지3. kubectl과 Pod, 상태에서 원인을 찾는 법2. 클러스터는 명령을 어떻게 Pod로 바꿀까1. 쿠버네티스, 원하는 상태와 컨테이너 이미지Calico쿠버네티스 입문, 원하는 상태를 유지하는 시스템
Psql JSONB, 행 잠금, 멱등성Psql 함수,프로시져,트리거
머신러닝 입문딥러닝 학습 기본 개념데이터 시각화기초 통계와 ML 파이프라인 연결분석 자동화와 파이프라인 설계
CNN 아키텍처 발전 과정이미지 세그멘테이션 모델과 핵심 개념객체 탐지 모델과 핵심 개념
딥러닝 데이터셋 엔지니어링
딥러닝 학습 문제 진단과 디버깅
도메인 적응 방법현대 LLM 워크플로의 패턴
Transformer에서 LoRA 적용 대상 정하기LoRA (Low-Rank Adaptation)
LLM 양자화와 QLoRA
분산 학습과 MLOps딥러닝 모델 경량화와 추론 최적화딥러닝 기본 학습 테크닉딥러닝 중급 학습 테크닉
Mixture of Experts(MoE) 핵심 개념멀티모달 파운데이션 모델 핵심 개념State Space Model과 MambaTransformer와 Vision Transformer
Latent Space
1Chunking?
DevOps 기초 1편
실습에서는?Agile 개요, 왜 필요한가?
CI/CD 기초 4편: 배포 전략과 운영CI/CD 기초 3편: Jenkins와 Argo CD를 이용한 GitOps 배포CI/CD 기초 2편: Docker 이미지와 배포 파이프라인CI/CD 기초 1편: 개념과 GitHub Actions
OCI: 컨테이너 이미지와 런타임의 공통 표준Docker 기초 13편: Compose Healthcheck와 실전 구성Docker 기초 12편: Compose 네트워크와 VolumeDocker 기초 11편: Compose 명령어와 환경 변수Docker 기초 10편: Compose 기본 구조와 이미지 빌드Docker 기초 9편: Docker 및 Kubernetes 네트워크Docker 기초 8편: 컨테이너 런타임과 격리Docker 기초 7편: 이미지 Layer와 tar 내부 구조Docker 기초 6편: 이미지 Layer와 빌드 최적화Docker 기초 5편: 컨테이너 기본 명령어와 VolumeDocker 기초 4편: 가상화와 컨테이너 이미지 생명주기Docker 기초 3편: CI/CD 연결과 배포 원칙Docker 기초 2편: Layer, Registry, Volume과 NetworkDocker 기초 1편: Dockerfile, Image와 Container
NginxNginx 로드 밸런싱과 HTTPSNginx 리버스 프록시와 Spring Boot 연결Nginx 기초와 동작 구조
05. Pinia 상태 관리: store 설계와 사용법04. Vue 컴포넌트 설계: props, emit, slot과 생명주기03. Vue Composition API 정리02. Vue 기초 문법 점검: JavaScript, 템플릿01. Vue.js 입문: 핵심 구조와 렌더링
Java 심화 Part 3: 함수형 프로그래밍과 LambdaJava 심화 Part 2: AnnotationJava 심화 Part 1: Reflection
Java 기초 Part 5: Stream APIJava 기초 Part 4: 제네릭Java 기초 Part 3: 제어문Java 기초 Part 2: 주석과 JavadocJava 기초 Part 1: 백엔드 배경과 Java 실행 구조
Java 디버깅 Part 1: 자주 헷갈리는 핵심 개념Java 디버깅 Part 2: VS Code 자동 컴파일과 프로젝트 구조
Java 실행과 JVM Part 3: ClassLoader와 JVM 메모리Java 실행과 JVM Part 2: 메모리와 데이터 흐름Java 실행과 JVM Part 1: Java와 Python 컴파일 비교
Java 객체지향 Part 5: static 메서드와 중첩 클래스Java 객체지향 Part 4: 상속과 인터페이스Java 객체지향 Part 3: 좋은 설계와 OOP 4대 특성Java 객체지향 Part 2: OOP 핵심 문법Java 객체지향 Part 1: 클래스, 객체, 필드와 생성자
Spring 기초 Part 11: Actuator와 애플리케이션 모니터링Spring 기초 Part 10: 비동기 처리와 @AsyncSpring 기초 Part 9: JPA 트랜잭션과 동시성 제어Spring 기초 Part 8: AOP와 공통 관심사 분리Spring 기초 Part 7: Proxy 패턴과 Spring ProxySpring 기초 Part 6: JPA 연관관계 매핑Spring 기초 Part 5: EntityManager와 영속성 컨텍스트Spring 기초 Part 4: JPA, Entity와 RepositorySpring 기초 Part 3: REST API 요청값과 입력값 검증Spring 기초 Part 2: Spring MVC 요청 처리 흐름Spring 기초 Part 1: IoC, Bean, DI와 주요 Annotation
DNS = Domain Name System
Spring Boot, WebSocket, Vue, Docker 로 Raspberry Pi 실시간 모니터링 프로젝트 만들기 - 1편1. Spring Boot 구현
1. GitHub Project 만들기
Python 코드 품질: 디버깅부터 테스트와 자동화까지Python 01. 실행 구조와 실무 기초
sLLM 핵심 기술과 전체 구조제한된 자원에서 sLLM 구축하기
시대 단상에 대한 주저리주저리
WORKSPACE

SEARCH

제목, 카테고리와 태그로 검색하세요.

VERSION CONTROL

SOURCE CONTROL

masterGitHub Pages
저장소 열기
BUILD STATUS

RUN AND DEBUG

게시물은 GitHub Actions에서 검증하고 정적 페이지로 빌드합니다.

Actions 열기
WORKSPACE

MANAGE

홈 열기전체 게시물태그 보기블로그 소개
2. 클러스터는 명령을 어떻게 Pod로 바꿀까●
workspace>posts>ci-cd-docker>kubernetes>part-2.md
CI-CD-Docker / kubernetes2026.09.071 min read5 tags

2. 클러스터는 명령을 어떻게 Pod로 바꿀까

API Server에서 ReplicaSet, Scheduler, kubelet과 containerd까지, Pod가 만들어지는 흐름으로 구성 요소의 역할을 이해한다.

QUICK SUMMARY

핵심 요약

API Server는 요청과 상태 변경의 관문이고, 컨트롤러는 객체의 목표를 맞추며, Scheduler는 노드를 고른다. kubelet은 자기 노드에 배정된 Pod를 런타임으로 실행하고 상태를 보고한다. 이 역할의 경계가 장애를 좁히는 기준이 된다.

KEY CONCEPTS

핵심 개념

  • Control Plane: API와 컨트롤러, 스케줄링을 담당하는 관리 영역
  • ReplicaSet Controller: 관리하는 Pod의 개수를 맞춘다
  • Scheduler: 미배정 Pod가 실행될 Node를 선택한다
  • CRI: kubelet과 컨테이너 런타임 사이의 인터페이스

컨트롤 플레인은 조정하고, 워커 노드는 실행한다

쿠버네티스는 하나의 프로그램이 모든 일을 처리하는 구조가 아니다. 서로 다른 컴포넌트가 API에 기록된 객체를 관찰하며 자기 역할을 수행한다. 이름을 외우기 전에, 누가 무엇을 바꾸는지 구분해 보자.

Cluster
├── Control Plane
│   ├── API Server: 요청과 상태 변경의 관문
│   ├── etcd: API 객체 저장
│   ├── Controller Manager: 여러 조정 루프 실행
│   └── Scheduler: Pod의 실행 Node 선택
└── Worker Node
    ├── kubelet: 배정된 Pod를 실행 상태로 맞춤
    ├── containerd 등 런타임: 이미지와 컨테이너 처리
    └── Pod: 함께 배치되는 컨테이너 묶음

아래 화살표는 결과가 이어지는 순서를 뜻한다. Controller가 Scheduler 함수를 직접 호출한다는 뜻은 아니다. 주요 컴포넌트는 API Server를 통해 객체 변경을 읽고 쓴다. 앱의 사용자 트래픽까지 API Server를 거쳐 흐르는 것은 아니다.

1. API Server는 요청을 받지만 컨테이너를 실행하지 않는다

배포 요청이 받아들여졌다는 것은 선언이 저장됐다는 뜻이지, 앱이 준비됐다는 뜻은 아니다. 실제 실행까지는 뒤의 단계가 남아 있다.

요청에는 인증, 인가, API 필드 검증과 admission 정책 같은 검사가 적용된다. 인증은 “누구인가”, 인가는 “이 작업을 해도 되는가”에 대응한다. 권한이 있어도 별도 정책이나 자원 쿼터 때문에 생성이 거절될 수 있다.

관찰한 결과먼저 구분할 문제
Unauthorized자격증명과 인증 과정
Forbidden권한 또는 오류 메시지가 가리키는 정책
필드 타입 검증 오류매니페스트의 필드와 값
요청 성공, Pod는 미준비저장 이후의 생성, 배치, 실행 과정

etcd는 API 객체를 보관한다. 일반적으로 컨트롤러와 kubelet이 etcd를 직접 수정하는 것이 아니라 API Server를 통한다. 따라서 etcd와 API Server의 문제는 상태 조회와 새 변경에 큰 영향을 준다. 이미 실행 중인 컨테이너가 모두 즉시 종료된다고 단정할 수는 없다.

2. Deployment, ReplicaSet, Pod는 서로 다른 객체다

Deployment는 Pod template과 배포를 관리하고, ReplicaSet은 그 template으로 유지할 Pod 개수를 관리한다. Pod는 그 결과로 생기는 실행 단위다.

Deployment demo-api: replicas=3, image=v1
    ↓ Deployment Controller
ReplicaSet v1: desired=3
    ↓ ReplicaSet Controller
Pod A, Pod B, Pod C

Pod B만 지워졌다면 ReplicaSet이 가진 목표 3은 그대로다. 그래서 ReplicaSet Controller가 새 Pod를 만든다. 반대로 Deployment의 목표를 5로 바꾸면 Deployment Controller가 ReplicaSet의 목표를 변경하고, 이후 ReplicaSet Controller가 부족한 Pod를 만든다.

이미지를 바꾸는 경우에는 새 Pod template에 대응하는 ReplicaSet을 키우고 이전 것을 줄인다. 이 계층이 있어야 개수 조정과 버전 교체를 분리할 수 있다. 직접 만든 단독 Pod에는 동일한 복제본 유지 책임자가 없다는 점도 차이다.

3. Scheduler는 실행할 자리를 고른다

Pod 객체가 존재해도 Node가 정해지지 않았다면 컨테이너 실행은 시작되지 않는다. Scheduler는 미배정 Pod가 들어갈 수 있는 노드를 먼저 찾고, 후보를 평가해 배정한다.

식당에 세 팀의 손님이 왔다고 해보자. 자리를 고르기 전에 각 테이블에 필요한 인원이 들어가는지 확인해야 한다. 쿠버네티스에서도 Pod의 자원 요청, 노드 조건, taint와 toleration, 배치 제약 등을 확인한다.

Pod 생성
  → 들어갈 수 없는 Node 제외
  → 남은 후보 평가
  → Node 배정 결과를 API에 기록

모든 후보가 탈락하면 Pod는 배정을 기다린다. 다만 Pending이라는 phase에는 이미지 준비 같은 다른 초기 과정도 포함될 수 있으므로, 이름만 보고 자원 부족으로 확정하지 않는다. describe pod의 Node와 Events를 함께 봐야 한다.

4편 모형은 배정 시점을 보여주기 위해 Pod가 적은 Worker를 고른다. 실제 Scheduler의 자원 필터와 점수 계산 전체를 구현한 것은 아니다.

4. kubelet은 런타임을 통해 컨테이너를 실행한다

kubelet은 자기 노드에 배정된 Pod를 보고, 런타임에 필요한 컨테이너 실행을 요청한다. containerd 같은 런타임이 이미지를 준비하고 컨테이너를 실행하며, kubelet은 상태와 프로브 결과를 보고한다.

Scheduler가 Worker 2에 배정
  → Worker 2의 kubelet이 Pod spec 확인
  → CRI로 containerd에 준비와 실행 요청
  → 컨테이너 Running
  → kubelet의 readiness 검사
  → Ready 조건 반영

CRI는 이 둘이 대화하는 인터페이스다. Docker로 이미지를 만드는 일과 Kubernetes 노드가 런타임으로 실행하는 일은 이 지점에서 연결된다. 이미지 형식의 호환성과 런타임 연결 방식은 서로 다른 문제다.

네트워크를 붙이는 CNI, 볼륨 작업에 참여하는 CSI 드라이버도 실행 과정에 영향을 준다. 그래서 ContainerCreating에서 멈추면 이미지뿐 아니라 볼륨과 네트워크 준비 Events도 살펴봐야 한다.

5. 이름 대신 Label과 Selector가 연결한다

관리 대상과 트래픽 대상을 찾을 때는 Pod의 개별 이름보다 Label과 Selector의 관계가 중요하다. 새 Pod의 이름이 달라져도 연결이 이어질 수 있는 이유다.

# Pod template의 이름표
labels:
  app: demo-api

# Service가 찾는 조건
selector:
  app: demo-api

Deployment의 selector.matchLabels와 Pod template의 Label도 맞아야 한다. 개별 Pod 이름은 진단과 삭제에 사용할 수 있지만, 계속 교체되는 Pod 집합을 연결할 때는 이 분류 조건을 사용한다.

Namespace는 리소스의 이름과 권한, 쿼터를 나누는 논리적 범위다. Namespace가 다르다는 사실만으로 Pod 사이 통신이 차단되지는 않는다. Node와 PV처럼 Namespace에 속하지 않는 객체도 있다.

6. 장애가 난 컴포넌트와 영향을 나눠 본다

관리 기능이 멈춘 것과 현재 사용자 요청이 끊긴 것은 구분해서 확인해야 한다. 새 배포는 실패하는데 기존 앱은 응답하는 상황도 가능하다.

멈춘 부분우선 확인할 영향
API Server 또는 etcd상태 조회와 변경 요청이 가능한가
ControllerPod 개수 복구와 롤아웃이 진행되는가
Scheduler새 Pod가 Node에 배정되는가
특정 Node의 kubelet그 Node의 Pod 관리와 상태 보고가 되는가
Service 규칙을 관리하는 구성 요소바뀐 연결 대상이 노드에 반영되는가
CoreDNS서비스 이름을 주소로 해석할 수 있는가

기존 네트워크 규칙이나 연결이 남아 있으면 일부 트래픽은 계속 흐를 수 있다. 표는 원인을 확정하는 답안이 아니라, 증상에서 다음 확인 지점을 정하는 지도다.

자료와 다음 파트

다음에는 이 내부 흐름이 kubectl 출력에 어떻게 보이는지 읽어 본다. 3편, kubectl과 Pod 상태으로 이어진다. 전체 목차에서도 이동할 수 있다.

배포 계층과 컨트롤러의 동작은 Kubernetes Deployment 문서에서 더 확인할 수 있다.

TAGS#Kubernetes#ControlPlane#Scheduler#kubelet#containerd
PREVIOUS1. 쿠버네티스, 원하는 상태와 컨테이너 이미지NEXT3. kubectl과 Pod, 상태에서 원인을 찾는 법
DISCUSSION

COMMENTS

GitHub 계정으로 로그인하여 댓글을 남길 수 있습니다. 댓글은 GitHub Discussions에 공개 저장되며, 작성 내용과 GitHub 프로필 정보가 다른 방문자에게 보일 수 있습니다.

GitHub 로그인 후 댓글 쓰기Discussion 열기
DOCUMENT STRUCTURE

이 문서에는 목차가 없습니다.

DOCUMENT INFO
TYPE
Markdown
DATE
2026.09.07
READ
1 min read
WORDS
0
CATEGORY
CI-CD-Docker / kubernetes
RELATED DOCUMENTS
6. 설정과 저장소, 앱을 운영할 수 있는 상태로 만들기5. Service와 Ingress, 요청은 어디로 흐를까4. 직접 실험하는 Kubernetes, Pod 복구부터 롤백까지3. kubectl과 Pod, 상태에서 원인을 찾는 법1. 쿠버네티스, 원하는 상태와 컨테이너 이미지쿠버네티스 입문, 원하는 상태를 유지하는 시스템
main CI-CD-Docker / kubernetes
1 min readUTF-8Markdown
본문 글씨 크기
RECENTLY OPENED1
2. 클러스터는 명령을 어떻게 Pod로 바꿀까recently opened