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

카테고리

  • AI 페이지로 이동
    • RAG 페이지로 이동
    • langgraph 페이지로 이동
    • agents.md
    • BMAD Method — AI 에이전트로 애자일 개발하는 방법론
    • 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 사례
    • 스킬 문서를 신경망처럼 학습시킨다 — Microsoft SkillOpt 분석
  • ai 페이지로 이동
    • agent 페이지로 이동
    • [초안] AI 제품 백엔드 안정성 — 지연·비용·권한·관측·도구 실패·폴백/재시도/사람 에스컬레이션
    • [초안] LLM 평가 프레임워크: 골든셋, 회귀 테스트, LLM-as-a-judge, 사람 피드백 루프
  • algorithm 페이지로 이동
    • live-coding 페이지로 이동
    • 분산 계산을 위한 알고리즘
  • apartment 페이지로 이동
    • 구리 럭키아파트 24평 인테리어 레퍼런스 모음
  • architecture 페이지로 이동
    • [초안] 시니어 백엔드를 위한 API 설계 실전 스터디 팩 — REST · 멱등성 · 페이지네이션 · 버전 전략
    • [초안] API Versioning과 Backward Compatibility: 시니어 백엔드 관점 정리
    • 캐시 설계 전략 총정리
    • [초안] CJ푸드빌 디지털 채널 면접: 슬롯 도메인 경험을 커머스 도메인 설계 능력으로 번역하기
    • [초안] 커머스 Spring 서비스에 Clean/Hexagonal Architecture를 실용적으로 적용하기
    • [초안] 커머스 도메인 모델링: 주문·재고·노출의 세 축을 분리해서 설계하기
    • 커머스 주문 상태와 데이터 정합성 기본기 — CJ푸드빌 면접 대비
    • [초안] 쿠폰/프로모션 동시성과 정합성 기본기 — 선착순·중복 사용 방지·발급/사용/복구
    • [초안] DDD와 도메인 모델링: 시니어 백엔드 관점의 전술/전략 패턴 실전 가이드
    • [초안] Decorator & Chain of Responsibility — 행동을 체인으로 조립하는 두 가지 방식
    • 디자인 패턴
    • [초안] 분산 아키텍처 완전 정복: Java 백엔드 시니어 인터뷰 대비 실전 가이드
    • [초안] 분산 트랜잭션과 Outbox 패턴 — 왜 2PC를 피하고 어떻게 대신할 것인가
    • 분산 트랜잭션
    • [초안] e-Commerce 주문·결제 도메인 모델링: 상태머신, 멱등성, Outbox/Saga 실전 정리
    • [초안] F&B 쿠폰·프로모션·멤버십·포인트 설계
    • [초안] F&B · e-Commerce 디지털 채널 도메인 한 장 정리 — CJ푸드빌 디지털 채널 백엔드 면접 대비
    • [초안] F&B 주문/매장/픽업 상태머신 설계 — CJ푸드빌 디지털 채널 백엔드 관점
    • [초안] F&B 이커머스 결제·환불·정산 운영 가이드
    • [초안] Hexagonal / Clean Architecture를 Spring 백엔드에 적용하기
    • [초안] 대규모 커머스 트래픽 처리 패턴 — 1,600만 고객과 올영세일을 버티는 설계
    • [초안] 레거시 JSP/jQuery 화면과 신규 API가 공존하는 백엔드 운영 전략
    • [초안] MSA 서비스 간 통신: Redis [Cache-Aside](../database/redis/cache-aside.md) × Kafka 이벤트 하이브리드 설계
    • [초안] Observability 입문: 시니어 백엔드가 장애를 탐지하고 대응하는 방식
    • [초안] Outbox / Inbox Pattern 심화 — 분산 메시징의 정합성 문제를 DB 트랜잭션으로 풀어내기
    • [초안] 결제 도메인 멱등성과 트랜잭션 재시도 기본기
    • [초안] 시니어 백엔드를 위한 Resilience 패턴 실전 가이드 — Timeout, Retry, Circuit Breaker, Bulkhead, Backpressure
    • [초안] REST API 버저닝과 모바일 앱 하위 호환성 — CJ푸드빌 디지털 채널 백엔드 관점
    • [초안] Spring Batch vs Event-Driven — 같은 비동기처럼 보이지만 전혀 다른 두 패러다임
    • [초안] Strategy Pattern — 분기문을 없애는 설계, 시니어 백엔드 인터뷰 핵심 패턴
    • [초안] 시니어 백엔드를 위한 시스템 설계 입문 스터디 팩
    • [초안] 템플릿 메서드 패턴 - 백엔드 처리 골격을 강제하는 가장 오래되고 가장 위험한 패턴
    • [초안] 대규모 트래픽 중 무중단 마이그레이션 — Feature Flag + Shadow Mode 실전
  • database 페이지로 이동
    • mysql 페이지로 이동
    • opensearch 페이지로 이동
    • redis 페이지로 이동
    • 김영한의-실전-데이터베이스-설계 페이지로 이동
    • [초안] DB Connection Pool Saturation과 Thread Pool 격리
    • 커넥션 풀 크기는 얼마나 조정해야 할까?
    • 인덱스 - DB 성능 최적화의 핵심
    • [초안] JPA N+1과 커머스 조회 모델: 주문/메뉴/쿠폰 도메인에서 살아남기
    • [초안] MyBatis 기본기 — XML Mapper, resultMap, 동적 SQL, 운영 패턴 정리
    • [초안] MyBatis와 JPA/Hibernate 트레이드오프 — 레거시 백엔드를 다루는 시니어 관점
    • 역정규화 (Denormalization)
    • 데이터 베이스 정규화
  • devops 페이지로 이동
    • docker 페이지로 이동
    • k8s 페이지로 이동
    • k8s-in-action 페이지로 이동
    • observability 페이지로 이동
    • [초안] 커머스/F&B 채널 장애 첫 5분과 관측성 기본기
    • Envoy Proxy
    • [초안] F&B / e-Commerce 운영 장애 대응과 모니터링 — 백엔드 관점 정리
    • Graceful Shutdown
    • [초안] 시니어 백엔드를 위한 SLO와 Error Budget 기반 장애 대응
  • finance 페이지로 이동
    • industry-cycle 페이지로 이동
    • investing 페이지로 이동
  • http 페이지로 이동
    • HTTP Connection Pool
    • HTTPS는 어떻게 안전한가 — TLS, 인증서, 그리고 termination
  • interview 페이지로 이동
    • [초안] AI 서비스 팀 경험 기반 시니어 백엔드 면접 질문 뱅크 — Spring Batch RAG / gRPC graceful shutdown / 전략 패턴 / 12일 AI 웹툰 MVP
    • [초안] 커머스/F&B 면접 답변집 — 슬롯 도메인 경험을 주문·결제·쿠폰·매장 설계로 매핑하기
    • [초안] F&B / e-Commerce 운영 모니터링과 장애 대응 인터뷰 정리
    • Observability — 면접 답변 프레임
    • [초안] 시니어 Java 백엔드 면접 마스터 플레이북 — 김병태
    • [초안] NSC 슬롯팀 경험 기반 질문 은행 — 도메인 모델링·동시성·성능·AI 협업
  • java 페이지로 이동
    • concurrency 페이지로 이동
    • jdbc 페이지로 이동
    • opentelemetry 페이지로 이동
    • spring 페이지로 이동
    • spring-batch 페이지로 이동
    • 더_자바_코드를_조작하는_다양한_방법 페이지로 이동
    • [초안] 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 실전 설계: 파티션 전략, 컨슈머 그룹, 전달 보장, 재시도, 순서 보장 트레이드오프
    • 메시지 전송 신뢰성
  • linux 페이지로 이동
    • fsync — 리눅스 파일 동기화 시스템 콜
    • tmux — Terminal Multiplexer
  • network 페이지로 이동
    • 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 사용자가 빠르게 익히는 법
    • GPU·CUDA·MPS 기초 — 자바 백엔드 개발자가 처음 만나는 그림
    • Multi-process GPU 워크로드 — 자바 ThreadPool 사용자가 만나는 모델 차이
    • Java 개발자를 위한 Python 심화 — OOP·데코레이터·컨텍스트 매니저
    • PyTorch 기초 — 텐서, 디바이스, 그리고 모델 로딩이 무거운 이유
    • Java 개발자를 위한 Python 문법 핵심
    • ML 서비스 성능 분석 워크플로 — 자바 백엔드 트러블슈팅과 다른 점
    • OCR 동작 원리 — Layout · Text · Post-process 3단계
    • Python 서버의 RSS 가 안 줄어드는 이유 — gc.collect 의 한계와 malloc_trim
  • rabbitmq 페이지로 이동
    • [초안] RabbitMQ Basics — 실전 백엔드 관점에서 정리하는 메시지 브로커 기본기
    • [초안] RabbitMQ vs Kafka — 백엔드 메시징 선택 기준과 실전 운영 관점
  • 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까지
  • travel 페이지로 이동
    • 오사카 3박 4일 일정표: 우메다 쇼핑, USJ, 난바·도톤보리, 오사카성
  • web 페이지로 이동
    • [초안] HTTP / Cookie / Session / Token 인증 기본기 — 레거시 JSP와 모바일 API가 공존하는 백엔드 관점
