fos-blog/study
01 / 홈02 / 카테고리03 / 시리즈
01 / 홈02 / 카테고리03 / 시리즈

카테고리

  • AI 페이지로 이동
    • RAG 페이지로 이동
    • agent 페이지로 이동
    • langgraph 페이지로 이동
    • 사람용 CLI와 AI 에이전트용 CLI는 설계가 다르다
    • agents.md
    • Claude Code 메모리: CLAUDE.md와 .claude/rules를 규칙으로 쓰는 법
    • Claude Code의 Skill 시스템 - 개발자를 위한 AI 자동화의 새로운 차원
    • Claude Code를 5주 더 쓴 결과 — 스킬·CLAUDE.md를 키워가는 방식
    • Claude Code를 11일 동안 쓴 결과 — 데이터로 본 나의 사용 패턴
    • Claude Code 멀티 에이전트 — Teams
    • AI 에이전트와 디자인의 새 컨벤션 — DESIGN.md, Google Stitch, Claude Design
    • Docling — IBM Research 의 문서 파싱 toolkit 상세 정리
    • 하네스 엔지니어링 실전 — 4인 에이전트 팀으로 코딩 파이프라인 구축하기
    • 하네스 엔지니어링 — 오래 실행되는 AI 에이전트를 위한 설계
    • 멀티모달 LLM (Multimodal Large Language Model)
    • AI 에이전트와 함께 MVP 만들기 — dooray-cli 사례
    • 온톨로지에서 코딩 에이전트 컨텍스트까지 — 클래스·관계 설계와 그래프 평가
    • OpenClaw는 context와 memory를 어떻게 관리하나 — 나만의 에이전트를 구성하는 법
    • OpenClaw vs Hermes Agent — 갈아탈까 고민하며 정리한 비교
  • ai 페이지로 이동
    • agent 페이지로 이동
    • [초안] AI 제품 백엔드 안정성 — 지연·비용·권한·관측·도구 실패·폴백/재시도/사람 에스컬레이션
    • [초안] LLM 평가 프레임워크: 골든셋, 회귀 테스트, LLM-as-a-judge, 사람 피드백 루프
  • algorithm 페이지로 이동
    • live-coding 페이지로 이동
    • 분산 계산을 위한 알고리즘
  • architecture 페이지로 이동
    • 시니어 백엔드를 위한 API 설계 실전 스터디 팩
    • API 버저닝과 하위 호환성: 모바일·외부 컨슈머까지 안전하게 진화시키기
    • 캐시 설계 전략 총정리
    • [초안] 커머스 Spring 서비스에 Clean/Hexagonal Architecture를 실용적으로 적용하기
    • [초안] 커머스 도메인 모델링: 주문·재고·노출의 세 축을 분리해서 설계하기
    • 커머스 주문 상태와 데이터 정합성 기본기
    • [초안] 쿠폰/프로모션 동시성과 정합성 기본기 — 선착순·중복 사용 방지·발급/사용/복구
    • [초안] DDD와 도메인 모델링: 시니어 백엔드 관점의 전술/전략 패턴 실전 가이드
    • [초안] Decorator & Chain of Responsibility — 행동을 체인으로 조립하는 두 가지 방식
    • 디자인 패턴
    • [초안] 분산 아키텍처 완전 정복: Java 백엔드 시니어 인터뷰 대비 실전 가이드
    • [초안] 분산 트랜잭션과 Outbox 패턴 — 왜 2PC를 피하고 어떻게 대신할 것인가
    • 분산 트랜잭션
    • [초안] e-Commerce 주문·결제 도메인 모델링: 상태머신, 멱등성, Outbox/Saga 실전 정리
    • [초안] Event Sourcing과 CQRS — 상태가 아니라 변화를 저장한다는 발상
    • [학습중] 금융 거래 취소·정정·대사·일마감 운영
    • [학습중] 금융 거래 상태와 원장 설계
    • [초안] F&B 쿠폰·프로모션·멤버십·포인트 설계
    • [초안] F&B · e-Commerce 디지털 채널 도메인 한 장 정리
    • [초안] F&B 주문/매장/픽업 상태머신 설계
    • [초안] F&B 이커머스 결제·환불·정산 운영 가이드
    • [초안] Hexagonal / Clean Architecture를 Spring 백엔드에 적용하기
    • [초안] 대규모 커머스 트래픽 처리 패턴 — 대규모 회원과 메가 프로모션을 버티는 설계
    • [초안] 레거시 JSP/jQuery 화면과 신규 API가 공존하는 백엔드 운영 전략
    • [학습중] 모듈러 모놀리스에서 MSA로 점진 전환하는 실습
    • [초안] MSA 서비스 간 통신: Redis [Cache-Aside](../database/redis/cache-aside.md) × Kafka 이벤트 하이브리드 설계
    • [초안] Observability 입문: 시니어 백엔드가 장애를 탐지하고 대응하는 방식
    • [초안] Outbox / Inbox Pattern 심화 — 분산 메시징의 정합성 문제를 DB 트랜잭션으로 풀어내기
    • [초안] 결제 도메인 멱등성과 트랜잭션 재시도 기본기
    • [초안] 시니어 백엔드를 위한 Resilience 패턴 실전 가이드 — Timeout, Retry, Circuit Breaker, Bulkhead, Backpressure
    • [초안] Spring Batch vs Event-Driven — 같은 비동기처럼 보이지만 전혀 다른 두 패러다임
    • [초안] Strategy Pattern — 분기문을 없애는 설계, 시니어 백엔드 인터뷰 핵심 패턴
    • [초안] 시니어 백엔드를 위한 시스템 설계 입문 스터디 팩
    • [초안] 템플릿 메서드 패턴 - 백엔드 처리 골격을 강제하는 가장 오래되고 가장 위험한 패턴
    • [초안] 대규모 트래픽 중 무중단 마이그레이션 — Feature Flag + Shadow Mode 실전
  • database 페이지로 이동
    • milvus 페이지로 이동
    • mysql 페이지로 이동
    • opensearch 페이지로 이동
    • qdrant 페이지로 이동
    • redis 페이지로 이동
    • vespa 페이지로 이동
    • 김영한의-실전-데이터베이스-설계 페이지로 이동
    • [초안] DB Connection Pool Saturation과 Thread Pool 격리
    • 커넥션 풀 크기는 얼마나 조정해야 할까?
    • 인덱스 - DB 성능 최적화의 핵심
    • [초안] JPA N+1과 커머스 조회 모델: 주문/메뉴/쿠폰 도메인에서 살아남기
    • [초안] MyBatis 기본기 — XML Mapper, resultMap, 동적 SQL, 운영 패턴 정리
    • [초안] MyBatis와 JPA/Hibernate 트레이드오프 — 레거시 백엔드를 다루는 시니어 관점
    • 한국어 형태소 분석기 Nori vs Lindera — OpenSearch에서 Milvus로 갈 때 어휘 검색은 유지되나
    • 벡터 DB 5종, 아키텍처는 어떻게 다른가
    • 벡터 DB 5종을 실제로 벤치마크했다 — 같은 recall에서 QPS는 얼마나 갈리나
    • 벡터 DB 어떻게 고를까 — OpenSearch · Milvus · Qdrant · Vespa · pgvector 비교
    • 벡터 DB를 실제로 도입한 사례 — 빅테크 프로덕션
    • 역정규화 (Denormalization)
    • 데이터 베이스 정규화
  • devops 페이지로 이동
    • docker 페이지로 이동
    • k8s 페이지로 이동
    • k8s-in-action 페이지로 이동
    • observability 페이지로 이동
    • [초안] 커머스/F&B 채널 장애 첫 5분과 관측성 기본기
    • [초안] 운영 데이터 정합성 장애 대응 — 결제 취소 누락과 중복 적재 런북
    • Envoy Proxy
    • [초안] F&B / e-Commerce 운영 장애 대응과 모니터링 — 백엔드 관점 정리
    • Graceful Shutdown
    • [초안] 시니어 백엔드를 위한 SLO와 Error Budget 기반 장애 대응
  • http 페이지로 이동
    • HTTP Connection Pool
    • HTTPS는 어떻게 안전한가 — TLS, 인증서, 그리고 termination
  • interview 페이지로 이동
    • [초안] AI 서비스 팀 경험 기반 시니어 백엔드 면접 질문 뱅크 — Spring Batch RAG / gRPC graceful shutdown / 캐시 정합성 / 12일 AI 웹툰 MVP
    • Observability — 면접 답변 프레임
    • [초안] 시니어 Java 백엔드 면접 마스터 플레이북 — 김병태
    • [초안] NSC 슬롯팀 경험 기반 질문 은행 — 도메인 모델링·동시성·성능·AI 협업
  • java 페이지로 이동
    • concurrency 페이지로 이동
    • jdbc 페이지로 이동
    • opentelemetry 페이지로 이동
    • spring 페이지로 이동
    • spring-batch 페이지로 이동
    • testing 페이지로 이동
    • 더_자바_코드를_조작하는_다양한_방법 페이지로 이동
    • [초안] Java 동시성 락 정리 — 커머스 메뉴/프로모션 정책 캐시 갱신 관점
    • [초안] JVM 튜닝 실전: 메모리 구조부터 Virtual Threads, GC 튜닝, 프로파일링까지
    • Java의 로깅 환경
    • MDC (Mapped Diagnostic Context)
    • Java StampedLock — 읽기 폭주에도 쓰기가 밀리지 않는 락
    • Virtual Thread와 Project Loom
  • javascript 페이지로 이동
    • typescript 페이지로 이동
    • AbortController
    • Async Iterator와 제너레이터
    • CommonJS와 ECMAScript Modules
    • 제너레이터(Generator)
    • Http Client
    • Node 백엔드 운영 패턴 — Streams 백프레셔, pipe/pipeline, 멱등성 vs 분산 락
    • Node.js
    • npm vs pnpm — 어떤 기준으로 선택했나
    • `setImmediate()`
  • kafka 페이지로 이동
    • [초안] Kafka 기본 개념 — 토픽, 파티션, 오프셋, 복제
    • Kafka를 사용하여 **데이터 정합성**은 어떻게 유지해야 할까?
    • [초안] Kafka 실전 설계: 파티션 전략, 컨슈머 그룹, 전달 보장, 재시도, 순서 보장 트레이드오프
    • [학습중] Kafka 파티션·리밸런스·컨슈머 지연 운영
    • 메시지 전송 신뢰성
    • [초안] Spring Kafka 컨슈머 오프셋 커밋과 트랜잭션 정렬: AckMode, manual ack, 멱등 처리
  • linux 페이지로 이동
    • fsync — 리눅스 파일 동기화 시스템 콜
    • tmux — Terminal Multiplexer
  • mlops 페이지로 이동
    • llm-serving 페이지로 이동
    • serving-frameworks 페이지로 이동
    • Python CUDA 버전 생태계 — nvidia-smi, nvcc, pip, conda가 다 다른 버전을 말하는 이유
    • GPU 컨테이너의 CUDA 버전 호환성 — nvidia-smi부터 이미지 다이어트까지
    • Kubernetes GPU 노드에서 /run tmpfs가 꽉 차서 Pod가 안 뜰 때
    • GPU·CUDA·MPS 기초 — 자바 백엔드 개발자가 처음 만나는 그림
    • Multi-process GPU 워크로드 — 자바 ThreadPool 사용자가 만나는 모델 차이
    • ML 서비스 성능 분석 워크플로 — 자바 백엔드 트러블슈팅과 다른 점
    • 한 GPU 를 여러 프로세스가 나눠 쓰기 — Time-Slicing 과 MPS
  • network 페이지로 이동
    • Connection reset by peer는 누가 보낸 걸까 — 리버스 프록시 홉마다 TCP 연결은 따로 논다
    • L2(스위치)와 L3(라우터)의 역할 차이
    • L4와 VIP(Virtual IP Address)
    • IP Subnet
  • python 페이지로 이동
    • Python async/await — CompletableFuture·Reactor 와 다른 점, 그리고 blocking I/O 함정
    • Python 의존성 관리 — Java Maven/Gradle 사용자가 만나는 첫 충격
    • FastAPI 기초 — Spring Boot 사용자가 빠르게 익히는 법
    • Java 개발자를 위한 Python 심화 — OOP·데코레이터·컨텍스트 매니저
    • PyTorch 기초 — 텐서, 디바이스, 그리고 모델 로딩이 무거운 이유
    • Java 개발자를 위한 Python 문법 핵심
    • ThreadLocal 에서 contextvars 로 — Python 의 요청 컨텍스트 전파
    • OCR 동작 원리 — Layout · Text · Post-process 3단계
    • Python 서버의 RSS 가 안 줄어드는 이유 — gc.collect 의 한계와 malloc_trim
  • rabbitmq 페이지로 이동
    • [초안] RabbitMQ Basics — 실전 백엔드 관점에서 정리하는 메시지 브로커 기본기
    • [초안] RabbitMQ vs Kafka — 백엔드 메시징 선택 기준과 실전 운영 관점
  • resume 페이지로 이동
    • [초안] 김병태 경력기술서
    • [초안] 김병태 포트폴리오
  • security 페이지로 이동
    • [초안] 시니어 백엔드를 위한 보안 / 인증 스터디 팩 — Spring Security, JWT, OAuth2, OWASP Top 10
    • [초안] Spring Security 6.x OAuth2 + JWT 상용 인증 설계 — Grant 선택, Resource Server, Refresh Rotation, 로그아웃
  • task 페이지로 이동
    • ai-service-team 페이지로 이동
    • nsc-slot 페이지로 이동
    • sb-dev-team 페이지로 이동
    • the-future-company 페이지로 이동
  • testing 페이지로 이동
    • [초안] 시니어 Java 백엔드를 위한 테스트 전략 완전 정리 — 피라미드부터 TestContainers, 마이크로벤치, Contract까지
  • thinking 페이지로 이동
    • 좋은 일을 넘어 중요한 일을 하는 법
