Kubernetes/삽질

[k8s] Error: rendered manifests contain a resource that already exists. Unable to continue with install: existing resource conflict 에러

비번변경 2022. 7. 11. 22:46

현상

관리하던 쿠버네티스 클러스터에는 리소스 모니터링을 위한 그라파나/프로메테우스가 kube-prometheus-stack helm chart로 설치되어 있다. 다만 persistence 설정 변경, ingress 설정 변경, 관리 용이성을 위한 helm-operator 적용 등을 위해 설치한 release를 삭제 후 재설치하고자 했다.

 

그러나 release 삭제 후 재설치하려고 했더니, 조금 더 정확히 따져서 다음과 같은 과정 후

helm delete <Release>
kubectl apply -f helmRelease.yaml
kubectl delete hr <helmRelease>

재설치 시 아래와 같은 에러가 발생하면서 설치에 실패했다.

Error: rendered manifests contain a resource that already exists. Unable to continue with install: existing resource conflict

리소스 충돌 에러

 

 

원인

에러 메세지를 보면 생성하려는 리소스가 이미 존재하기 때문에 리소스 충돌이 발생했음을 알 수 있다.

충돌한 리소스가 어떤 건지 확인하기 위해 아래의 get 명령을 사용했지만, 확인할 수 있는 리소스가 없었다.

kubectl get all --all-namespaces

아무래도 충돌 난 리소스가 chart가 배포한 CRD에 의한 리소스라서 확인이 안 되는 것 같다. 실제로 아래와 같이 리소스 종류로 get 명령을 실행하면 충돌 난 리소스가 실제로 존재하는 것을 확인할 수 있다.

충돌 리소스 확인

chart로 설치한 자원을 모두 삭제하면 해결이 될 것 같아 다음과 같이 시도했다.

 

 

시도 1. release 삭제

kube-promtheus-stack chart 공식 문서에서 안내하는 방법대로 release를 삭제한다.

 

1. release uninstall

helm uninstall [RELEASE_NAME]

 

2. CRD 삭제

kubectl delete crd alertmanagerconfigs.monitoring.coreos.com
kubectl delete crd alertmanagers.monitoring.coreos.com
kubectl delete crd podmonitors.monitoring.coreos.com
kubectl delete crd probes.monitoring.coreos.com
kubectl delete crd prometheuses.monitoring.coreos.com
kubectl delete crd prometheusrules.monitoring.coreos.com
kubectl delete crd servicemonitors.monitoring.coreos.com
kubectl delete crd thanosrulers.monitoring.coreos.com

 

3. release 삭제 확인

release가 정상적으로 삭제되었는지 확인한다.

helm list --uninstalled

helm list --uninstalling 

helm status <release>

3개 명령 모두 출력 결과가 없어야 한다.

헬름 릴리스 삭제 확인

 

 

시도 2. release 연관 리소스 삭제

release 삭제 후에도 문제가 발생하면 다음 명령으로 리소스를 삭제할 수 있다.

helm template <NAME> <CHART> --namespace <NAMESPACE> | kubectl delete -f - 

# 예시
helm template happy-panda prometheus-community/kube-prometheus-stack --namespace ctrl | kubectl delete -f -

릴리스 연관 리소스 삭제

 

 

시도 3. 충돌 리소스 수동 삭제

그럼에도 불구하고 남아있는 리소스는 수동으로 삭제한다. 충돌이 발생하는 리소스는 설치 시도 시 확인이 가능한데 helm install로 설치하든, kubectl apply를 이용하든 --dry-run 옵션을 사용해서 확인하는 것을 권한다.

내 경우에는 아래 정도의 리소스를 삭제했다.

kubectl delete clusterrole 
kubectl delete clusterrolebindings.rbac.authorization.k8s.io
kubectl delete service
kubectl delete podsecuritypolicies.policy

에러 메세지가 발생하지 않을 때까지 삭제하면 된다.

 

 

참고 문서

https://stackoverflow.com/questions/59443834/helm-3-install-for-resouces-that-exist

https://github.com/helm/helm/issues/7418