FOS-BLOG · FOOTERall systems normal·v0.1 · 2026.04.27·seoul, kr
Ffos-blog/study

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

visitors
01site
  • Home↗
  • Posts↗
  • Categories↗
  • 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/Helm과 ArgoCD로 GitOps 하기 …
devops

Helm과 ArgoCD로 GitOps 하기 — chart, Application, 그리고 새 컴포넌트 추가 흐름

쿠버네티스에 새 컴포넌트(ingress controller 하나)를 추가하는 작업을 맡고 나서야, 그동안 "어딘가에서 알아서 배포되던" 그 과정의 구조를 처음 들여다봤다. Helm 차트가 뭐고, ArgoCD가 뭘 하고, Application이라는 게 왜 또 따로 있는지. 막상 정리해보니 큰 그림은 단순했다. 그 구조와, 실제로 새 컴포넌트를 추가하려면 어디...

2026.06.09·5 min read·8 views

쿠버네티스에 새 컴포넌트(ingress controller 하나)를 추가하는 작업을 맡고 나서야, 그동안 "어딘가에서 알아서 배포되던" 그 과정의 구조를 처음 들여다봤다. Helm 차트가 뭐고, ArgoCD가 뭘 하고, Application이라는 게 왜 또 따로 있는지. 막상 정리해보니 큰 그림은 단순했다. 그 구조와, 실제로 새 컴포넌트를 추가하려면 어디서부터 손대야 하는지를 정리한다.