FOS-BLOG · FOOTERall systems normal·v0.1 · 2026.04.27·seoul, kr
Ffos-blog/study

개발 학습 기록을 정리하는 블로그입니다. 공부하면서 기록하고, 기록하면서 다시 배웁니다.

visitors
01site
  • Home↗
  • Posts↗
  • Categories↗
  • Glossary↗
  • About↗
02policy
  • 소개/about
  • 개인정보처리방침/privacy
  • 연락처/contact
03categories
  • AI↗
  • Algorithm↗
  • DB↗
  • DevOps↗
  • Java/Spring↗
  • JS/TS↗
  • React↗
  • Next.js↗
  • System↗
04connect
  • GitHub@jon890↗
  • Source repositoryjon890/fos-study↗
  • RSS feed/rss.xml↗
  • Newsletter매주 1 회 · 한 편의 글→
© 2026 FOS Study. All posts MIT-licensed.
built with·Next.js·Tailwind v4·Geist·Pretendard·oklch
fos-blog/devops/컨테이너와 쿠버네티스가 필요한 이유 — ja…
devops

컨테이너와 쿠버네티스가 필요한 이유 — jar 를 서버에 올리던 사람의 관점에서

나는 오랫동안 Spring Boot 를 jar 로 말아서 서버에 올리는 방식으로 일했다. 배포는 "서버에 접속해서 기존 프로세스를 죽이고 새 jar 를 띄운다"였고, 그걸로 충분했다. 그러다 쿠버네티스 위에서 도는 서비스를 맡게 됐는데, ArgoCD 화면은 매일 보면서도 그 안에서 무슨 일이 벌어지는지는 몰랐다. Pod 가 왜 이름이 매번 바뀌는지, 왜 서...

