공부/Kubernetes

Kubernetes namespace가 terminating에 멈춰서 안 지워질 때

토고미 2021. 3. 13. 00:06

쿠버네티스를 사용하다보면 네임스페이스를 날려야할 때가 많다.

그러면 꼭 terminating 상태에서 멈춰서 안 지워지는 현상이 발생하곤 한다.

 

이 현상을 구글링 하면 finalizer 제거를 통해 네임스페이스를 강제 삭제하는 방법이 나오지만

바람직한 방법은 아니다.

 

애초에 네임스페이스가 terminating에서 멈춰 있는 이유는,

잔존하는 리소스들이 해당 네임스페이스에 남아있기 때문이다.

그 잔존 리소스들 또한 terminating에 멈춰 있을 가능성이 높은데,

보통의 경우에 이는 삭제 순서가 꼬였을 때 발생한다.

 

따라서, 그 잔존 리소스들을 다 지워주기만 한다면 정상적으로 지워질 것이다.

 

파악하는 방법은 아래 커맨드를 이용하면 된다.

$ kubectl get namespace {네임스페이스 이름} -o yaml

그러면 맨 아랫부분에 아래와 같이 나올 것이다.

잘 보면 message: 'Some resources are remaining: secrets. has 1 resource instances' 라고 나와있다.

즉, 이 상황의 경우에는 secret이 지워지지 않는다는 것이므로 지워주면 된다.

 

사실 원래 네임스페이스를 지우면 하위 리소스도 자동으로 지워지는 게 맞지만, 리소스 삭제 순서가 꼬여서 finalizer에 의해 안지워지는 경우가 있다.

위를 예시로 들면,

$ kubectl edit secret {시크릿 이름} -n {네임스페이스 이름}

빨간색으로 표시한 finalizer 부분을 지워주면 secret이 삭제되고, 그 후에 네임스페이스도 자동적으로 삭제될 것이다.

 

위는 예시였고, 대부분의 상황에서는 아래 리소스들만 확인해서 지우면 거의 해결된다.

1. CustomResource (CRD에 의해 만들어진 CR)

2. Deployment, Statefulset, Daemonset, ReplicaSet

3. pvc

4. apiservice

 

이제 차례대로 지워보자.

 

먼저 해당 네임스페이스에 CR이 있다면 조회해서 지우자

$ kubectl get {custom-resouce} -n stuck-ns

 

Pod와 관련된 리소스들을 조회해서 전부 지우자

$ kubectl get deployment -n stuck-ns
$ kubectl get statefulset -n stuck-ns
$ kubectl get daemonset -n stuck-ns
$ kubectl get replicaset -n stuck-ns

 

그 pod들에 묶여있던 pvc도 제거 해주자.

$ kubectl get pvc -n stuck-ns

 

사실 귀찮으면 아래 명령어를 치면 해당 네임스페이스 내의 모든 리소스가 나온다.

$ kubectl get all -n stuck-ns

 

마지막으로 apiservice를 조회하자.

$ kubectl get apiservice

상태가 정상이 아닌 apiservice가 있다면 지운다.

 

제대로 모든 하위 리소스를 다 삭제했다면

다시 삭제 명령을 하지 않아도 1~2분내로 자동적으로 지워질 것이다.

혹시나 하면 아래 명령어를 또 날리자.

$ kubectl delete ns stuck-ns

제대로 다 깔끔하게 지웠다면 성공할 것이다! (시간이 조금 걸릴수도 있다.)

만약 그래도 안 지워진다면, 해당 네임스페이스에서 생성한 리소스를 찾아다니면서 다 지워주면 된다.

 

 

아무리 해도 안 지워진다면 최후의 방법으로 finalizer를 지워서 강제 삭제하자.

$ kubectl get namespace "stucked-namespace" -o json \
  | tr -d "\n" | sed "s/\"finalizers\": \[[^]]\+\]/\"finalizers\": []/" \
  | kubectl replace --raw /api/v1/namespaces/"stucked-namespace"/finalize -f -

위에서 "stucked-namespace"를 안 지워지고있는 네임스페이스 이름으로 바꿔 넣으면 된다.

하지만 이렇게 지우면 추후에 같은 이름의 네임스페이스를 만들었을 때, 지우지 못했던 리소스들이 남아있어 영향을 받을 수 있다.