Kubernetes에서 네임스페이스 강제 삭제
Kubernetes 클러스터에 “Terminating” 상태에 멈춘 네임스페이스가 있나요? 네임스페이스가 이 상태에 멈추는 것은 일반적으로 Kubernetes가 해당 네임스페이스의 리소스를 정상적으로 정리하지 못했음을 의미합니다. 주된 이유는 파이널라이저나 리소스가 제대로 정리되지 않거나 멈춰 있기 때문입니다. 아래 예시를 참고하세요:
$ kubectl get ns
NAME STATUS AGE
calico-apiserver Active 4d13h
calico-system Active 4d13h
default Active 4d13h
kube-node-lease Active 4d13h
kube-public Active 4d13h
kube-system Active 4d13h
longhorn-system Terminating 18m
tigera-operator Active 4d13h파드와 다른 리소스가 삭제된 것은 확인했지만 상태는 여전히 Terminating으로 남아 있습니다. Kubernetes에서 이 네임스페이스를 강제로 삭제할 수 있는 몇 가지 방법을 고민해봅시다.
NS 변수에 멈춘 네임스페이스 이름을 설정하세요.
NS=longhorn-system네임스페이스 삭제를 강제로 진행하기 전에 문제를 일으킬 수 있는 대기 중인 리소스가 있는지 확인하세요:
kubectl get all --namespace=$NS1. 파이널라이저를 수동으로 해제하기
네임스페이스에 제대로 제거되지 않은 파이널라이저가 있는 경우, 해당 네임스페이스는 '종료 중(terminating)' 상태에 멈출 수 있습니다. 네임스페이스 객체 YAML 파일을 편집할 수 있습니다:
kubectl edit namespace $NS편집기에서 finalizers 필드를 찾은 후 아래와 같이 설정하여 삭제합니다:
finalizers: []2. kubectl을 사용하여 강제 삭제
첫 번째 옵션이 성공하지 않으면, 패치를 통해 네임스페이스 삭제를 강제로 수행할 수 있습니다.
쿠버네티스에서 멈춘 네임스페이스를 강제로 삭제하기.
kubectl get $NS -o json | jq '.spec.finalizers=[]' | kubectl replace --raw "/api/v1/ $NS/longhorn-system/finalize" -f -참고: JSON 출력을 수정하려면 jq가 설치되어 있어야 합니다. 이 방법은 파이널라이저를 우회한다는 점에 유의하세요.
3. 네임스페이스를 강제로 삭제하기
Kubernetes에서 --grace-period=0 및 --force 플래그를 사용하여 네임스페이스 삭제를 강제로 수행할 수 있습니다. 그러나 이 방법은 고아 리소스를 남길 수 있으므로 주의해서 사용해야 합니다:
kubectl delete namespace $NS --grace-period=0 --force다음 명령어를 실행하여 네임스페이스가 삭제되었는지 확인할 수 있습니다:
kubectl get $NS아래 출력은 그것이 존재하지 않음을 보여줍니다:
error: the server doesn't have a resource type "longhorn-system"