2026.07.27·6 min read·13 views·SERIES · 백엔드 개발자를 위한 쿠버네티스 기본기 · 1/8

나는 오랫동안 Spring Boot 를 jar 로 말아서 서버에 올리는 방식으로 일했다. 배포는 "서버에 접속해서 기존 프로세스를 죽이고 새 jar 를 띄운다"였고, 그걸로 충분했다. 그러다 쿠버네티스 위에서 도는 서비스를 맡게 됐는데, ArgoCD 화면은 매일 보면서도 그 안에서 무슨 일이 벌어지는지는 몰랐다. Pod 가 왜 이름이 매번 바뀌는지, 왜 서버에 SSH 로 들어갈 생각을 안 하는지.

이 시리즈는 그때부터 하나씩 밟아나간 기록이다. 첫 글에서 답할 질문은 하나다 — jar 를 서버에 올리는 방식은 정확히 어디서 무너지고, 쿠버네티스는 그중 무엇을 대신해 주는가.

컨테이너가 먼저 푸는 문제 — "내 로컬에선 됐는데"

쿠버네티스 얘기를 하려면 컨테이너부터다. 컨테이너는 애플리케이션을 어디서 돌리든 똑같이 돌도록 만든 격리된 실행 환경이다.

jar 배포에서 겪던 문제를 떠올리면 필요성이 바로 보인다. 로컬은 JDK 17, 개발 서버는 11 이 깔려 있어서 안 뜬다. 서버마다 타임존이 다르다. 누군가 서버에 직접 설치한 라이브러리에 의존하고 있었는데 그 서버를 재구축하니 안 뜬다. 전부 실행 환경이 코드 밖에 있어서 생기는 문제다.