왜 이런 도구들이 필요한가

순수하게 하면, 쿠버네티스에 뭘 배포하려면 YAML(Deployment, Service, Ingress...)을 손으로 쓰고 kubectl apply 하면 된다. 그런데 실무에서 이 방식은 금방 무너진다.

  • 환경(테스트/스테이징/운영)마다 값만 다르고 구조는 똑같은 YAML을 중복해서 관리해야 한다.
  • 누가 언제 뭘 바꿨는지 추적이 안 된다. 누군가 kubectl edit으로 클러스터를 직접 고치면 기록이 안 남는다.
  • 클러스터의 실제 상태와 "원래 의도했던 상태"가 어긋나도 알아챌 방법이 없다.

이 두 종류의 문제를 각각 푸는 게 Helm(중복·템플릿 문제)과 ArgoCD(추적·동기화 문제)다. 둘은 역할이 다르고, 같이 쓴다.

Helm — 쿠버네티스 YAML의 템플릿 엔진

Helm은 템플릿 + 값 → 최종 YAML을 만들어주는 도구다. 매번 YAML을 손으로 쓰는 대신, 빈칸({{ }})이 뚫린 템플릿을 만들어두고 값만 갈아끼운다.

이 패키지 단위를 Chart라고 부른다. 차트 디렉터리 구조는 대략 이렇게 생겼다.

