기본 콘텐츠로 건너뛰기

Kubernetes 롤링 업데이트 실패와 파드 준비도 문제 해결 가이드

Kubernetes 롤링 업데이트 실패와 파드 준비도 문제 해결 가이드

AI 생성 이미지: Kubernetes 롤링 업데이트 실패와 파드 준비도 문제 해결
AI 생성 이미지: Kubernetes 롤링 업데이트 실패와 파드 준비도 문제 해결

문제 정의 — 롤링 업데이트가 멈추거나 트래픽이 전달되지 않을 때의 증상

이 문서는 Kubernetes 롤링 업데이트 실패와 파드 준비도 문제 해결에 도움이 되는 주요 징후를 정리합니다. 여러 계층에서 다양한 증상이 나타날 수 있습니다.

  • 롤아웃이 진행되지 않음 — 'kubectl rollout status'가 완료 표시를 하지 않거나 ProgressDeadlineExceeded 이벤트가 발생함
  • 파드가 CrashLoopBackOff, ImagePullBackOff 또는 ErrImagePull 상태에 머무름
  • 파드가 Running 또는 Terminating 상태이지만 Ready가 false로 표시됨 — readiness probe 실패 가능성
  • Init 컨테이너가 끝나지 않아 애플리케이션 컨테이너가 시작되지 않음
  • Service의 Endpoints가 비어 있어 트래픽이 대상 파드로 전달되지 않음
  • Ingress 또는 LoadBalancer 레벨에서 502/503 응답이 뜨거나 연결이 시간초과됨
  • PodDisruptionBudget, maxUnavailable, minReadySeconds 같은 정책 때문에 신규 파드 배치가 제한될 수 있음
  • 노드 리소스 부족(OOM, CPU 압박)이나 스케줄러 제약으로 파드가 Pending 상태로 남음
  • 실무 체크리스트 예: 이벤트 로그 확인 → readiness/liveness probe 상태 점검 → 이미지 풀 및 레지스트리 접근 확인 → 리소스 요청/제한과 스케줄 제약 검토 → Service/Endpoints 재확인

준비도(readiness), 가동성(liveness), 스타트업(startup) 프로브의 차이와 실제 동작

Kubernetes의 세 프로브는 목적과 롤아웃에 미치는 영향에서 분명히 구분됩니다. 특히 Kubernetes 롤링 업데이트 실패와 파드 준비도 문제 해결 관점에서는 각 프로브가 트래픽 차단·컨테이너 재시작·초기 지연 중 어떤 역할을 하는지 정확히 아는 것이 중요합니다.

간단히 정리하면, startupProbe는 긴 초기화 작업 동안 liveness와 readiness를 잠시 무시해 초기화 시간을 보장하며, 실패하면 컨테이너를 재시작합니다. livenessProbe는 프로세스 고착이나 치명적 오류를 감지하면 kubelet이 컨테이너를 재시작하도록 트리거합니다. 반복적인 재시작은 크래시루프로 이어져 롤아웃 실패를 초래할 수 있습니다. readinessProbe는 엔드포인트 등록/해제를 통해 트래픽 흐름을 제어하며, 새 리플리카가 Ready가 될 때까지 이전 버전을 유지하는 등 Deployment의 진행에 직접적인 영향을 줍니다.

실무 체크리스트

  • startupProbe로 초기화 시간을 분리해 liveness가 초기 지연을 오탐하지 않도록 한다
  • liveness와 readiness의 initialDelaySeconds, periodSeconds, failureThreshold 값을 서비스 특성에 맞게 조정한다
  • readiness 실패 시 롤아웃이 멈추는지 kubectl rollout status로 확인한다
  • 문제가 반복되면 로그와 이벤트를 확인하고 rollingUpdate(maxUnavailable/maxSurge) 설정을 검토한다
  • 간단한 재현: readiness를 고의로 실패시켜 kubectl get endpoints와 서비스 접속으로 트래픽이 준비된 파드로만 흐르는지 확인해 본다

현장 진단 체크리스트 — 무엇을 먼저 확인해야 하는가