컨테이너는 실행 환경을 코드와 같이 묶어서 이 문제를 없앤다.

  • 이미지(Image) — 베이스 OS · JDK · 내 jar · 설정까지 통째로 담은 스냅샷. eclipse-temurin:21-jre 위에 app.jar 를 얹은 것이 하나의 이미지다.
  • 컨테이너(Container) — 그 이미지를 실행한 상태. 즉 프로세스다.
  • 불변성 — 한 번 빌드한 이미지는 어디서 실행하든 내용이 같다. 그래서 "개발 서버에서 검증한 그 이미지"를 운영에 그대로 올린다. 운영에서 다시 빌드하지 않는다.

VM 과 헷갈리기 쉬운데, 결정적 차이는 OS 커널을 새로 띄우느냐다. VM 은 게스트 OS 를 통째로 부팅하므로 수십 초가 걸리고 메모리도 GB 단위로 먹는다. 컨테이너는 호스트 커널을 공유하고 프로세스만 격리하므로 수 초 안에 뜨고 오버헤드가 훨씬 작다. 배포 한 번에 컨테이너 수십 개를 새로 띄우는 롤링 업데이트가 현실적인 건 이 가벼움 덕분이다.

도커만으로는 어디서 막히는가

컨테이너로 실행 환경 문제는 풀렸다. 그런데 서비스가 커지면 도커 단독으로는 감당이 안 되는 지점이 순서대로 나타난다.

