|
| 1 | +--- |
| 2 | +title: cgroup에 관해 |
| 3 | +content_type: concept |
| 4 | +weight: 50 |
| 5 | +--- |
| 6 | + |
| 7 | +<!-- overview --> |
| 8 | + |
| 9 | +리눅스에서, {{< glossary_tooltip text="컨트롤 그룹" term_id="cgroup" >}}은 |
| 10 | +프로세스에 할당되는 자원을 제한한다. |
| 11 | + |
| 12 | +{{< glossary_tooltip text="" term_id="kubelet" >}}과 |
| 13 | +기본이 되는 컨테이너 런타임은 cgroup과 연동하여 |
| 14 | +[파드와 컨테이너를 위한 리소스 관리](/ko/docs/concepts/configuration/manage-resources-containers/)를 적용해야 하며, |
| 15 | +이는 컨테이너화된 워크로드의 CPU/메모리 요청 및 제한을 포함한다. |
| 16 | + |
| 17 | +리눅스에는 두 가지 버전의 cgroup이 있다. cgroup v1과 cgroup v2. cgroup v2는 |
| 18 | +cgroup API의 새로운 세대이다. |
| 19 | + |
| 20 | +<!-- body --> |
| 21 | + |
| 22 | + |
| 23 | +## cgroup v2란 무엇인가 {#cgroup-v2} |
| 24 | +{{< feature-state for_k8s_version="v1.25" state="stable" >}} |
| 25 | + |
| 26 | +cgroup v2는 리눅스 cgroup API의 다음 버전이다. cgroup v2는 향상된 |
| 27 | +리소스 관리 기능을 갖춘 통합 제어 시스템을 |
| 28 | +제공한다. |
| 29 | + |
| 30 | +cgroup v2는 cgroup v1에 비해 다음과 같은 여러 개선 사항을 제공한다. |
| 31 | + |
| 32 | +- API의 단일 통합 계층 구조 설계 |
| 33 | +- 컨테이너에 대한 더 안전한 서브트리 위임 |
| 34 | +- [커널 압력 정보(Pressure Stall Information)](https://www.kernel.org/doc/html/latest/accounting/psi.html)와 같은 새로운 기능 |
| 35 | +- 다양한 리소스에 걸친 향상된 리소스 할당 관리 및 격리 |
| 36 | + - 다양한 유형의 메모리 할당(네트워크 메모리, 커널 메모리 등)에 대한 통합 회계 |
| 37 | + - 페이지 캐시 라이트백과 같은 비-즉각적인 자원 변경에 대한 회계 |
| 38 | + |
| 39 | +일부 쿠버네티스 기능은 향상된 자원 관리 및 격리를 위해 |
| 40 | +오직 cgroup v2만을 사용합니다. 예를 들어, |
| 41 | +[MemoryQoS](/ko/docs/concepts/workloads/pods/pod-qos/#memory-qos-with-cgroup-v2) 기능은 메모리 QoS를 향상시키고 |
| 42 | +cgroup v2 primitives에 의존합니다. |
| 43 | + |
| 44 | + |
| 45 | +## cgorup v2 사용하기 {#using-cgroupv2} |
| 46 | + |
| 47 | +cgroup v2를 사용하는 권장 방법은 cgroup v2를 기본적으로 활성화하고 사용하는 |
| 48 | +리눅스 배포판을 이용하는 것이다. |
| 49 | + |
| 50 | +사용 중인 배포판이 cgroup v2를 사용하는지 확인하려면, [리눅스 노드에서 cgroup 버전 확인하기](#check-cgroup-version)를 참조한다. |
| 51 | + |
| 52 | +### 요구사항 |
| 53 | + |
| 54 | +cgroup v2에는 다음과 같은 요구 사항이 있다. |
| 55 | + |
| 56 | +* OS 배포판에서 cgroup v2가 활성화되어 있어야 한다. |
| 57 | +* 리눅스 커널 버전은 5.8 이상이어야 한다. |
| 58 | +* 컨테이너 런타임이 cgroup v2를 지원해야 한다. 예를 들어, |
| 59 | + * [containerd](https://containerd.io/) v1.4 이상 |
| 60 | + * [cri-o](https://cri-o.io/) v1.20 이상 |
| 61 | +* kubelet과 컨테이너 런타임은 [systemd cgroup driver](/ko/docs/setup/production-environment/container-runtimes#systemd-cgroup-driver)를 사용하도록 구성되어야 한다. |
| 62 | + |
| 63 | +### 리눅스 배포판 cgroup v2 지원 |
| 64 | + |
| 65 | +cgroup v2를 사용하는 리눅스 배포판 목록은, [cgroup v2 문서](https://github.com/opencontainers/runc/blob/main/docs/cgroup-v2.md)를 참조한다. |
| 66 | + |
| 67 | +<!-- the list should be kept in sync with https://github.com/opencontainers/runc/blob/main/docs/cgroup-v2.md --> |
| 68 | +* Container Optimized OS (M97 버전부터) |
| 69 | +* Ubuntu (21.10 버전부터, 22.04+ 권장) |
| 70 | +* Debian GNU/Linux (Debian 11 bullseye 버전부터) |
| 71 | +* Fedora (31 버전부터) |
| 72 | +* Arch Linux (2021년 4월부터) |
| 73 | +* RHEL 및 RHEL 기반 배포판 (9 버전부터) |
| 74 | + |
| 75 | +사용 중인 배포판이 cgroup v2를 사용하는지 확인하려면, 해당 배포판의 |
| 76 | +문서를 참조하거나 [리눅스 노드에서 cgroup 버전 확인하기](#check-cgroup-version)의 지침을 따른다. |
| 77 | + |
| 78 | +또한 커널 cmdline 부트 파라미터를 수정하여 리눅스 배포판에서 |
| 79 | +cgroup v2를 수동으로 활성화할 수 있다. 사용 중인 배포판이 GRUB을 사용하는 경우, |
| 80 | +`/etc/default/grub` 파일의 `GRUB_CMDLINE_LINUX`에 |
| 81 | +`systemd.unified_cgroup_hierarchy=1`을 추가한 다음, `sudo update-grub`을 실행해야 한다. 그러나, |
| 82 | +권장되는 방법은 cgroup v2를 기본적으로 활성화하는 배포판을 사용하는 |
| 83 | +것이다. |
| 84 | + |
| 85 | +### cgroup v2로 마이그레이션 {#migrating-cgroupv2} |
| 86 | + |
| 87 | +cgroup v2로 마이그레이션하려면, [요구 사항](#requirements)을 충족하는지 확인한 다음, cgroup v2를 |
| 88 | +기본적으로 활성화하는 커널 버전으로 업그레이드한다. |
| 89 | + |
| 90 | +kubelet은 OS가 cgroup v2에서 실행 중임을 자동으로 감지하며 |
| 91 | +추가 구성 없이 그에 맞춰 작동한다. |
| 92 | + |
| 93 | +cgroup v2로 전환할 때 사용자 경험에서 눈에 띄는 차이는 없어야 한다. |
| 94 | +단, 사용자가 노드 또는 컨테이너 내부에서 cgroup 파일 시스템에 직접 |
| 95 | +접근하는 경우는 예외이다. |
| 96 | + |
| 97 | +cgroup v2는 cgroup v1과 다른 API를 사용하므로, cgroup 파일 시스템에 |
| 98 | +직접 접근하는 애플리케이션이 있다면, cgroup v2를 |
| 99 | +지원하는 새로운 버전으로 업데이트해야 한다. 예를 들어, |
| 100 | + |
| 101 | +* 일부 서드파티 모니터링 및 보안 에이전트는 cgroup 파일 시스템에 의존할 수 있다. |
| 102 | + 이러한 에이전트들을 cgroup v2를 지원하는 버전으로 업데이트 한다. |
| 103 | +* [cAdvisor](https://github.com/google/cadvisor)를 |
| 104 | + 파드 및 컨테이너 모니터링을 위한 독립형 DaemonSet으로 실행하는 경우, v0.43.0 이상으로 업데이트 한다. |
| 105 | +* 자바 애플리케이션을 배포하는 경우, cgroup v2를 완전히 지원하는 버전을 선호한다. |
| 106 | + * [OpenJDK / HotSpot](https://bugs.openjdk.org/browse/JDK-8230305): jdk8u372, 11.0.16, 15 이상 |
| 107 | + * [IBM Semeru Runtimes](https://www.ibm.com/support/pages/apar/IJ46681): 8.0.382.0, 11.0.20.0, 17.0.8.0 이상 |
| 108 | + * [IBM Java](https://www.ibm.com/support/pages/apar/IJ46681): 8.0.8.6 이상 |
| 109 | +* [uber-go/automaxprocs](https://github.com/uber-go/automaxprocs) 패키지를 사용하는 경우, 사용하는 |
| 110 | + 버전이 v1.5.1 이상인지 확인한다. |
| 111 | + |
| 112 | +## 리눅스 노드에서 cgroup 버전 확인하기 {#check-cgroup-version} |
| 113 | + |
| 114 | +cgroup 버전은 사용 중인 리눅스 배포판과 OS에 설정된 |
| 115 | +기본 cgroup 버전에 따라 달라진다. 배포판이 어떤 cgroup 버전을 사용하는지 |
| 116 | +확인하려면, 노드에서 `stat -fc %T /sys/fs/cgroup/` 명령을 |
| 117 | +실행한다. |
| 118 | + |
| 119 | +```shell |
| 120 | +stat -fc %T /sys/fs/cgroup/ |
| 121 | +``` |
| 122 | + |
| 123 | +cgroup v2의 경우, 출력은 cgroup2fs 이다. |
| 124 | + |
| 125 | +cgroup v1의 경우, 출력은 tmpfs 이다. |
| 126 | + |
| 127 | +## {{% heading "다음 내용" %}} |
| 128 | + |
| 129 | +- [cgroup](https://man7.org/linux/man-pages/man7/cgroups.7.html)에 대해 더 알아보기 |
| 130 | +- [컨테이너 런타임](/ko/docs/concepts/architecture/cri)에 대해 더 알아보기 |
| 131 | +- [cgroup 드라이버](/ko/docs/setup/production-environment/container-runtimes#cgroup-drivers)에 대해 더 알아보기 |
0 commit comments