롤링 업데이트가 실패하거나 파드가 Ready 상태가 되지 않을 때 신속히 점검할 항목들입니다. 간단한 실무 체크: 이벤트 확인 → 로그 확인 → 프로브·설정 점검 순으로 원인을 좁혀보세요. 이 목록은 Kubernetes 롤링 업데이트 실패와 파드 준비도 문제 해결에 도움이 됩니다.

  • 이벤트/설명: kubectl describe deployment/replicaset/podkubectl get events로 경고·오류를 먼저 파악하고, 디플로이먼트 전략(maxUnavailable/maxSurge)도 함께 확인하세요
  • 파드 로그: 최근 컨테이너 로그와 이전 인스턴스 로그(kubectl logs -p)를 살펴 애플리케이션 예외나 시작 실패를 찾아보세요
  • 프로브 실패 원인: readiness/liveness의 경로·포트, 타임아웃과 initialDelaySeconds 설정을 점검해 프로브가 의도대로 동작하는지 확인합니다
  • 이미지 풀/인증: ImagePullBackOff, 레지스트리 접근성 문제, ImagePullSecretimagePullPolicy 설정 등을 점검하세요
  • 리소스 문제: OOMKilled 여부와 CPU·메모리 요청·한도(requests/limits), taints/tolerations로 인한 스케줄 불가를 확인합니다
  • 네트워크·DNS: 서비스 엔드포인트, ClusterDNS 상태를 확인하고 네트워크 폴리시로 트래픽이 차단되는지 점검하세요
  • 설정·시크릿: ConfigMap/Secret 마운트 실패나 환경변수 누락 등 설정 관련 오류를 확인합니다

원인별 해결 방법과 프로브·리소스 튜닝 요령

롤링 업데이트 실패는 보통 새 파드가 Ready 상태가 되기 전에 기존 파드를 삭제하면서 발생한다. 원인별 실전 대책은 아래와 같다.

  • 기동 지연: readiness·liveness의 initialDelay, timeout, period, failureThreshold 값을 조정해 불필요한 재시작을 줄인다. 초기화가 길다면 startupProbe로 분리해 readiness 판단을 늦춘다.
  • 리소스 부족: requests·limits를 현실적으로 상향하고 CPU·메모리 여유를 확보한다. VPA·HPA와 노드 오토스케일링을 함께 도입해 여유 버퍼를 마련하라.
  • 의존성 지연: init 컨테이너로 DB 마이그레이션, 시크릿 로드, 네트워크 헬스 체크를 처리한다. 또는 이미지 프리풀링을 활용하라.
  • 재시작 루프: timeout과 failureThreshold를 적절히 조정해 실패 판단을 완화한다. 이렇게 하면 불필요한 롤백을 줄일 수 있다.

작업 전후로 스테이징 환경에서 probe·리소스 조합을 A/B 테스트해 안정 최적값을 찾자. 간단한 체크리스트로는 readiness timeout 확인, startupProbe 적용 여부, requests/limits 설정, 롤백 임계값 점검 등이 있다. 이 과정은 Kubernetes 롤링 업데이트 실패와 파드 준비도 문제 해결에 직접 도움이 된다.

롤아웃 안전성 강화 — 배포 전략과 Kubernetes 설정

롤링 업데이트 실패를 줄이려면 Deployment의 maxUnavailable과 maxSurge를 서비스 가용성 및 배포 속도에 맞게 조정하세요(예: 0/1 또는 25%/25%). progressDeadlineSeconds를 설정해 실패 감지 시간을 제어하면 문제를 빠르게 포착할 수 있습니다. Canary와 Blue-Green 전략은 트래픽 제어와 신속한 롤백에 유리합니다. 이러한 기본 원칙은 Kubernetes 롤링 업데이트 실패와 파드 준비도 문제 해결에 실무적으로 도움이 됩니다.

  • Canary: 소수의 파드에 새 버전을 배포한 뒤 에러율·지연 등 주요 지표를 모니터링하며 단계적으로 확장합니다. 서비스 메쉬나 Ingress에서 트래픽 비율로 제어할 수 있습니다.
  • Blue-Green: 별도의 환경에서 새 버전을 충분히 검증한 다음 전체 트래픽을 전환합니다. 문제가 생기면 즉시 이전 상태로 되돌리기 쉽습니다.
  • Paused rollouts: kubectl rollout pause로 배포를 일시 중단해 상태, 로그, 헬스 체크를 면밀히 확인한 뒤 resume하세요. 이상이 발견되면 rollback을 실행하는 것이 안전합니다.
  • readinessGate·서비스 메쉬 연동: 사이드카가 완전히 초기화될 때까지 트래픽을 차단하려면 readinessProbe와 readinessGate를 함께 사용하세요. Istio나 Linkerd의 VirtualService·DestinationRule을 이용하면 점진적 트래픽 분산을 구현할 수 있습니다.
  • 추가 권장: preStop을 통한 연결 드레인 적용, Liveness/Readiness 튜닝, 모니터링 기반 자동화(예: Argo Rollouts) 도입을 권장합니다. 간단한 배포 전 체크리스트 예시: 헬스체크 통과 확인, 로그 이상 유무 점검, 리소스 여유 확인, 롤백 절차 점검.

