좀비 프로세스(Zombie process or Defunct process): 부모 프로세스가 자식 프로세스보다 먼저 종료되거나 (Orphan process) 부모 프로세스가 자식 프로세스의 종료 처리를 제대로 수행하지 못했을 경우
→ 프로세스는 정상적으로 종료된다면 Process table로부터 제거되어야 하지만, 종료된 프로세스가 Process table에 계속 남아있게 된다면 좀비 프로세스가 됨
→ Process table이 꽉 차게 된다면 시스템에서 추가적인 프로세스를 실행할 수 없게 됨
리눅스 커널에서는 고아 프로세스(Orphan process)의 부모를 PID가 1번인 프로세스(Init process)로 재할당
adopt
: PID가 1번인 프로세스(일반적으로 Init process가 사용되나 배포판별로 SysV init, upstart, systemd가 사용될 수 있음)는 고아 프로세스를 거두어 좀비 프로세스가 되지 않도록 예방하는 역할 수행
reaping
: Process table에서 제거되려면 부모 프로세스에서 wait
시스템콜을 호출해줘야 함
PID namespace sharing 옵션(--docker-disable-shared)이 Kubernetes 버전 1.7에서는 기본적으로 활성화되어 있었지만, 버전 1.8부터는 다시 기본 비활성화됨
이 옵션이 활성화된다면, pause 컨테이너의 프로세스가 PID 1번 프로세스로서 reaping을 담당함
비활성화된 경우, 직접 reaping을 담당하는 프로세스를 설정해야 함 → 컨테이너에서 실행할 수 있는 경량화된 Init 시스템의 등장: 컨테이너 환경에서 적절한 reaping과 함께 signal handling을 수행할 수 있는 PID 1번으로 사용 가능한 프로세스
pause 프로세스는 PID 1번이지만 SIGTERM을 받아도 같은 PID 네임스페이스의 자식 프로세스들에게 SIGTERM을 전파하지는 않음
terminationGracePeriodSeconds
유예 시간(기본 30초) 이후에도 컨테이너가 종료되지 않을 경우 SIGKILL로 강제 종료→ Kubernetes는 컨테이너를 Pod 단위로 관리하기 때문에 kubelet이 해당하는 Pod 내부의 컨테이너에게 SIGTERM을 보냄 (따라서 pause 컨테이너가 SIGTERM을 전파할 필요는 없음)
컨테이너에서 실행할 수 있는 경량화된 Init 시스템의 등장: 컨테이너 환경에서 적절한 reaping과 함께 signal handling을 수행할 수 있는 PID 1번으로 사용 가능한 프로세스