|
| 1 | +--- |
| 2 | +title: 가비지(Garbage) 수집 |
| 3 | +content_type: concept |
| 4 | +weight: 50 |
| 5 | +--- |
| 6 | + |
| 7 | +<!-- overview --> |
| 8 | +{{<glossary_definition term_id="garbage-collection" length="short">}} |
| 9 | +다음과 같은 리소스를 정리한다: |
| 10 | + |
| 11 | + * [실패한 파드](/ko/docs/concepts/workloads/pods/pod-lifecycle/#pod-garbage-collection) |
| 12 | + * [종료된 잡](/ko/docs/concepts/workloads/controllers/ttlafterfinished/) |
| 13 | + * [소유자 참조가 없는 오브젝트](#owners-dependents) |
| 14 | + * [사용되지 않는 컨테이너와 컨테이너 이미지](#containers-images) |
| 15 | + * [반환 정책이 삭제인 스토리지클래스에 의해 동적으로 생성된 퍼시스턴트볼륨](/ko/docs/concepts/storage/persistent-volumes/#delete) |
| 16 | + * [Stale 또는 만료된 CertificateSigningRequests (CSRs)](/docs/reference/access-authn-authz/certificate-signing-requests/#request-signing-process) <!-- en 글에서부터 링크가 깨져있어 /docs를 따로 추가--> |
| 17 | + * {{<glossary_tooltip text="노드" term_id="node">}} 는 다음과 같은 상황에서 삭제된다: |
| 18 | + * 클러스터가 [클라우드 컨트롤러 매니저](/ko/docs/concepts/architecture/cloud-controller/)를 사용하는 클라우드 |
| 19 | + * 클러스터가 클라우드 컨트롤러 매니저와 유사한 애드온을 사용하는 온프레미스 |
| 20 | + * [노드 리스(Lease) 오브젝트](/ko/docs/concepts/architecture/nodes/#heartbeats) |
| 21 | + |
| 22 | +## 소유자(Owners)와 종속(dependents) {#owners-dependents} |
| 23 | + |
| 24 | +쿠버네티스의 많은 오브젝트는 [*owner references*](/docs/concepts/overview/working-with-objects/owners-dependents/)를 통해 서로 연결되어 있다. |
| 25 | + |
| 26 | +소유자 참조(Owner references)는 컨트롤 플레인에게 어떤 오브젝트가 서로 종속적인지를 알려준다. |
| 27 | +쿠버네티스는 소유자 참조를 사용하여 컨트롤 플레인과 다른 API 클라이언트에게 오브젝트를 삭제하기 전 관련 리소스를 정리하는 기회를 제공한다. 대부분의 경우, 쿠버네티스는 소유자 참조를 자동으로 관리한다. |
| 28 | + |
| 29 | +소유권(Ownership)은 일부 리소스가 사용하는 [레이블과 셀렉터](/ko/docs/concepts/overview/working-with-objects/labels/) |
| 30 | +메커니즘과는 다르다. 예를 들어, |
| 31 | +`EndpointSlice` 오브젝트를 생성하는 {{<glossary_tooltip text="서비스" term_id="service">}}를 |
| 32 | +생각해보자. 서비스는 *레이블*을 사용해 컨트롤 플레인이 |
| 33 | +어떤 `EndpointSlice` 오브젝트가 해당 서비스에 의해 사용되는지 판단하는 데 도움을 준다. 레이블과 더불어, |
| 34 | +서비스를 대신해 관리되는 각 `EndpointSlice` 오브젝트는 |
| 35 | +소유자 참조를 가진다. 소유자 참조는 쿠버네티스의 다른 부분이 제어하지 않는 |
| 36 | +오브젝트를 방해하는 것을 방지하는 데 도움을 준다. |
| 37 | + |
| 38 | + |
| 39 | +{{< note >}} |
| 40 | +교차 네임스페이스(cross-namespace)의 소유자 참조는 디자인상 허용되지 않는다. |
| 41 | +네임스페이스 종속 오브젝트는 클러스터 범위 또는 네임스페이스 소유자를 지정할 수 있다. |
| 42 | +네임스페이스 소유자는 **반드시** 종속 오브젝트와 동일한 네임스페이스에 존재해야 한다. |
| 43 | +그렇지 않다면, 소유자 참조는 없는 것으로 간주되어, 종속 오브젝트는 |
| 44 | +모든 소유자가 없는 것으로 확인되면 삭제될 수 있다. |
| 45 | + |
| 46 | +클러스터 범위의 종속 오브젝트는 클러스터 범위의 소유자만 지정할 수 있다. |
| 47 | +v1.20 이상에서, 클러스터 범위의 종속 오브젝트가 네임스페이스 종류를 소유자로 지정하면, |
| 48 | +확인할 수 없는 소유자 참조가 있는 것으로 간주되어 가비지 수집이 될 수 없다. |
| 49 | + |
| 50 | +v1.20 이상에서, 가비지 수집기가 잘못된 교차 네임스페이스 `ownerReference` |
| 51 | +또는 네임스페이스 종류를 참조하는 `ownerReference`가 있는 클러스터 범위의 종속 항목을 감지하면, |
| 52 | +`OwnerRefInvalidNamespace`가 원인인 경고 이벤트와 유효하지 않은 종속 항목의 `involvedObject`가 보고된다. |
| 53 | +`kubectl get events -A --field-selector=reason=OwnerRefInvalidNamespace` |
| 54 | +를 실행하여 이러한 종류의 이벤트를 확인할 수 있다. |
| 55 | +{{< /note >}} |
| 56 | + |
| 57 | +## 캐스케이딩(Cascading) 삭제 {#cascading-deletion} |
| 58 | + |
| 59 | +쿠버네티스는 오브젝트를 삭제할 때 더 이상 소유자 참조가 없는지, |
| 60 | +예를 들어 레플리카셋을 삭제할 때, 남겨진 파드가 없는지 확인하고 삭제한다. |
| 61 | +오브젝트를 삭제할 때 쿠버네티스가 오브젝트의 종속 오브젝트들을 자동으로 삭제할 지 여부를 제어할 수 있다. |
| 62 | +이 과정을 `캐스케이딩 삭제`라고 한다. |
| 63 | +캐스케이딩 삭제에는 다음과 같은 두 가지 종류가 있다. |
| 64 | + |
| 65 | + * 포그라운드 캐스케이딩 삭제(Foreground cascading deletion) |
| 66 | + * 백그라운드 캐스케이딩 삭제(Background cascading deletion) |
| 67 | + |
| 68 | +또한 쿠버네티스의 {{<glossary_tooltip text="finalizers" term_id="finalizer">}}를 사용하여 가비지 수집이 소유자 참조가 있는 자원을 언제 어떻게 삭제할 것인지 제어할 수 있다. |
| 69 | + |
| 70 | +### 포그라운드 캐스케이딩 삭제 {#foreground-deletion} |
| 71 | + |
| 72 | +포그라운드 캐스케이딩 삭제에서는 삭제하려는 소유자 오브젝트가 먼저 |
| 73 | +*삭제 중* 상태가 된다. 이 상태에서는 소유자 오브젝트에게 다음과 같은 일이 |
| 74 | +일어난다: |
| 75 | + |
| 76 | + * 쿠버네티스 API 서버가 오브젝트의 `metadata.deletionTimestamp` 필드를 |
| 77 | + 오브젝트가 삭제 표시된 시간으로 설정한다. |
| 78 | + * 쿠버네티스 API 서버가 `metadata.finalizers` 필드를 `foregroundDeletion`로 |
| 79 | + 설정한다. |
| 80 | + * 오브젝트는 삭제 과정이 완료되기 전까지 쿠버네티스 API를 통해 조회할 수 있다. |
| 81 | + |
| 82 | +소유자 오브젝트가 삭제 중 상태가 된 이후, 컨트롤러는 종속 오브젝트들을 삭제한다. |
| 83 | +모든 종속 오브젝트들이 삭제되고나면, 컨트롤러가 소유자 오브젝트를 삭제한다. |
| 84 | +이 시점에서 오브젝트는 더 이상 쿠버네티스 API를 통해 조회할 수 없다. |
| 85 | + |
| 86 | +포그라운드 캐스케이딩 삭제 중에 소유자 오브젝트의 삭제를 막는 |
| 87 | +종속 오브젝트는`ownerReference.blockOwnerDeletion=true`필드를 가진 오브젝트다. |
| 88 | +더 자세한 내용은 [Use foreground cascading deletion](/docs/tasks/administer-cluster/use-cascading-deletion/#use-foreground-cascading-deletion)를 |
| 89 | +참고한다. |
| 90 | + |
| 91 | +### 백그라운드 캐스케이딩 삭제 {#background-deletion} |
| 92 | + |
| 93 | +백그라운드 캐스케이딩 삭제에서는 쿠버네티스 API 서버가 소유자 오브젝트를 즉시 삭제하고 |
| 94 | +백그라운드에서 컨트롤러가 종속 오브젝트들을 삭제한다. |
| 95 | +쿠버네티스는 수동으로 포그라운드 삭제를 사용하거나 종속 오브젝트를 분리하지 않는다면, 기본적으로 백그라운드 캐스케이딩 삭제를 사용한다. |
| 96 | + |
| 97 | +더 자세한 내용은 [Use background cascading deletion](/docs/tasks/administer-cluster/use-cascading-deletion/#use-background-cascading-deletion)를 |
| 98 | +참고한다. |
| 99 | + |
| 100 | +### 분리된 종속 (Orphaned dependents) |
| 101 | + |
| 102 | +쿠버네티스가 소유자 오브젝트를 삭제할 때, 남은 종속 오브젝트는 *분리된* 오브젝트라고 부른다. |
| 103 | +기본적으로 쿠버네티스는 종속 오브젝트를 삭제한다. |
| 104 | +이 행동을 오버라이드하는 방법을 보려면, |
| 105 | +다음 [Delete owner objects and orphan dependents](/docs/tasks/administer-cluster/use-cascading-deletion/#set-orphan-deletion-policy)를 참고한다. |
| 106 | + |
| 107 | +## 사용되지 않는 컨테이너와 이미지 가비지 수집 {#containers-images} |
| 108 | + |
| 109 | +{{<glossary_tooltip text="kubelet" term_id="kubelet">}}은 |
| 110 | +사용되지 않는 이미지에 대한 가비지 수집을 5분마다, 컨테이너에 대한 가비지 수집을 1분마다 |
| 111 | +수행한다. 외부 가비지 수집 도구는 Kubelet 의 행동을 중단시키고 |
| 112 | +존재해야만 하는 컨테이너를 삭제할 수 있으므로 사용을 피해야 한다. |
| 113 | + |
| 114 | +사용되지 않는 컨테이너와 이미지에 대한 가비지 수집 옵션을 구성하려면, |
| 115 | +[configuration file](/docs/tasks/administer-cluster/kubelet-config-file/) 사용하여 Kubelet 을 수정하거나 |
| 116 | +[`KubeletConfiguration`](/docs/reference/config-api/kubelet-config.v1beta1/#kubelet-config-k8s-io-v1beta1-KubeletConfiguration) 리소스 타입의 |
| 117 | +가비지 수집과 관련된 파라미터를 수정한다. |
| 118 | + |
| 119 | +### 컨테이너 이미지 라이프사이클 |
| 120 | + |
| 121 | +쿠버네티스는 Kubelet의 일부인 *이미지 관리자*가 {{< glossary_tooltip text="cadvisor" term_id="cadvisor" >}}와 협동하여 |
| 122 | +모든 이미지의 라이프사이클을 관리한다. |
| 123 | +Kubelet은 가비지 수집 결정을 내릴 때, 다음 디스크 사용량 제한을 고려한다. |
| 124 | + |
| 125 | + * `HighThresholdPercent` |
| 126 | + * `LowThresholdPercent` |
| 127 | + |
| 128 | +`HighThresholdPercent` 값을 초과한 디스크 사용량은 |
| 129 | +마지막으로 사용된 시간을 기준으로 오래된 이미지순서대로 이미지를 삭제하는 |
| 130 | +가비지 수집을 트리거한다. Kubelet은 디스크 사용량이 `LowThresholdPercent` 값에 도달할 때까지 |
| 131 | +이미지를 삭제한다. |
| 132 | + |
| 133 | +### 컨테이너 이미지 가비지 수집 {#container-image-garbage-collection} |
| 134 | + |
| 135 | +Kubelet은 사용자가 정의할 수 있는 다음 변수들을 기반으로 사용되지 않는 컨테이너들을 삭제한다: |
| 136 | + |
| 137 | + * `MinAge`: Kubelet이 가비지 수집할 수 있는 최소 나이. `0`으로 세팅하여 비활성화할 수 있다. |
| 138 | + * `MaxPerPodContainer`: 각 파드 쌍이 가질 수 있는 죽은 컨테이너의 최대 개수. |
| 139 | + `0`으로 세팅하여 비활성화할 수 있다. |
| 140 | + * `MaxContainers`: 클러스터가 가질 수 있는 죽은 컨테이너의 최대 개수 |
| 141 | + `0`으로 세팅하여 비활성화할 수 있다. |
| 142 | + |
| 143 | +위 변수와 더불어, Kubelet은 식별할 수 없고 삭제된 컨테이너들을 오래된 순서대로 가비지 수집한다. |
| 144 | + |
| 145 | +`MaxPerPodContainer`와 `MaxContainer`는 |
| 146 | +파드의 최대 컨테이너 개수(`MaxPerPodContainer`)를 유지하는 것이 |
| 147 | +전체 죽은 컨테이너의 개수 제한(`MaxContainers`)을 초과하게 될 때, |
| 148 | +서로 충돌이 발생할 수 있다. |
| 149 | +이 상황에서 Kubelet은 충돌을 해결하기 위해 `MaxPodPerContainer`를 조절한다. |
| 150 | +최악의 시나리오에서는 `MaxPerPodContainer`를 `1`로 다운그레이드하고 |
| 151 | +가장 오래된 컨테이너들을 축출한다. |
| 152 | +또한, 삭제된 파드가 소유한 컨테이너들은 `MinAge`보다 오래되었을 때 삭제된다. |
| 153 | + |
| 154 | +{{<note>}} |
| 155 | +Kubelet은 자신이 관리하는 컨테이너에 대한 가비지 수집만을 수행한다. |
| 156 | +{{</note>}} |
| 157 | + |
| 158 | +## 가비지 수집 구성하기 {#configuring-gc} |
| 159 | + |
| 160 | +자원을 관리하는 컨트롤러의 옵션을 구성하여 가비지 컬렉션을 수정할 수 있다. |
| 161 | +다음 페이지에서 어떻게 가비지 수집을 구성할 수 있는지 확인할 수 있다: |
| 162 | + |
| 163 | + * [쿠버네티스 오브젝트의 캐스케이딩 삭제 구성하기](/docs/tasks/administer-cluster/use-cascading-deletion/) |
| 164 | + * [완료된 잡 자동 정리하기](/ko/docs/concepts/workloads/controllers/ttlafterfinished/) |
| 165 | + |
| 166 | +<!-- * [Configuring unused container and image garbage collection](/docs/tasks/administer-cluster/reconfigure-kubelet/) --> |
| 167 | + |
| 168 | +## {{% heading "whatsnext" %}} |
| 169 | + |
| 170 | +* [쿠버네티스 오브젝트의 소유권](/docs/concepts/overview/working-with-objects/owners-dependents/)에 대해 알아보자. |
| 171 | +* 쿠버네티스 [finalizers](/docs/concepts/overview/working-with-objects/finalizers/)에 대해 알아보자. |
| 172 | +* 완료된 잡을 정리하는 [TTL 컨트롤러](/ko/docs/concepts/workloads/controllers/ttlafterfinished/) (beta) 에 대해 알아보자. |
0 commit comments