관찰성·알림·사후대응 — 재발 방지 체크리스트

  • Kubernetes 롤링 업데이트 실패와 파드 준비도 문제 해결 관점에서, 프로브 실패 메트릭: readiness·liveness 실패 비율, startup probe 비율과 프로브 응답 지연 시간 히스토그램을 수집해 시간대와 릴리스별로 집계한다. 예시 체크리스트: 배포 전 readiness 통과율이 95% 이상인지, startup probe 설정과 지표 수집이 정상인지 확인.
  • 대시보드: 파드별 준비도, 롤링 업데이트 진행률, 실패한 파드의 이벤트를 한눈에 확인할 수 있는 뷰를 구성한다(서비스·네임스페이스 필터 포함).
  • 알림 정책: 준비도 90% 미만이나 실패율 급증 등 임계치와 번(Burn) 기준을 구분해, 경고·중요·긴급 등 레벨을 정하고 각 에스컬레이션 경로를 명확히 한다.
  • 자동 복구·롤백: 실패를 감지하면 롤아웃을 일시중지하거나 자동으로 롤백하고, 헬스 체크 기반 자동 재시작이나 이전 안정 버전 복원 스크립트를 마련한다.
  • 포스트모템·런북: 사건 타임라인, 근본 원인(RCA), 재현 방법, 임시 회피법과 재발 방지 작업을 문서화하고, 런북에 신속 대응용 명령어와 대시보드 링크를 포함해 업데이트한다.
  • 운영 연습: 정기적인 카오스 테스트와 릴리스 드릴을 통해 알림의 유효성·런북의 실효성을 검증하고, 모니터링 룰과 플레이북을 지속적으로 개선한다.

경험에서 배운 점

롤링 업데이트 실패는 대개 준비도(readiness) 설정과 파드의 실제 시작·종료 동작이 클러스터의 업데이트 전략과 맞지 않을 때 발생합니다. 흔한 사례로는 readinessProbe나 livenessProbe의 경로·포트·타임아웃 설정이 잘못되어 파드가 준비 상태로 표시되지 않거나, 대용량 마이그레이션이나 볼륨 어태치처럼 초기화가 오래 걸려 kubelet이 파드를 준비 상태로 보지 못하는 경우가 있습니다. 또 preStop 훅이나 terminationGracePeriodSeconds가 미설정되어 종료 과정에서 연결이 끊기거나, maxUnavailable을 과도하게 설정해 동시에 교체되는 인스턴스 수가 지나치게 많은 경우도 자주 보입니다.

재발 방지의 핵심은 '검증 가능한 체크포인트'와 점진적 배포 전략입니다. readiness와 liveness의 역할을 명확히 분리하고, 긴 초기화는 startupProbe로 처리하세요. probe의 initialDelay·timeout·period는 실제 시작 시간에 맞춰 테스트해 조정해야 합니다. 배포 파이프라인에 kubectl rollout status, describe/events, 컨테이너 로그 확인 절차를 포함하고 실패 시 자동 롤백이나 알림을 연계하는 것이 좋습니다. 중요한 서비스에는 PDB와 카나리·블루그린 전략을 적용해 한 번에 너무 많은 인스턴스를 교체하지 않도록 하세요. 간단한 현장 체크리스트 예: 1) probe 경로·포트 확인 2) 초기화 소요시간 측정 3) PDB 및 maxUnavailable 정책 검토 4) 롤백 절차 자동화. (Kubernetes 롤링 업데이트 실패와 파드 준비도 문제 해결 관점에서 위 원칙들이 특히 중요합니다.)

  • readinessProbe vs livenessProbe 역할 분리: readiness는 트래픽 수용 여부, liveness는 프로세스 생존 여부.
  • 긴 초기화는 startupProbe로 처리하고, probe의 initialDelay/timeout/period를 실제 시작 시간에 맞춰 반드시 테스트.
  • terminationGracePeriodSeconds와 preStop 훅으로 graceful shutdown을 보장하고 트래픽 드레이닝을 확인.
  • maxUnavailable/maxSurge 값은 SLA에 맞춰 보수적으로 설정. 중요한 서비스는 카나리나 블루그린으로 배포.
  • PDB로 최소 가용성 보장. PVC attach 지연이 있는 스토리지라면 사전 프로비저닝을 검토.
  • 배포 파이프라인에 kubectl rollout status, describe 이벤트 확인, 컨테이너 로그 수집을 포함시키고 실패 시 자동 롤백을 고려.
  • 이미지 풀 정책, initContainers 실패, 노드 리소스 압박(kubelet eviction) 등 인프라 측면도 함께 점검.
  • 스테이징 환경에서 실제 프로브 및 종료 시퀀스를 재현해 검증하고, 엔드포인트 상태·SLO 기반 모니터링으로 이상을 조기에 탐지.