plaintext
my-component/
├── Chart.yaml          # 차트 메타 + 의존성 선언
├── values.yaml         # 기본값 (모든 환경 공통)
├── alpha-values.yaml   # 환경별 오버라이드
└── charts/
    └── some-dependency-1.0.0.tgz   # 의존하는 외부 차트

각 파일의 역할:

  • Chart.yaml — 차트 이름, 버전, 그리고 의존성. 남이 만든 차트(예: 공식 ingress-nginx)에 의존한다면 여기에 선언한다.
  • values.yaml — 템플릿에 끼워넣을 기본값. {{ .Values.foo }}로 템플릿에서 참조한다.
  • {stage}-values.yaml — 환경별로 덮어쓸 값. Helm은 -f values.yaml -f alpha-values.yaml처럼 여러 값 파일을 주면 뒤가 앞을 덮어쓴다. 그래서 공통값은 values.yaml에 두고, 환경마다 다른 부분만 {stage}-values.yaml에 둔다.
  • charts/ — 의존하는 외부 차트를 압축 파일로 담아둔다(vendoring). 인터넷에서 매번 받아오는 대신 레포에 박아두는 방식이다.

두 가지 차트 패턴 — 이 차이가 핵심

차트를 만드는 방식에는 두 갈래가 있다. 둘 다 실무에서 쓴다.

패턴방식templates/
의존 차트 재사용남이 만든 차트(공식 ingress-nginx 등)를 가져와 설정값만 준다없음
직접 templates 작성내 Deployment/Service/Ingress를 직접 템플릿으로 쓴다있음
  • ingress controller처럼 이미 잘 만들어진 공식 차트가 있으면, 그걸 의존성으로 두고 values로 설정만 조정한다. 이때는 내가 쓸 YAML이 없으니 templates/ 폴더가 없다.
  • 반대로 내 애플리케이션은 공식 차트가 없으니, templates/ 안에 deployment.yaml, service.yaml, ingress.yaml을 직접 템플릿으로 쓴다.

templates/ 안의 파일이 바로 {{ .Values.foo }} 빈칸이 뚫린 YAML이고, 거기에 values를 끼워 최종 매니페스트가 만들어진다. 이 렌더링 결과를 미리 확인하는 명령이 helm template인데, 이게 배포 전 검증의 핵심이다(뒤에서 다시 나온다).

ArgoCD — git을 정답으로 삼는 GitOps

Helm이 YAML을 만들어준다면, ArgoCD는 그 YAML을 언제 어떻게 클러스터에 반영할지를 맡는다. 핵심 사상은 GitOps다.

git에 적힌 상태 = 클러스터가 있어야 할 상태. ArgoCD는 git을 계속 감시하다가, 클러스터가 git과 다르면 sync로 맞춘다. 그래서:

  • git이 single source of truth가 된다. 클러스터를 kubectl로 직접 고치는 게 아니라, git을 고치고 sync한다. 모든 변경이 git 커밋으로 남으니 추적이 된다.
  • sync 정책은 두 가지다. auto-sync는 git이 바뀌면 자동 반영하고, manual sync는 사람이 sync 버튼을 눌러야 반영한다. 중요한 인프라는 manual로 두는 경우가 많다. git에 머지됐다고 바로 배포되는 게 아니라, 사람이 한 번 더 확인하고 누르는 안전장치인 셈이다.