막히는 지점도커 단독쿠버네티스가 대신하는 것
컨테이너가 죽음사람이 알아채고 다시 띄움죽으면 자동으로 새로 띄움
트래픽 증가사람이 서버에 들어가 추가 실행replica 수를 늘리면 알아서 배치
무중단 배포스크립트로 직접 구현롤링 업데이트가 기본 기능
서버 여러 대 분산어느 서버에 뭘 띄울지 사람이 관리스케줄러가 여유 있는 노드에 배치
컨테이너 주소 찾기IP·포트를 사람이 관리Service 이름으로 호출

표를 세로로 읽으면 공통점이 보인다. 왼쪽 열은 전부 사람이 알아채고 사람이 조치하는 일이고, 오른쪽 열은 전부 시스템이 알아채고 시스템이 조치하는 일이다. 쿠버네티스가 파는 것은 기능 목록이 아니라 이 전환이다.

그래서 쿠버네티스를 한 문장으로 정의하면 이렇게 된다 — 컨테이너를 자동으로 배치하고, 유지하고, 스스로 복구하는 오케스트레이션 시스템.

클러스터는 어떻게 생겼나

쿠버네티스는 서버 여러 대를 하나의 자원 풀로 묶는다. 그 묶음이 클러스터(Cluster) 고, 안에는 역할이 다른 두 종류의 서버가 있다.