AI 생성 이미지: Kubernetes 롤링 업데이트 실패와 파드 준비도 문제 해결
AI 생성 이미지: Kubernetes 롤링 업데이트 실패와 파드 준비도 문제 해결

댓글

이 블로그의 인기 게시물

Java Servlet Request Parameter 완전 정복 — GET/POST 모든 파라미터 확인 & 디버깅 예제 (Request Parameter 전체보기)

Java Servlet Request Parameter 완전 정복 — GET/POST 모든 파라미터 확인 & 디버깅 예제 Java Servlet Request Parameter 완전 정복 웹 애플리케이션에서 클라이언트로부터 전달되는 Request Parameter 를 확인하는 것은 필수입니다. 이 글에서는 Java Servlet 과 JSP 에서 GET/POST 요청 파라미터를 전체 출력하고 디버깅하는 방법을 다양한 예제와 함께 소개합니다. 1. 기본 예제: getParameterNames() 사용 Enumeration<String> params = request.getParameterNames(); System.out.println("----------------------------"); while (params.hasMoreElements()){ String name = params.nextElement(); System.out.println(name + " : " + request.getParameter(name)); } System.out.println("----------------------------"); 위 코드는 요청에 포함된 모든 파라미터 이름과 값을 출력하는 기본 방법입니다. 2. HTML Form과 연동 예제 <form action="CheckParamsServlet" method="post"> 이름: <input type="text" name="username"><br> 이메일: <input type="email" name="email"><b...

PostgreSQL 달력(일별,월별)

SQL 팁: GENERATE_SERIES로 일별, 월별 날짜 목록 만들기 SQL 팁: GENERATE_SERIES 로 일별, 월별 날짜 목록 만들기 데이터베이스에서 통계 리포트를 작성하거나 비어있는 날짜 데이터를 채워야 할 때, 특정 기간의 날짜 목록이 필요할 수 있습니다. PostgreSQL과 같은 데이터베이스에서는 GENERATE_SERIES 함수를 사용하여 이 작업을 매우 간단하게 처리할 수 있습니다. 1. 🗓️ 일별 날짜 목록 생성하기 2020년 1월 1일부터 12월 31일까지의 모든 날짜를 '1 day' 간격으로 생성하는 쿼리입니다. WITH date_series AS ( SELECT DATE(GENERATE_SERIES( TO_DATE('2020-01-01', 'YYYY-MM-DD'), TO_DATE('2020-12-31', 'YYYY-MM-DD'), '1 day' )) AS DATE ) SELECT DATE FROM date_series 이 쿼리는 WITH 절(CTE)을 사용하여 date_series 라는 임시 테이블을 만들고, GENERATE_SERIES 함수로 날짜를 채웁니다. 결과 (일별 출력) 2. 📅 월별 날짜 목록 생성하기 동일한 원리로, 간격을 '1 MONTH' 로 변경하면 월별 목록을 생성할 수 있습니다. TO...

CSS로 레이어 팝업 화면 가운데 정렬하는 방법 (top·left·transform 완전 정리)

레이어 팝업 센터 정렬, 이 코드만 알면 끝 (CSS 예제 포함) 이벤트 배너나 공지사항을 띄울 때 레이어 팝업(center 정렬) 을 깔끔하게 잡는 게 생각보다 어렵습니다. 화면 크기가 변해도 가운데에 고정되고, 모바일에서도 자연스럽게 보이게 하려면 position , top , left , transform 을 정확하게 이해해야 합니다. 이 글에서는 아래 내용을 예제로 정리합니다. 레이어 팝업(center 정렬)의 기본 개념 자주 사용하는 position: absolute / fixed 정렬 방식 질문에서 주신 스타일 top: 3.25%; left: 50%; transform: translateX(-50%) 의 의미 실무에서 바로 쓰는 반응형 레이어 팝업 HTML/CSS 예제 1. 레이어 팝업(center 정렬)이란? 레이어 팝업(레이어 팝업창) 은 새 창을 띄우는 것이 아니라, 현재 페이지 위에 div 레이어를 띄워서 공지사항, 광고, 이벤트 등을 보여주는 방식을 말합니다. 검색엔진(SEO) 입장에서도 같은 페이지 안에 HTML이 존재 하기 때문에 팝업 안의 텍스트도 정상적으로 인덱싱될 수 있습니다. 즉, “레이어 팝업 센터 정렬”, “레이어 팝업 만드는 방법”과 같이 관련 키워드를 적절히 넣어주면 검색 노출에 도움이 됩니다. 2. 질문에서 주신 레이어 팝업 스타일 분석 질문에서 주신 스타일은 다음과 같습니다. <div class="layer-popup" style="width:1210px; z-index:9001; position:absolute; top:3.25%; left:50%; transform:translateX(-50%);"> 레이어 팝업 내용 <...