가비지 컬렉션
가비지 컬렉션 (Garbage Collection)
가비지 컬렉션은 Kubernetes가 클러스터 리소스를 정리하는 데 사용하는 다양한 메커니즘을 통틀어 부르는 용어예요. 이 덕분에 다음과 같은 리소스를 정리할 수 있습니다:
- 종료된 Pod
- 완료된 Job
- owner 참조가 없는 객체
- 사용되지 않는 컨테이너와 컨테이너 이미지
- StorageClass 회수 정책이 Delete인 동적 프로비저닝된 PersistentVolume
- 오래됐거나 만료된 CertificateSigningRequest(CSR)
- 다음 시나리오에서 삭제된 노드:
- 클러스터가 클라우드 컨트롤러 매니저를 사용할 때 클라우드에서
- 클러스터가 클라우드 컨트롤러 매니저와 유사한 애드온을 사용할 때 온프레미스에서
- Node Lease 객체
소유자와 종속자 (Owners and dependents)
Kubernetes의 많은 객체는 owner 참조(owner references) 를 통해 서로 연결돼요. owner 참조는 컨트롤 플레인에 어떤 객체가 다른 객체에 종속적인지 알려줍니다. Kubernetes는 owner 참조를 사용해서 컨트롤 플레인과 다른 API 클라이언트가 객체를 삭제하기 전에 관련 리소스를 정리할 기회를 갖게 해줘요.
연쇄 삭제 (Cascading deletion)
백그라운드 연쇄 삭제 (Background cascading deletion)
백그라운드 연쇄 삭제에서 Kubernetes API 서버는 owner 객체를 즉시 삭제하고, 가비지 컬렉터 컨트롤러(커스텀이나 기본)가 백그라운드에서 종속 객체를 정리해요.
finalizer가 있으면 필요한 정리 작업이 모두 완료될 때까지 객체가 삭제되지 않도록 보장해요.
기본적으로 Kubernetes는 포그라운드 삭제를 직접 사용하거나 종속 객체를 고아(orphan)로 두지 않는 한 백그라운드 연쇄 삭제를 사용해요.
사용되지 않는 컨테이너와 이미지의 가비지 컬렉션
kubelet은 사용되지 않는 이미지에 대해 5분마다, 사용되지 않는 컨테이너에 대해 1분마다 가비지 컬렉션을 수행해요. 외부 가비지 컬렉션 도구는 kubelet 동작을 깨뜨리고 존재해야 하는 컨테이너를 제거할 수 있으므로 사용을 피해야 합니다.
사용되지 않는 컨테이너와 이미지 가비지 컬렉션 옵션을 구성하려면 구성 파일로 kubelet을 튜닝하고 KubeletConfiguration 리소스 타입을 사용해서 가비지 컬렉션과 관련된 파라미터를 변경하세요.
컨테이너 이미지 수명 주기
Kubernetes는 kubelet의 일부인 이미지 매니저(image manager) 를 통해, cadvisor와 협력해서 모든 이미지의 수명 주기를 관리해요. kubelet은 ...
HighThresholdPercentLowThresholdPercent
디스크 사용량이 구성된 HighThresholdPercent 값을 초과하면 가비지 컬렉션이 트리거되어, 마지막 사용 시각을 기준으로 가장 오래된 이미지부터 순서대로 삭제해요. kubelet은 디스크 사용량이 LowThresholdPercent 값에 도달할 때까지 이미지를 삭제합니다.
사용되지 않는 컨테이너 이미지에 대한 가비지 컬렉션
디스크 사용량과 무관하게 로컬 이미지가 사용되지 않은 채로 있을 수 있는 최대 시간을 지정할 수 있어요. 이는 각 노드에 대해 구성하는 kubelet 설정입니다. 이 설정을 구성하려면 kubelet 구성 파일에서 imageMaximumGCAge 필드에 값을 설정해야 합니다.
예를 들어 구성 필드를 12h45m으로 설정하면 12시간 45분을 의미해요.
참고:
이 기능은 kubelet 재시작을 거쳐 이미지 사용을 추적하지 않아요. kubelet이 재시작되면 추적된 이미지 사용 기간이 초기화되어, kubelet이 이미지 사용 기간 기준으로 가비지 컬렉션 대상이 되기까지 전체 imageMaximumGCAge 기간을 기다리게 됩니다.
컨테이너 가비지 컬렉션
kubelet은 정의할 수 있는 다음 변수에 따라 사용되지 않는 컨테이너를 가비지 컬렉션해요:
MinAge: kubelet이 컨테이너를 가비지 컬렉션할 수 있는 최소 사용 기간.0으로 설정하면 비활성화돼요.MaxPerPodContainer: 각 Pod가 가질 수 있는 죽은 컨테이너의 최대 개수.0보다 작게 설정하면 비활성화돼요.MaxContainers: 클러스터가 가질 수 있는 죽은 컨테이너의 총 최대 개수.
이 변수들 외에도 kubelet은 식별되지 않고 삭제된 컨테이너를 보통 가장 오래된 것부터 가비지 컬렉션해요.
MaxPerPodContainer와 MaxContainers는 잠재적으로 서로 충돌할 수 있어요. Pod당 최대 컨테이너 수(MaxPerPodContainer)를 유지하는 것이 전역 죽은 컨테이너 총 개수의 허용치(MaxContainers)를 벗어나는 상황이 생기기 때문이에요.
이 상황에서 kubelet은 MaxPerPodContainer를 조정해 충돌을 해결합니다. 최악의 경우 MaxPerPodContainer를 1로 낮추고 가장 오래된 컨테이너를 축출(evict)해요.
추가로, 삭제된 Pod가 소유한 컨테이너는 MinAge보다 오래되면 제거됩니다.
참고:
kubelet은 자신이 관리하는 컨테이너만 가비지 컬렉션해요.
가비지 컬렉션 구성하기 (Configuring garbage collection)
해당 리소스를 관리하는 컨트롤러별 옵션을 구성해서 리소스의 가비지 컬렉션을 튜닝할 수 있어요. 다음 페이지들은 가비지 컬렉션을 구성하는 방법을 보여줍니다:
- Kubernetes 객체의 연쇄 삭제 구성
- 완료된 Job의 정리 구성
다음으로 볼 것 (What's next)
- Kubernetes 객체의 소유권에 대해 더 배워보세요.
- Kubernetes finalizer에 대해 더 배워보세요.
- 완료된 Job을 정리하는 TTL 컨트롤러에 대해 배워보세요.