본문 바로가기

쿠버네티스

helm uninstall시 일부 리소스가 남아 있는 이유

helm install 중에 자원이 아직 완전히 생성되지 않았거나 초기화 중일 때, helm uninstall을 바로 실행하면 삭제가 실패하거나 멈춰버리는 현상이 발생할 수 있습니다. 이건 Helm과 Kubernetes 리소스의 상태 비일관성, finalizer, hook, 그리고 네트워크 지연 등 다양한 요인 때문입니다. 이번 글에서는 그 원인과 구체적인 메커니즘을 체계적으로 정리해 드립니다.

 

 

helm uninstall시 일부 리소스가 남아 있는 이유

 

 

목 차

 

 

1. 헬름 설치 도중 uninstall이 실패할 수 있는 주요 원인

(1) 일부 리소스가 아직 Kubernetes API에 반영되지 않은 상태

  • helm install은 Helm chart를 렌더링하여 리소스를 생성하는 명령을 Kubernetes에 보낸 후 바로 종료합니다.
  • 하지만 Kubernetes 내부에서 실제 리소스가 생성되기까지는 약간의 지연이 존재합니다.
  • helm uninstall이 실행될 당시, Helm이 설치한 일부 리소스가 아직 생성되지 않았기 때문에, Helm은 삭제하려는 리소스를 찾지 못하고 internal error 또는 partial uninstall 상태에 빠질 수 있습니다.
  • 예: helm uninstall이 특정 deployment를 삭제하려고 시도했지만, 아직 해당 deployment가 실제로 존재하지 않음

 

(2) Hook 리소스 (pre-install, post-install)가 설치되기 전에 삭제됨

  • Helm chart에 post-install, pre-delete 같은 hook 리소스가 정의되어 있을 경우,
  • helm install 도중 hook이 실행되기 전에 uninstall을 하면, hook이 완전히 등록되지 않아서 uninstall 중 오류 발생 가능

예: hook이 실행되기 전, uninstall 시점에 hook 리소스를 삭제하려다 실패

annotations:
  "helm.sh/hook": post-install

 

(3) 일부 리소스가 생성되었으나 초기화되지 않아 finalizer에 의해 삭제 지연

  • helm install 도중 생성된 리소스가 finalizers를 가지고 있을 경우, helm uninstall 시 해당 리소스의 삭제가 Kubernetes에 의해 막힘
  • 대표적인 예: PVC, CRD 리소스, ValidatingWebhook, MutatingWebhook 등

 

(4) Helm release metadata 상태가 중간 상태 (pending-install)에 머무름

  • Helm은 설치 도중 릴리스 메타데이터를 Kubernetes Secret 또는 ConfigMap으로 저장합니다.
  • helm uninstall이 이 메타데이터의 상태를 보고 동작하는데, 상태가 pending-install이면 uninstall 자체가 거부되거나 무한 대기 상태에 빠질 수 있음

확인:

helm list --all --all-namespaces

 

→ 상태가 pending-install, pending-upgrade, pending-uninstall 등으로 남아 있을 수 있음

 

 

 

 

2. Helm 내부 처리 흐름 (간략 요약)

helm install:
1. 릴리스 메타데이터 생성 (secret)
2. 리소스 템플릿 렌더링
3. Kubernetes API 서버에 리소스 생성 요청
4. hooks 실행
5. 상태 업데이트

helm uninstall:
1. 릴리스 메타데이터 조회
2. 모든 리소스 목록을 추적
3. 리소스에 대한 삭제 요청
4. hook (pre-delete/post-delete) 실행
5. 릴리스 메타데이터 삭제

 

→ 이 중 2~3단계 중 충돌이 발생하면 uninstall 실패

 

3. 해결 및 회피 방법

(1) helm install 후 일정 시간 대기

helm install mychart ./mychart -n test-ns
sleep 5
helm uninstall mychart -n test-ns
  • 최소한의 리소스 생성/등록 시간이 필요

 

(2) --no-hooks 옵션 사용해 uninstall 수행

helm uninstall mychart -n test-ns --no-hooks
  • hook 리소스 삭제 충돌을 피할 수 있음

 

(3) stuck 된 경우 Helm release 강제 삭제

kubectl -n test-ns delete secret -l "owner=helm,name=mychart"

 

→ Helm이 관리하던 릴리스 메타데이터를 제거하여 상태를 초기화

 

(4) hook이나 finalizer 리소스 직접 삭제

kubectl get all -n test-ns -l "release=mychart"
kubectl patch <리소스> -p '{"metadata":{"finalizers":[]}}' --type=merge
kubectl delete <리소스> --force --grace-period=0

 

 

 

 

요약 정리

helm uninstall 수행 시, 일부 리소스가 삭제 되지 않고 남아 있는 현상을 요약하면 다음과 같습니다.

 

원인 설명 해결 방법
리소스 생성 중 API반영 전 uninstall 시도 리소스 생성 완료 후 uninstall
hook 충돌 post-install hook 등록 중 uninstall 시도 --no-hooks 옵션 사용
finalizer로 삭제 지연 리로스에 finalizer 설정 finalizer제거 후 강제 삭제
불완전한 release metadata Helm release 상태가 pending Helm secret 강제 삭제