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/ingress-nginx 운영에서 부딪힌 디…
devops

ingress-nginx 운영에서 부딪힌 디테일들 — webhook, whitelist, affinity, 리소스 사양

ingress controller를 하나 추가하는 작업은 "차트 만들고 배포하면 끝"일 줄 알았다. 그런데 실제로는 그 과정에서 처음 보는 개념들에 계속 걸렸다. annotation으로 설정을 관리하는 방식, admission webhook이 만드는 self-lock 위험, whitelist, Pod 분산 배치, 그리고 리소스 사양까지. 하나하나는 작지만,...

2026.06.09·6 min read·7 views

ingress controller를 하나 추가하는 작업은 "차트 만들고 배포하면 끝"일 줄 알았다. 그런데 실제로는 그 과정에서 처음 보는 개념들에 계속 걸렸다. annotation으로 설정을 관리하는 방식, admission webhook이 만드는 self-lock 위험, whitelist, Pod 분산 배치, 그리고 리소스 사양까지. 하나하나는 작지만, 모르고 지나가면 운영에서 사고가 나는 것들이라 정리해둔다.

내부용과 외부용 controller를 분리한 배경은 외부 트래픽이 Pod까지 닿는 경로에 있고, 이 글은 그 후속으로 controller를 다루며 부딪힌 운영 디테일을 모았다.

annotation으로 설정을 관리하는 이유

Ingress YAML을 보면 metadata.annotations에 별별 설정이 다 들어간다.

yaml
metadata:
  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: 10m
    nginx.ingress.kubernetes.io/whitelist-source-range: 10.0.0.0/8

처음엔 "왜 설정을 spec이 아니라 annotation(메모)으로 넣지?"가 이상했다. 이유를 알고 나니 쿠버네티스의 설계 의도가 보였다.

쿠버네티스의 Ingress 표준 spec은 최소한만 정의한다. "어느 호스트의 어느 경로를 어느 Service로" 정도뿐이다. body size 제한, IP whitelist, 경로 rewrite, rate limit 같은 세부 동작은 표준 spec에 칸 자체가 없다.

그런데 실제 Ingress Controller는 제품마다(nginx, traefik, haproxy) 고유 기능이 천차만별이다. 이걸 전부 표준 spec에 넣을 수가 없다. 한 제품 기능을 표준에 박으면 다른 제품엔 안 맞으니까. 그래서 controller별 확장 설정을 annotation이라는 통로로 전달한다. nginx ingress controller는 nginx.ingress.kubernetes.io/로 시작하는 annotation을 읽어서 자기 내부 nginx.conf에 반영한다.

spec은 정해진 칸만 채우는 정식 신청서 양식이고, annotation은 거기 붙이는 포스트잇 메모다. 양식엔 칸이 없지만 담당자(controller)가 메모를 읽고 처리해준다.

이렇게 한 이유는 쿠버네티스가 벤더 중립을 지키려고 그런 거다. "Ingress"라는 표준 개념은 공통으로 두되, 각 controller의 고유 기능은 표준을 건드리지 않고 annotation으로 확장하게 했다. 다만 이 방식이 깔끔하지 않다는 불만이 쌓여서, 요즘은 Gateway API라는 차세대 표준이 이런 설정을 정식 필드로 흡수하려는 흐름도 있다. 아직은 ingress-nginx와 annotation 조합이 현업 주류지만.

admission webhook — 격리가 안 되는 검문소

이게 이번 작업에서 가장 직관에 어긋났던 부분이다.

admission webhook은 쿠버네티스에 리소스를 만들거나 바꾸려고 요청하면, API 서버가 저장하기 직전에 거치는 검문소다. ingress-nginx를 설치하면 이 검문소(ValidatingWebhookConfiguration)가 같이 깔린다. 역할은 검증이다. 잘못된 Ingress(nginx 설정으로 바꿨을 때 문법 오류가 나는 것)를 미리 거부해서, 깨진 설정 하나가 nginx 전체를 망가뜨리는 걸 막는다.

문제는 controller를 둘로 나눌 때 드러난다. controller는 IngressClass로 자기 것만 처리하지만, webhook은 그렇지 않다.

  • controller는 --ingress-class로 자기 class(nginx 또는 nginx-external)만 본다. 깔끔하게 격리된다.
  • 그런데 webhook은 cluster-scoped 리소스라서, class로도 namespace로도 격리되지 않고 클러스터 전체의 Ingress 요청을 가로챈다.

(이 "cluster-scoped"라는 성질은 쿠버네티스 핵심 객체 4종에서 다룬, namespace에 속하지 않는 전역 리소스 얘기와 같은 맥락이다.)

