Gom3rye
팀 프로젝트) 모든 자원들을 삭제하는 shell script vs. argocd gui delete 본문
문제 상황: terraform으로 eks cluster를 구성하는데 이때 argocd로 관리하는 앱들이 살아있어서 loadbalancer를 사용 중이면 terraform destroy를 해도 사용중인 loadbalancer가 있다고 다 지워지지 않아서 수동으로 자원들을 삭제해줘야 한다.
-> 이러한 불편함을 해소하기 위해 자원들을 모두 삭제하는 자동화 delete-argocd.sh을 만들었는데 계속 pod들을 지우는 과정에서 무한 대기 중인 문제가 발생했다. 근데 argocd gui로 관리 중인 application delete 버튼을 누르면 시간이 조금 걸리긴 하지만 훨씬 빨리 모든 자원들이 안전하게 삭제된다.
이제 중요한건 WHY? 이에 대한 답을 찾으며 공부한 점을 정리해보려 한다.
Kubernetes는 선언형 시스템이라 “어떤 리소스를 지운다”는 요청만 API 서버에 전달할 뿐, 그 리소스가 진짜로 지워졌는지는 컨트롤러(Controller) 들이 비동기적으로 처리한다.
즉, 삭제 순서를 계산하는 로직은 만들어도, “삭제 완료 시점”은 컨트롤러 내부에 있어서 기다릴 수가 없다.
⚙️ 구체적인 문제 상황 3가지
| 문제 | 원인 | 왜 sh 스크립트가 막히는가 |
| 1️⃣ Pod Terminating 상태 | kubelet이 EBS/EFS 볼륨 detach 중 | 스크립트가 kubectl delete만 던지고 기다려야 하는데, detach는 수 초~수 분 랜덤 |
| 2️⃣ PVC → PV 종속성 | PVC가 Released 상태 되기 전까지 PV는 “in-use” | 스크립트가 PVC 삭제 명령을 내렸어도 아직 Controller가 PV 업데이트 중 |
| 3️⃣ Namespace Finalizer | ns 삭제 시 내부 리소스가 남아 있으면 finalizer 대기 | 네임스페이스 삭제 명령이 끝나도 실제로 리소스가 linger함 |
즉, “의존 관계는 계산할 수 있지만, 삭제 완료 타이밍은 보장할 수 없다.”
🧩 왜 ArgoCD는 가능한가?
ArgoCD는 내부적으로 다음을 함:
- 리소스 트리(Dependency Graph) 를 계산
(예: Deployment → ReplicaSet → Pod → PVC → PV) - 각 리소스의 상태를 watch
(Deleted, Terminating, Finalizing 상태까지 모니터링) - 완료될 때까지 순차적으로 API 호출
즉, 단순한 “명령어 실행”이 아니라 Controller-level의 이벤트 루프 기반 삭제를 수행한다.
→ 그래서 GUI에서 Delete 누르면 즉시 반응하는 것처럼 보인다.
🧠 그래서 sh 스크립트로는 완전 자동화가 “불완전”한 이유
| 단계 | 자동화 가능? | 이유 |
| Controller 삭제 | ✅ 가능 | 바로 삭제 요청하면 됨 |
| Pod 삭제 | ⚠️ 일부 가능 | detach 대기 필요 (랜덤 시간) |
| PVC/PV 삭제 | ⚠️ 불안정 | finalizer 남을 수 있음 |
| Namespace 삭제 | ❌ 불완전 | 내부 리소스가 남으면 stuck |
| CRD 삭제 | ❌ 위험 | Terraform addon과 충돌 가능 |
즉, “명령 순서는 완벽히 자동화 가능하지만, 삭제 완료까지는 대기 불가능”
(그건 kubectl이 아니라 controller-runtime 수준에서 해야 가능하다.)
🧭 정확한 삭제 순서 (확실한 정리)
1️⃣ ArgoCD Application
→ 재생성 루프 방지
kubectl delete applications --all -n argocd
2️⃣ Controller (Deployment/StatefulSet/DaemonSet)
→ 상위 컨트롤러 먼저 제거
kubectl delete deployment,statefulset,daemonset --all --all-namespaces
3️⃣ Pod
→ kubelet detach 기다림
kubectl delete pod --all --all-namespaces --grace-period=0 --force
4️⃣ PVC → PV
→ 볼륨 종속 해제 순서
kubectl delete pvc --all --all-namespaces kubectl delete pv --all
5️⃣ Service / ConfigMap / Secret
→ 네임스페이스 내 잔여 리소스 정리
kubectl delete svc,configmap,secret --all --all-namespaces
6️⃣ Namespace
→ 모든 리소스가 사라진 후 마지막에
kubectl delete ns efkstack prometheus system service argocd
✅ 결론 요약
❌ Shell 스크립트는 삭제 “순서”는 자동화할 수 있어도
⏳ 삭제 “완료 시점”은 비동기이기 때문에 완벽히 자동화할 수 없다.✅ 대신 ArgoCD는 Dependency Graph와 Event Watcher를 사용해서
의존 관계와 완료 타이밍까지 계산하기 때문에 훨씬 안정적으로 삭제된다.
'현대 오토에버 클라우드 스쿨' 카테고리의 다른 글
| 팀 프로젝트) Grafana, Prometheus를 웹으로 접근할 때 포트 붙이는 여부 (0) | 2025.10.29 |
|---|---|
| 팀 프로젝트) EBS 권한 문제 - Prometheus, Kafka, ElasticSearch 차이 (0) | 2025.10.29 |
| 팀 프로젝트) EKS 기반 3클러스터 아키텍처 설계 (0) | 2025.10.28 |
| 팀 프로젝트) on-premise 에서 aws 로 이전 (0) | 2025.10.28 |
| 개인 프로젝트) CQRS Todo App CI/CD 프로젝트 with Kafka, Jenkins (0) | 2025.10.20 |