Intro
쿠버네티스 환경에서 Statefulset 애플리케이션을 사용하다 보면, PVC나 PV 리소스 또한 함께 사용하게 됩니다.
노드의 statefulset pod를 Drain 하거나, 테스트를 위해 자원을 여러 번 생성/삭제 하는 등 퍼시스턴트 볼륨을 삭제할 상황도 굉장히 많은데요.
특정 자원은 delete, force delete 를 사용해도 삭제되지 않는 케이스가 있습니다.
이런 케이스에서 아래 명령어로, 원하는 리소스를 삭제할 수 있습니다.
kubectl patch pv -n $PV_NAME -p '{"metadata": {"finalizers": null}}'--type merge
단순히 쿠버네티스의 지워지지 않는 리소스를 지우기 위해서라면, 이 커맨드만 사용하고 떠나셔도 되는데요.
그런데 저 명령어가 어떤 것이길래 지워지지 않던 리소스를 지울 수 있게 한건지 궁금하시다면, 해당 포스트를 끝까지 읽어주세요.
K8S Finalizers
K8S Finalizers는 리소스의 삭제 프로세스를 제어하기 위해 사용되는 메커니즘입니다. 리소스에 finalizer가 설정되면 해당 리소스를 삭제하기 전에 finalizer의 작업이 완료되어야 합니다. 이를 통해 리소스의 삭제를 안전하게 처리하고 관련된 리소스를 정리하는 등의 작업을 수행할 수 있다고 합니다. (공식 문서)
모든 리소스에 있는 것은 아니고, 애플리케이션의 특성에 따라 설정되어 있습니다. 대표적으로 PV 같은 자원에 아래와 같이 설정이 되어있는 것을 확인할 수 있습니다.
Name: test-common-pv-2
Labels: app.kubernetes.io/instance=test-cluster-test-common
type=local
Annotations: <none>
Finalizers: [kubernetes.io/pv-protection]
StorageClass: test-pv-2
Status: Bound
Claim: test/test-common--2
Reclaim Policy: Retain
Access Modes: RWO
VolumeMode: Filesystem
Capacity: 40Gi
Node Affinity: <none>
Message:
Source:
Type: HostPath (bare host directory volume)
Path: /home/deploy/test-volume
HostPathType: DirectoryOrCreate
Events: <none>
리소스의 description에서 볼 수 있듯이 키/값을 기반으로 작동하며, 내부적으로는 아래와 같이 동작합니다.
1) 사용자가 리소스 삭제 요청을 수행하면, 컨트롤러에서 해당 리소스에 deletionTimestamp 필드 추가.
2)컨트롤러는 deletionTimestamp가 선언된 리소스의 finalizer 를 충족하기위한 작업을 수행.
3) finalizer 조건이 충족되면, 컨트롤러는 finalizer의 값을 제거
4) finalizer 값이 없고, deletionTimestamp가 선언되어 있는 오브젝트는 클러스터에서 자동으로 삭제됨
* 결국, 제가 겪었던 상황은 argocd application의 finalizers 키값이 여전히 존재했기 때문에 발생했고, 위의 명령어 (finalizers를 null로 patch 해줌)를 통해 강제로 리소스를 삭제했던 케이스가 되겠네요.
Prestop은 finalizer를 기반으로 동작하나요?
finalizers가 어떤 것인지 알고 나니, pod의 종료 lifecycle과 관련된 prestop이 떠올랐습니다.
prestop 또한 pod가 종료되기 전의 조건을 부여한 후, 해당 조건을 충족하고 지워지는 방식이라 굉장히 비슷한 메커니즘으로 보이는데요.
때문에 prestop 가 내부적으로 finalizers를 기반으로 동작할 수 있겠다, 생각이 들었습니다.
GodGPT 와 여러 구글링을 통한 결과, 비슷하긴 하지만 직접적으로 관련이 있는 서비스는 아닌 것 같습니다.
굳이 따지자면 아래의 순서로 이루어지는 것 같습니다.
pod 리소스 삭제 요청 -> finalizer(가 있다면 수행) -> 실제 pod 삭제 처리 -> prestop에 의해 조건 충족 후 삭제
마치며
K8S Finalizers는 쿠버네티스를 운영하며 주로 신경쓰는 개념은 아니지만, 알고 있다면 리소스가 제거되지 않는 상황에서 확인해 볼 수 있는 요소 중 하나가 될 것 같습니다.
또한 리소스의 삭제 정책을 보다 안전하게 가져가는 등의 목적을 위해서 명시적으로 선언해 관리할 수도 있을 것 같습니다.
지금까지 K8S 리소스의 종료 메커니즘인 K8S Finalizers 개념 및 동작방식, 역할에 대해 알아보았습니다.
배워가며 작성하는 블로그입니다.
좋아요는 큰 힘이 됩니다.
피드백 및 의견 환영입니다 🙂
'데브옵스 > K8S' 카테고리의 다른 글
docker entrypoint 란 / k8s entrypoint 사용 ? (entrypoint 사용법) (0) | 2023.06.19 |
---|---|
[k8s network] nodelocaldns 란? (Nodelocal DNSCache) (0) | 2023.05.28 |
[k8s network] kube-proxy 란? kube-proxy 역할 (0) | 2023.05.23 |
[k8s network] coredns 란? core dns 작동 구조 및 config (0) | 2023.05.22 |
K8S Node 캐시된 컨테이너 이미지 정리 (kubelet) (0) | 2023.05.19 |