Kubernetes를 사용하다 보면 가끔 네임스페이스가 Terminating 상태에서 멈추는 경우가 발생할 수 있습니다. 이러한 현상은 Kubernetes의 Finalizer로 인해 발생하는 경우가 많습니다. 이번 포스트에서는 Finalizer가 무엇인지, 왜 존재하는지, 그리고 이를 안전하게 삭제하는 방법에 대해 알아보겠습니다.
1. Finalizer란 무엇인가?
Finalizer는 Kubernetes에서 리소스가 삭제되기 전에 실행되어야 하는 작업을 정의한 메커니즘입니다. Finalizer는 리소스가 완전히 삭제되기 전에 특정 작업을 완료하기 위해 존재합니다. 예를 들어, 네임스페이스나 PVC(Persistent Volume Claim)와 같은 리소스가 삭제될 때 관련 리소스나 데이터를 안전하게 정리하거나 외부 시스템에 후처리를 요청하는 작업이 있을 수 있습니다.
2. Finalizer가 왜 존재하는가?
Kubernetes에서 Finalizer는 리소스의 무결성을 유지하기 위해 사용됩니다. 이를 통해 특정 리소스가 삭제되기 전에 추가 작업(예: 외부 리소스 정리, 데이터 백업)이 완료될 수 있도록 보장합니다. Finalizer가 추가된 리소스는 지정된 작업이 완료될 때까지 삭제되지 않고 Terminating 상태로 유지됩니다.
3. Finalizer로 인해 네임스페이스가 Terminating 상태에서 멈추는 이유는?
가끔 Finalizer가 제대로 실행되지 않거나, 특정 작업이 완료되지 않는 경우, 네임스페이스가 계속 Terminating 상태로 남아 있을 수 있습니다. 이는 다양한 원인으로 발생할 수 있습니다.
- 리소스가 의존하고 있는 외부 시스템의 문제
- Finalizer가 의도한 대로 동작하지 않는 경우
- 시스템 내에서 관련 작업이 올바르게 트리거되지 않았을 때
이로 인해 네임스페이스 삭제가 무기한 지연될 수 있으며, 이를 해결하기 위해서는 수동으로 Finalizer를 제거해줘야 합니다.
4. Finalizer를 수동으로 삭제하는 방법
Finalizer가 네임스페이스의 삭제를 막고 있는 경우, 이를 수동으로 삭제할 수 있습니다. 다음은 Finalizer를 삭제하고 네임스페이스가 정상적으로 삭제되도록 하는 방법입니다.
Finalizer 제거 스크립트 예시
아래는 Kubernetes에서 Terminating 상태의 네임스페이스 목록을 가져와서 Finalizer를 수동으로 삭제하는 스크립트입니다. 이 스크립트를 실행하면 Finalizer를 제거하여 네임스페이스를 성공적으로 삭제할 수 있습니다.
#!/bin/bash
# Terminating 상태의 네임스페이스 목록 가져오기
terminating_namespaces=$(kubectl get namespaces --field-selector=status.phase=Terminating -o jsonpath='{.items[*].metadata.name}')
# Terminating 상태의 네임스페이스가 없으면 종료
if [ -z "$terminating_namespaces" ]; then
echo "No terminating namespaces found."
exit 0
fi
# 각 네임스페이스의 파이널라이저 제거
for namespace in $terminating_namespaces; do
echo "Removing finalizers from namespace: $namespace"
kubectl get namespace $namespace -o json | jq '.spec.finalizers=[]' | kubectl replace --raw "/api/v1/namespaces/$namespace/finalize" -f -
done
echo "Finalizers removed from terminating namespaces."
이 스크립트는 다음과 같은 절차로 동작합니다:
- 현재 Terminating 상태에 있는 네임스페이스 목록을 가져옵니다.
- 각 네임스페이스의 Finalizer를 제거하여 네임스페이스 삭제를 완료합니다.
- 마지막으로 Finalizer가 성공적으로 제거되었는지 확인하고 로그를 출력합니다.
직접 명령어로 Finalizer 삭제하기
스크립트를 사용하지 않고도 수동으로 Finalizer를 제거할 수 있습니다. 아래 명령어는 특정 네임스페이스에서 Finalizer를 삭제하는 방법을 보여줍니다.
kubectl get namespace <namespace-name> -o json | jq '.spec.finalizers=[]' | kubectl replace --raw "/api/v1/namespaces/<namespace-name>/finalize" -f -
이 명령어는 특정 네임스페이스의 JSON 객체를 받아 spec.finalizers 필드를 빈 배열로 설정한 뒤, 이를 Kubernetes API 서버에 적용하여 Finalizer를 제거하는 방법입니다.
5. Finalizer를 삭제할 때 주의할 점
Finalizer는 리소스 삭제 시 중요한 작업을 담당할 수 있으므로, 이를 삭제하기 전에 해당 작업이 불필요한지 신중하게 확인해야 합니다. 예를 들어, 중요한 데이터를 삭제하거나, 외부 서비스와 연동된 리소스를 정리해야 하는 경우 Finalizer는 반드시 실행되어야 합니다. 만약 Finalizer를 무작정 제거한다면, 데이터 손실이나 시스템 무결성 문제가 발생할 수 있습니다.
따라서, 네임스페이스의 Finalizer를 제거하기 전에 그 목적과 관련 작업을 반드시 확인하고, 안전하게 처리할 수 있는 상황에서만 이를 삭제하는 것이 좋습니다.
결론
Kubernetes에서 네임스페이스가 Terminating 상태에 멈추는 것은 종종 Finalizer와 관련된 문제일 수 있습니다. Finalizer는 리소스가 완전히 삭제되기 전에 중요한 작업을 완료할 수 있도록 보장하지만, 때로는 이 과정에서 오류가 발생하여 리소스가 삭제되지 않는 상황이 발생할 수 있습니다. 이 경우, 위에서 설명한 방법을 통해 Finalizer를 수동으로 삭제하고 문제를 해결할 수 있습니다.
이 방법을 활용하여 네임스페이스 삭제 문제를 해결하시길 바랍니다!