본문 바로가기
DevOps

쿠버네티스 네임스페이스 삭제 안될 때 해결하기 (Terminating long time)

by 흑시바 2024. 3. 24.

특정 네임스페이스에 해당하는 모든 쿠버네티스 리소스를 한 번에 삭제하고 싶어서 네임 스페이스 삭제 명령어를 입력했음에도 계속해서 Terminating 상태에서 변경되지 않는 경우가 있다. 이런 경우 어떻게 해결해야 할까?

 

아래 이미지처럼 네임스페이스가 계속해서 삭제되지 않는다.

 

1. 원인 파악하기

해당 네임스페이스를 describe를 통해 확인한다.

 

kubectl describe namespaces [네임스페이스 명]

 

명령어 호출 후 출력된 내용에 SomeResourcesRemain / SomeFinalizersRemain 등의 Reason과 Message에 어떤 리소스가 남아 있는지 확인할 수 있다.

 

메시지 내용을 자세히 살펴보자.

 

Some resources are remaining: 

 

cephblockpools.ceph.rook.io has 1 resource instances,

cephclusters.ceph.rook.io has 1 resource instances,

cephfilesystems.ceph.rook.io has 1 resource instances,

cephfilesystemsubvolumegroups.ceph.rook.io has 1 resource instances,

cephobjectstores.ceph.rook.io has 1 resource instances, 

configmaps. has 1 resource instances,

secrets. has 1 resource instances

 

메시지는 루크셰프에서 생성하는 여러 CRD를 포함해서 configmaps, secrets이 남아있다고 알려주고 있다.

 

kubectl ap-resources를 활용해서도 해당 네임스페이스에 남아있는 리소스 목록 확인이 가능하다.

 

kubectl api-resources --verbs=list --namespaced -o name \
  | xargs -n 1 kubectl get --show-kind --ignore-not-found -n [네임스페이스 명]

2. edit 명령어를 이용해서 내용을 수정하기

남아있는 리소스 목록을 확인했으니, 이제 edit 명령어를 통해 직접 수정해서 삭제하면 된다.

 

kubectl edit -n rook-ceph cephblockpools.ceph.rook.io ceph-blockpool

 

해당 명령어를 입력하면 아래와 같이 CRD에 대한 정보를 확인 및 수정이 가능하다.

 

내용을 보니 finalizers 이 설정되어 있어서 삭제가 안 됐다는 것을 확인할 수 있다.

 

쿠버네티스에서 finalizer는 쿠버네티스 리소스가 삭제될 때 정리(clean-up) 작업을 수행하기 위한 메커니즘이다. 리소스를 삭제할 때 즉시 삭제되지 않고, finalizer가 지정된 작업들이 완료될 때까지 삭제 프로세스가 보류된다.

 

Finalizer는 리소스의 metadata 필드 내에 finalizers 배열로 지정된다. 이 배열에는 리소스를 안전하게 삭제하기 전에 실행해야 하는 작업을 식별하는 문자열이 포함된다.

 

finalizers 부분을 없앤 뒤 저장한다. 그리고 다시 describe 명령어를 확인해서 Message 부분을 확인해 보면 편집한 리소스가 Remain 목록에서 사라진 것을 확인할 수 있다.

 

이렇게 삭제되지 않은 리소스에서 일일이 finalizers 부분을 편집해 주면 네임스페이스가 정삭적으로 삭제된다.

3. 명령어로 삭제하기

하기 명령어는 configmap의 finalizers를 비우는 방법이다.

 

kubectl -n rook-ceph patch configmap [리소스 이름] --type merge -p '{"metadata":{"finalizers": []}}'

 

finalizer가 걸려있는 리소스가 너무 많은 경우에 모두 편집기를 열어서 삭제하기에는 굉장히 번거롭다.

이럴 때는 kubectl patch 명령어를 활용해서 삭제하는 방법을 사용하도록 하자.

4. 문서 찾아보기

오픈 소스에는 삭제하는 방법(CleanUp)에 대해서 문서화해 놓으니, 만약 오픈 소스를 사용했을 때는 수기로 무작정 삭제하기보다는 문서를 참고해서 삭제하도록 하자. 

REFERENCE

https://rook.io/docs/rook/latest-release/Getting-Started/ceph-teardown/

댓글