그래서 외부용 controller를 추가하면 webhook도 하나 더 생기는데, 이 새 webhook은 "외부 class만"이 아니라 모든 Ingress(내부 것 포함)를 검문한다. 여기서 사고 시나리오가 나온다.

  1. 외부 controller의 webhook Pod가 죽는다.
  2. 그런데 이 webhook은 모든 Ingress 요청을 검문하도록 등록돼 있다.
  3. 검문에 응답할 수 없으면, 정책에 따라 요청을 거부한다(failurePolicy: Fail).
  4. 결과적으로 내부 Ingress를 수정하려 해도 "webhook 응답 없음"으로 거부된다.
  5. 배포 도구가 Ingress를 반영하려다 줄줄이 실패한다 — self-lock의 변종이다.

그래서 외부 controller에는 admissionWebhooks.enabled: false로 webhook 자체를 안 만들었다. 검증을 한 겹 포기하는 셈이지만, 사전 검증은 기존 controller의 webhook이 어차피 클러스터 전체로 해주고 있으니(전역이라), 새 장애점만 안 생기고 내부 경로가 안전해진다. 검증 한 겹과 self-lock 위험을 맞바꾼 거고, 후자가 훨씬 무거웠다.

controller는 자기 구역만 배달하는 우편배달부고, webhook은 우체국 전체의 검열대다. 검열대를 하나 더 만들면, 그게 고장 났을 때 다른 구역 편지까지 전부 막힌다.

whitelist-source-range — 공인인데 평문일 때의 보호막

외부용 Ingress에는 출발지 IP를 제한하는 annotation을 걸었다.

yaml
nginx.ingress.kubernetes.io/whitelist-source-range: 10.0.0.0/8,203.0.113.5

이걸 건 이유는 단계 때문이다. 공인 LB로 열면 이론상 인터넷의 누구나 그 IP로 접근할 수 있다. 그런데 이 시점엔 아직 TLS를 안 붙여서 통신이 평문 HTTP다. 평문인 채로 인터넷 전체에 열면 요청·응답 내용이 그대로 노출되니 위험하다. (TLS가 왜 필요한지는 HTTPS는 어떻게 안전한가에 정리해뒀다.)

그래서 공인 진입은 켜되, 실제로 닿을 수 있는 범위를 사내 IP로 제한했다. nginx가 요청의 출발지 IP를 보고, 목록에 없으면 403으로 거부한다. 지금 검증할 건 "공인 IP로 들어온 요청이 경로를 타고 앱까지 닿는가"뿐이라, 사내에서 호출해 확인하면 충분하다. 정식으로 외부에 공개할 때(TLS와 도메인이 준비되면) 이 제한을 조정하면 된다.

podAntiAffinity — replica를 다른 노드에 흩뿌리기

controller values에 이런 블록이 있었다.

yaml
affinity:
  podAntiAffinity:
    preferredDuringSchedulingIgnoredDuringExecution:
      - podAffinityTerm:
          labelSelector:
            matchExpressions:
              - key: app.kubernetes.io/instance
                operator: In
                values: [ingress-nginx-external]
          topologyKey: kubernetes.io/hostname
        weight: 1

길어 보이지만 뜻은 한 줄이다. 이 controller의 Pod들끼리는 가능하면 서로 다른 노드에 배치해라.

  • podAntiAffinity — anti(반대), 즉 "이런 Pod들끼리는 떨어뜨려 놔라".
  • preferredDuringScheduling... — preferred는 선호(강제 아님). 가능하면 지키되 안 되면 그냥 배치한다. (반대인 required로 하면 못 지킬 때 Pod가 아예 안 뜬다.)
  • topologyKey: kubernetes.io/hostname — 노드 단위로 떨어뜨린다.

controller를 2개 띄우는데 둘이 같은 노드에 몰려 있으면, 그 노드 하나가 죽을 때 둘 다 같이 죽어서 진입점 전체가 멈춘다. 다른 노드에 흩어두면 노드 하나가 죽어도 나머지가 살아남는다. preferred로 둔 건, 노드가 부족할 때 같은 노드에라도 뜨게 허용하려는 거다. required였으면 노드가 모자랄 때 Pod가 안 떠버린다.

당직 두 명을 가능하면 다른 건물에 배치하는 것과 같다. 한 건물에 불나도 한 명은 살아있게. 단 건물이 하나뿐이면 같은 건물이라도 배치한다(필수는 아니니까).

리소스 사양 — 추측 말고 측정

controller에 잡아둔 리소스가 충분한지 궁금했는데, 답은 추측이 아니라 측정에서 나왔다. kubectl top으로 실제 사용량을 보면 된다.