ArgoCD Application — "이 차트를 배포해라"는 선언

ArgoCD에게 어느 git의 / 어느 경로 차트를 / 어느 값으로 / 어느 클러스터·namespace에 배포할지를 알려주는 리소스가 Application이다. 대략 이렇게 생겼다.

yaml
kind: Application
spec:
  source:
    repoURL: https://.../my-repo.git        # 어느 git
    path: applications/my-component          # 어느 차트
    helm:
      valueFiles:
        - values.yaml
        - alpha-values.yaml                  # 어느 값
  destination:
    namespace: my-component                  # 어느 namespace

여기서 한 가지 헷갈렸던 게 있다. 배포할 내용(차트)과 배포하라는 선언(Application)은 별개라는 점이다. 차트만 있고 Application이 없으면 ArgoCD는 그 차트의 존재를 모른다. 둘 다 있어야 동작한다.

app-of-apps 패턴

레포 구조를 보다가 영리한 패턴을 하나 발견했다. argocd/ 디렉터리 자체가 하나의 Helm 차트이고, 그 templates/ 안에서 여러 개의 Application을 찍어낸다.

plaintext
argocd/templates/
├── ingress-nginx-application.yaml        # 사설 controller 배포 선언
├── app-application.yaml                  # 앱들 배포 선언
└── my-component-application.yaml         # 내가 추가한 선언

이걸 app of apps라고 부른다. Application들을 만들어내는 상위 Application이다. 그래서 새 컴포넌트를 추가할 때는 여기에 Application 하나를 더 얹으면 된다.

전체 관계도

지금까지를 한 그림으로 묶으면 이렇다.

두 갈래만 기억하면 된다. 배포할 내용(차트)은 applications/에, 배포하라는 선언(Application)은 argocd/templates/에. 둘 다 있어야 한 컴포넌트가 동작한다.

새 컴포넌트를 추가한다면 — 어디서 시작하나

내가 실제로 ingress controller를 하나 추가하며 밟은 단계를 정리하면, 비슷한 컴포넌트를 추가할 때 이대로 따라가면 된다.

차트 만들기(applications/{name}/)

  • 디렉터리를 만든다.
  • Chart.yaml을 쓴다. 공식 차트에 의존한다면 dependencies에 명시한다.
  • 의존 차트를 charts/에 압축 파일로 둔다. (기존에 쓰던 걸 복사하면 된다.)
  • values.yaml에 공통 설정을 쓴다.
  • {stage}-values.yaml에 환경별로 다른 부분만 쓴다.

ArgoCD Application 추가(argocd/templates/{name}-application.yaml)

  • 기존 Application 파일 하나를 복사해서 고친다.
  • path(차트 위치), namespace(배포 대상), valueFiles를 지정한다.
  • 리소스 생성 순서가 중요하면 sync-wave로 순서를 제어한다.

로컬 렌더 검증 — 배포 전 필수

  • helm template {name} . -f values.yaml -f alpha-values.yaml로 렌더해서, 실제로 어떤 YAML이 나오는지 눈으로 확인한다.
  • 나는 이 단계에서 의도대로 리소스가 분리되는지를 확인했다. 이 단계를 건너뛰면, 잘못된 YAML이 클러스터에 가서야 문제가 드러난다. 미리 보는 비용이 훨씬 싸다.

git에 반영

  • 브랜치 → commit → PR → 머지. GitOps라 git에 들어가야 ArgoCD가 인식한다.

ArgoCD에서 sync

  • manual sync라면 사람이 sync를 눌러야 실제로 배포된다.
  • sync 후 kubectl get으로 실제로 떴는지 확인한다.