각 조각을 백엔드 개념에 붙여 보면 이해가 빠르다.

  • kube-apiserver — 클러스터의 유일한 REST API 서버다. kubectl 도, 각 노드의 kubelet 도, 컨트롤러도 전부 여기를 통해서만 대화한다. 컴포넌트끼리 직접 연결되지 않고 API 서버 하나를 허브로 두는 구조라, 인증·권한·검증을 한 곳에서 건다.
  • etcd — 클러스터의 모든 상태가 저장되는 데이터베이스다. "Pod 를 2개 띄워라"는 선언도, 지금 몇 개가 떠 있는지도 전부 여기 있다. etcd 가 죽으면 클러스터의 기억이 사라진다.
  • kube-scheduler — 새로 만들어야 할 Pod 를 보고 어느 노드에 놓을지 정한다. CPU·메모리 여유, 노드 라벨, 배치 제약을 따진다. 놓기만 하고 실행은 하지 않는다.
  • controller-manager — "선언된 상태"와 "실제 상태"를 계속 비교해 맞추는 루프들의 집합이다. 이 루프가 쿠버네티스의 핵심 원리인데, 다음 글에서 따로 다룬다.
  • kubelet — 각 워커 노드에 상주하는 에이전트다. API 서버에서 "네 노드에 이 Pod 를 띄워라"를 받아 실제로 컨테이너를 실행하고, 상태를 다시 보고한다.

여기서 감각이 하나 바뀐다. 내가 특정 서버를 지목해서 앱을 올리는 게 아니다. 나는 "이 앱을 2개 띄워둬"라고 API 서버에 말할 뿐이고, 어느 노드에 놓을지는 스케줄러가 정한다. 그래서 Pod 가 어느 서버에 떠 있는지 평소에 신경 쓰지 않고, SSH 로 들어갈 생각도 하지 않게 된다.

배포의 의미가 바뀐다

정리하면 쿠버네티스로 넘어오면서 바뀌는 건 도구가 아니라 배포라는 행위의 정의다.

  • 기존: 서버에 접속해 절차를 실행한다. 프로세스를 죽이고, 새 jar 를 올리고, 다시 띄운다.
  • 쿠버네티스: 원하는 상태를 선언한다. "이 이미지로 2개 떠 있어야 한다"고 적어두면, 그 상태를 유지하는 건 시스템 몫이다.

이 차이 때문에 장애 대응 방식도 달라진다. Pod 가 죽었을 때 되살리는 게 아니라 폐기하고 새로 만든다. 그래서 Pod 안에 중요한 걸 쌓아두면 안 되고, 로그도 파일로 남기지 않고 표준 출력으로 내보내 외부 수집기로 보낸다. 서버를 "고쳐 쓰는 가축이 아니라 갈아 끼우는 부품"으로 보는 전제가 깔려 있다.

쿠버네티스가 해결해 주지 않는 것

도입하면 다 되는 것처럼 보이지만, 실제로 겪어보니 그렇지 않았다. 미리 알아두면 좋은 한계가 있다.

  • 애플리케이션이 준비돼 있어야 무중단이 된다. 롤링 업데이트 기능이 있다고 무중단이 되는 게 아니다. 종료 신호를 받았을 때 처리 중인 요청을 마저 끝내는 코드가 없으면, 배포할 때마다 사용자 쪽에 에러가 나간다. 실제로 이 준비가 안 된 서비스에서 배포·스케일인 때마다 503 이 튀는 걸 겪었다.
  • 상태를 가진 것은 여전히 어렵다. DB 처럼 데이터를 들고 있는 컴포넌트는 "죽으면 새로 만든다"는 전제와 충돌한다. 방법은 있지만(StatefulSet, PersistentVolume) 난이도가 다르고, 관리형 DB 를 쓰는 선택이 흔하다.
  • 네트워크를 모르면 결국 막힌다. 외부 요청이 Pod 까지 닿는 경로에는 로드밸런서·Ingress·Service 가 겹겹이 끼어 있다. 이 계층을 모르면 "왜 접속이 안 되는지"를 추적할 수 없다. 이 시리즈와 별개로 실전 연재를 따로 둔 이유다.
  • 추상화가 두꺼워 디버깅이 어렵다. 선언만 하고 실행은 시스템이 하므로, 안 될 때 "어디서 멈췄는지"가 안 보인다. 이걸 읽는 법이 다음 글의 주제다.

이 시리즈에서 다룰 것

