안녕하세요~
요즘 집이나 회사나 처리할 일이 많아서ㅜㅜ 짬이 통 나질 않네요..
금요일 오후 늦게부터는 시간이 좀 되니까 Multi-AZ 환경에서의 statefulset 배포시 주의점이나
아니면 Rancher 연동으로 꼭! 찾아오겠습니다.
짧게라도 ... Kubernetes에서 kubectl delete ns ${NAME} 이런식으로 namespace를 삭제하실 때
행이 걸리고 namespace는 삭제되지 않은 채 kubectl get ns ${NAME} 이런식으로 확인해 보면
terminating 상태로 계속 대기중인 경우가 종종 있습니다.
이 경우 finalizer를 비워 주시면 되는데요, finalizer를 비워주시는 방법은
API를 이용한 방법이 아래에 소개드릴 방법보다 더 정석이라고 생각해서 먼저 소개 드립니다.
API를 이용한 방법
kubectl proxy # 클러스터를 로컬에 띄워둔 것 처럼 127.0.0.1:8001로 접근하실 수 있게 됩니다.
# 이때 터미널 하나 더 열어서 하시든가 연속으로 실행하시든가 편하신 방법으로...ㅎㅎ
# jq는 jq가 설치되어 있어야 합니다. json을 파싱할 때 사용합니다.
# namespace의 spec에 finalizers 라는 부분이 있는데, 삭제되지 않고 있는 namespace에는
# finalizers 안에 어떤 값이 들어 있을 건데요, 그 부분을 대체해서 replace.json 으로 생성합니다.
kubectl get namespace $NAMESPACE -o json |jq '.spec = {"finalizers":[]}' > replace.json
# api를 이용하여(proxy가 설정되어 있으니 127.0.0.1:8001이 되겠지요? 요 포트는 디폴트값입니다.
# replace.json의 값을 이용하여 api를 호출해서 finalizers: []를 수행합니다.
curl -k -H "Content-Type: application/json" -X PUT --data-binary @replace.json \
http://127.0.0.1:8001/api/v1/namespaces/$NAMESPACE/finalize
이렇게 하면 삭제가 잘 되어야 하는데요, 그래도 안 되는 경우가 있습니다.
kubectl edit 을 이용해 강제로 날려버리기
kubectl edit ns ${namespace}
위의 방법으로 되지 않았다면 요런 식으로 namespace edit에 들어가서
spec 아래의 finalizers 값을 날리고, [] (비어 있음) 으로 변경하고, 저장하여 변경점을 적용합니다.
그러면 정말 namespace가 삭제되는 것을 보실 수 있습니다..

한 가지 주의하실 점은, namespace를 강제로 지우는 것 자체가 정상적인 상황은 아니라는 것을 알고 계셔야 합니다
저는 리소스가 없는 빈 namespace를 지우는데도 삭제했던 리소스의 인증 관련된 것 중 하나가
finalizer에 남아 있었던 경우였고, 강제로 지우든 말든 영향이 없다는 것을 인지한 상태에서 삭제를 진행하였는데요.
namespace가 삭제되지 않고 행이 걸리게 된 데에는 분명 어떤 이유가 있었을 것이므로,
이를 인지하고, 문제의 원인을 찾아서 해결하는 것이 역시 가장 좋은 방법일 것입니다~!
그럼 즐거운 쿠베 생활 되세요~