여기까지 밟고 나서 잡힌 감각은 이거다. 내가 만들 건 결국 차트(applications/)와, 그걸 배포하라는 Application(argocd/templates/) 두 개다. 그리고 클러스터에 손대기 전에 helm template로 먼저 눈으로 확인하고, git을 통해서만 배포한다. 이 흐름만 잡으면 새 컴포넌트 추가는 거의 같은 패턴의 반복이었다.

관련 글

  • 쿠버네티스 핵심 객체 4종 — 차트가 만들어내는 Pod/Service/Ingress가 뭔지
  • ingress-nginx 운영에서 부딪힌 디테일들 — 이 흐름으로 실제 추가한 컴포넌트의 운영 디테일

참고 링크

  • Helm 공식 문서
  • Argo CD 공식 문서
  • Argo CD — App of Apps 패턴
on this page
  • 01왜 이런 도구들이 필요한가
  • 02Helm — 쿠버네티스 YAML의 템플릿 엔진
  • 두 가지 차트 패턴 — 이 차이가 핵심
  • 03ArgoCD — git을 정답으로 삼는 GitOps
  • 04ArgoCD Application — "이 차트를 배포해라"는 선언
  • app-of-apps 패턴
  • 05전체 관계도
  • 06새 컴포넌트를 추가한다면 — 어디서 시작하나
  • 07관련 글
  • 08참고 링크

이런 글도

  • 쿠버네티스 핵심 객체 4종 — Pod, Service, Ingress, Namespace의 관계
    쿠버네티스에서 외부 노출 작업을 하다가, Pod니 Service니 Ingress니 하는 단어들이 머릿속에서 자꾸 섞였다. 각각 뉘앙스는 알겠는데 "그래서 이것들이 서로 어떤 관계냐"가 안 잡혔다. 그래서 이 네 가지를 한 번에 정리하기로 했다. 이 네 개의 관계만 잡으면 쿠버네티스의 절반은 이해한 거라고 봐도 된다. 한 문장으로 시작하면 빠르다 — Pod는...
    🚀 devops
    devops
    2026.06.09
  • ingress-nginx 운영에서 부딪힌 디테일들 — webhook, whitelist, affinity, 리소스 사양
    ingress controller를 하나 추가하는 작업은 "차트 만들고 배포하면 끝"일 줄 알았다. 그런데 실제로는 그 과정에서 처음 보는 개념들에 계속 걸렸다. annotation으로 설정을 관리하는 방식, admission webhook이 만드는 self-lock 위험, whitelist, Pod 분산 배치, 그리고 리소스 사양까지. 하나하나는 작지만,...
    🚀 devops
    devops
    2026.06.09
  • 외부 트래픽은 어떻게 Pod까지 닿는가 — LoadBalancer, Ingress Controller, 내부와 외부 분리
    회사에서 "API Gateway를 걷어내고, 쿠버네티스 앞에 LoadBalancer를 직접 붙여서 외부로 노출하자"는 작업을 맡게 됐다. 그런데 막상 들여다보니 나는 Ingress가 뭔지도 제대로 몰랐다. "외부 요청이 들어와서 서버가 응답한다" 정도로만 알고 있었지, 그 사이에 LoadBalancer니 Ingress Controller니 하는 것들이 몇...
    🚀 devops
    devops
    2026.06.09
  • Docker에서 좀비 프로세스가 쌓이는 이유 — PID 1 문제와 tini
    운영 중인 문서 파싱 서비스 인스턴스에 들어가서 ps를 쳤다가, soffice.bin 가 화면을 가득 채우는 걸 봤다. 세어보니 420개였다. 컨테이너가 뜬 지 일주일밖에 안 됐는데 좀비가 420마리. 처음엔 "좀비는 메모리도 거의 안 먹는다는데 그냥 둬도 되나?" 싶었다. 그런데 좀비는 PID 슬롯을 하나씩 점유한다. 계속 쌓이면 결국 PID가 고갈되고,...
    🚀 devops
    devops
    2026.06.08

댓글 (0)