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

목 차
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 강제 삭제 |
'쿠버네티스' 카테고리의 다른 글
| Kubernetes Multi Cluster (0) | 2025.03.24 |
|---|---|
| curl: (35) OpenSSL SSL_connect: Connection reset by peer (0) | 2025.03.22 |
| helm Chart로 생성한 object 수동 삭제하기 (0) | 2025.03.15 |
| PV, PVC, StorageClass 실습 (0) | 2025.03.13 |
| Storage 3대장 이해하기 (4/4) - Object Storage (0) | 2025.03.07 |