Docker, K8s

emptyDir은 파드와 같은 생애 주기를 가지는데, 저장된 데이터는 재시작되더라도 유지된다.

shuotudou 2025. 3. 5. 19:07

이해가 안됨

emptyDir은 파드와 같은 생애 주기를 갖는다. 해당 볼륨에 저장된 데이터는 파드가 재시작되더라도 유지된다.

-> 파드가 없어지면 데이터도 사라진다는건데, 파드가 재시작돼도 데이터가 유지된다는 것이 무슨 말이지?

 

 

확인한 내용

 

1. 파드 재시작

 

재시작 발생 시점: 파드 내 '컨테이너' 에 오류가 발생하거나, 라이프사이클 훅 (lifecycle hook) 에 의해 컨테이너를 다시 시작해야 할 때 발생합니다. 예를 들어, 컨테이너 내부 프로세스 강제 종료, OOM (Out Of Memory) 에러, Liveness Probe 실패 등이 재시작의 원인이 될 수 있습니다. 사용자가 수동으로 파드를 재시작 명령 (kubectl rollout restart deployment, kubectl delete pod --force --grace-period=0)을 내릴 수도 있습니다.

 

-> 밑줄 친 부분 추가 설명

ex) 예시 A, B

A. 앱 코드가 버그 때문에 예외를 처리하지 못하고, 프로세스가 '예기치 못한 오류' 로 인해 '강제로 종료 -> Liveness Probe 실패하는 경우

B. 특정 코드로 인해 앱의 메모리 누수 발생 -> 리눅스 커널의 OOM Killer 가 작동하여, 메모리를 과도하게 사용하는 로그 분석 컨테이너의 프로세스를 '강제로 종료'

 

영향 범위: '파드 자체는 삭제되지 않고 '그대로 유지' 됩니다. 재시작되는 것은 파드 안의 '컨테이너' 만 재시작됩니다. 파드의 IP 주소, UID, 이름, 네트워크 설정, 볼륨 마운트 정보 등 파드의 '정체성' 과 '기본 설정' 은 그대로 유지됩니다. 마치 컴퓨터를 껐다 켜는 것과 비슷하지만, 컴퓨터 본체는 그대로 있고 운영체제만 다시 시작하는 것입니다.

 

emptyDir 볼륨 영향: 파드가 재시작될 때, 파드에 속한 emptyDir 볼륨은 '그대로 유지' 됩니다. emptyDir 볼륨은 파드의 생명주기에 묶여 있지만, 파드 '재시작' 은 파드 '소멸' 이 아니기 때문에 emptyDir 볼륨은 삭제되지 않고, 컨테이너 재시작 후에도 '이전 상태 그대로' 유지됩니다.

 

 

2. 파드의 삭제

 

 

발생 시점: 디플로이먼트 (Deployment), 스테이트풀셋 (StatefulSet), 데몬셋 (DaemonSet) 과 같은 컨트롤러 (Controller) 에 의해 관리되는 파드의 경우, 컨트롤러 설정 변경, 롤링 업데이트 (Rolling Update), 롤백 (Rollback), 스케일링 (Scaling), 노드 장애 발생 시 파드가 삭제되고 '새로운 파드' 로 '대체' 될 수 있습니다. 사용자가 수동으로 파드를 삭제 (kubectl delete pod <pod-name>) 할 수도 있습니다.

 

영향 범위: '기존 파드는 완전히 삭제' 되고, '새로운 파드가 '새롭게' 생성' 됩니다. 새로운 파드는 이전 파드와는 완전히 다른 '새로운 개체' 입니다. 파드의 IP 주소, UID, 이름 (스테이트풀셋의 경우 제외), 네트워크 설정, 볼륨 마운트 정보 등이 모두 '새롭게' 할당될 수 있습니다. 마치 오래된 건물을 허물고 그 자리에 완전히 새로운 건물을 새로 짓는 것과 같습니다.

 

emptyDir 볼륨 영향: 파드가 삭제되고 '새로운 파드' 로 대체되는 경우, '기존 파드에 속했던 emptyDir 볼륨은 '함께 삭제' 됩니다.' emptyDir 볼륨은 파드의 생명주기에 묶여 있기 때문에, 파드가 소멸되면 emptyDir 도 더 이상 존재하지 않습니다. 새로운 파드가 생성되면, 새로운 파드를 위한 '새로운 emptyDir 볼륨이 '새롭게' 생성' 됩니다.