앞으로의 순서는 이렇다. 아래로 갈수록 구체적이다.

  1. 컨테이너와 쿠버네티스가 필요한 이유 — 지금 이 글
  2. 선언형 API 와 reconcile loop — 쿠버네티스를 관통하는 단 하나의 원리
  3. 핵심 객체 4종 — Pod · Service · Ingress · Namespace 의 관계
  4. Deployment · ReplicaSet · Pod — 배포가 실제로 굴러가는 3층 구조
  5. admission — etcd 에 저장되기 직전 — 요청이 거부되는 지점
  6. Helm — YAML 을 템플릿으로 관리하기
  7. Argo CD — git 을 정답으로 삼는 배포
  8. Helm 과 ArgoCD 로 GitOps 하기 — 둘을 합친 실전 흐름

다음 글에서는 지금까지 계속 미뤄 둔 것 — "원하는 상태를 선언하면 시스템이 맞춘다"가 내부적으로 어떤 구조인지 — 를 본다. 이 원리 하나를 잡아두면 뒤의 Deployment · admission · ArgoCD 가 전부 같은 패턴의 변주로 읽힌다.

참고 링크

  • Kubernetes Components — 공식 문서
  • What is Kubernetes — 공식 문서
  • 컨테이너 격리 원리 — Linux 프로세스 격리
on this page
  • 01컨테이너가 먼저 푸는 문제 — "내 로컬에선 됐는데"
  • 02도커만으로는 어디서 막히는가
  • 03클러스터는 어떻게 생겼나
  • 04배포의 의미가 바뀐다
  • 05쿠버네티스가 해결해 주지 않는 것
  • 06이 시리즈에서 다룰 것
  • 07참고 링크
tags
#입문📚 백엔드 개발자를 위한 쿠버네티스 기본기
NEXT →선언형 API 와 reconcile loop — 쿠버네티스를 관통하는 단 하나의 원리

이런 글도

  • 선언형 API 와 reconcile loop — 쿠버네티스를 관통하는 단 하나의 원리
    > 컨테이너와 쿠버네티스가 필요한 이유에서 "원하는 상태를 선언하면 시스템이 맞춘다"까지 말하고 넘어갔다. 이 글은 그 문장의 내부를 연다. 쿠버네티스를 배우면서 가장 오래 헤맨 건 객체 이름이 아니었다. kubectl apply 를 하면 리소스가 "생긴다"는데, 누가 언제 그걸 만드는지가 안 잡혔다. 명령을 보냈으니 그 명령이 실행되는 거라고 막연히 생각...
    🚀 devops
    devops
    2026.07.27
  • IP whitelist가 조용히 뚫려 있었다 — 클라이언트 IP는 어디서 사라지는가
    > 외부 트래픽은 어떻게 Pod까지 닿는가와 ingress-nginx 운영에서 부딪힌 디테일들을 먼저 읽으면 좋다. 이 글은 그 다음 단계로, 그때 걸어둔 whitelist가 실제로는 아무도 막지 못하고 있었다는 이야기다. 사내 전용으로 열어둔 검증 환경에 whitelist-source-range를 걸어놨다. kubectl get ingress로 보면 허용...
    🚀 devops
    devops
    2026.07.27
  • 쿠버네티스 Admission 단계 — 리소스가 etcd에 저장되기 직전에 무슨 일이 일어나는가
    kubectl apply를 하면 리소스가 클러스터에 "생긴다". 그런데 그 사이에 뭐가 있는지는 오래 몰랐다. 공인 LoadBalancer를 붙이면서 ingress controller를 내부용·외부용으로 나눴는데, "새 Ingress를 만들면 admission webhook이 검증한다"는 문장이 계속 나왔다. admission이 정확히 어느 단계고, 왜 하...
    🚀 devops
    devops
    2026.07.16
  • API Gateway를 걷어낸 자리 채우기 — path rewrite, 요청 크기 병목 4개, 그리고 HTTPS
    > 관리형 클러스터는 누구의 권한으로 클라우드를 만지는가의 후속 편이다. 그 글에서 클러스터 신원 문제를 해결하고 나서야, 원래 하려던 일 — API Gateway를 걷어내고 공인 LoadBalancer를 그 자리에 앉히는 작업 — 을 이어갈 수 있었다. 이 글은 LB가 뜬 다음부터의 이야기다. API Gateway를 걷어내기로 한 이유는 단순했다. 5MB...
    🚀 devops
    devops
    2026.07.10

댓글 (0)