직접 보고 알게 된 것:

  • ingress-nginx controller는 의외로 메모리를 적게 쓴다. 여러 Ingress를 처리하는데도 30~50Mi 수준이었다. nginx가 가벼운 reverse proxy라 그렇다.
  • memory request == limit이면 Guaranteed QoS다. "딱 그만큼 보장, 넘으면 즉시 OOMKill"이라는 뜻이다. 안정적이지만 여유 폭이 좁다. 갑작스런 스파이크에 죽지 않으려면 limit을 request보다 넉넉히 두는 게 안전하다.
  • 환경마다 사양이 다르다. 테스트 환경은 작게 잡고 replica를 고정해도 되지만, 운영 환경은 더 크게 잡고 autoscaling을 걸어 부하에 따라 Pod 수가 늘게 한다. 그래서 새 controller를 운영으로 확장할 땐 운영 쪽 사양·autoscaling 정책에 맞춰줘야 한다.

특히 주의할 케이스가 있다. 큰 파일을 업로드받는 서비스는 nginx가 요청 본문을 버퍼링하므로, 동시 업로드가 몰리면 메모리 압박이 생길 수 있다. (큰 본문은 디스크 임시파일로도 버퍼링돼서 폭증하진 않지만, 모니터링 대상이다.) 그래서 운영 적용 전에는 kubectl top으로 실제 부하를 한 번 측정하고 사양을 정하는 게 맞다. "충분하겠지"라는 추측보다 30초짜리 측정이 훨씬 믿을 만하다.

정리

ingress controller 하나 추가하는 일이, 알고 보니 이런 디테일들의 묶음이었다.

  • 설정은 표준 spec에 칸이 없어서 annotation으로 들어간다(벤더 중립 설계).
  • webhook은 controller와 달리 격리가 안 되니, controller를 늘릴 때 self-lock을 조심해야 한다.
  • 공인인데 평문인 단계에선 whitelist로 사내만 열어 테스트한다.
  • replica는 podAntiAffinity로 다른 노드에 흩뿌려 가용성을 지킨다.
  • 리소스는 추측하지 말고 kubectl top으로 측정해서 정한다.

각각은 사소해 보여도, 모르고 지나가면 "왜 내부 배포가 다 막히지?" 같은 사고로 돌아오는 것들이었다. 한 번 부딪혀보고 나니 다음엔 미리 챙길 수 있겠다 싶어 기록으로 남긴다.

관련 글

  • 외부 트래픽이 Pod까지 닿는 경로 — 내부/외부 controller를 나눈 배경
  • 쿠버네티스 핵심 객체 4종 — cluster-scoped 리소스가 뭔지
  • HTTPS는 어떻게 안전한가 — whitelist가 임시 보호막인 이유(TLS 전 단계)

참고 링크

  • ingress-nginx — Annotations
  • Kubernetes — Dynamic Admission Control
  • Kubernetes — Assigning Pods to Nodes (Affinity)
on this page
  • 01annotation으로 설정을 관리하는 이유
  • 02admission webhook — 격리가 안 되는 검문소
  • 03whitelist-source-range — 공인인데 평문일 때의 보호막
  • 04podAntiAffinity — replica를 다른 노드에 흩뿌리기
  • 05리소스 사양 — 추측 말고 측정
  • 06정리
  • 07관련 글
  • 08참고 링크

이런 글도

  • 쿠버네티스 핵심 객체 4종 — Pod, Service, Ingress, Namespace의 관계
    쿠버네티스에서 외부 노출 작업을 하다가, Pod니 Service니 Ingress니 하는 단어들이 머릿속에서 자꾸 섞였다. 각각 뉘앙스는 알겠는데 "그래서 이것들이 서로 어떤 관계냐"가 안 잡혔다. 그래서 이 네 가지를 한 번에 정리하기로 했다. 이 네 개의 관계만 잡으면 쿠버네티스의 절반은 이해한 거라고 봐도 된다. 한 문장으로 시작하면 빠르다 — Pod는...
    🚀 devops
    devops
    2026.06.09
  • Helm과 ArgoCD로 GitOps 하기 — chart, Application, 그리고 새 컴포넌트 추가 흐름
    쿠버네티스에 새 컴포넌트(ingress controller 하나)를 추가하는 작업을 맡고 나서야, 그동안 "어딘가에서 알아서 배포되던" 그 과정의 구조를 처음 들여다봤다. Helm 차트가 뭐고, ArgoCD가 뭘 하고, Application이라는 게 왜 또 따로 있는지. 막상 정리해보니 큰 그림은 단순했다. 그 구조와, 실제로 새 컴포넌트를 추가하려면 어디...
    🚀 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)