cgroup에 관해

리눅스에서, 컨트롤 그룹은 프로세스에 할당되는 자원을 제한한다.

Kubelet과 기본이 되는 컨테이너 런타임은 cgroup과 연동하여 파드와 컨테이너를 위한 리소스 관리를 적용해야 하며, 이는 컨테이너화된 워크로드의 CPU/메모리 요청 및 제한을 포함한다.

리눅스에는 두 가지 버전의 cgroup이 있다. cgroup v1과 cgroup v2. cgroup v2는 cgroup API의 새로운 세대이다.

cgroup v2란 무엇인가

기능 상태: Kubernetes v1.25 [stable]

cgroup v2는 리눅스 cgroup API의 다음 버전이다. cgroup v2는 향상된 리소스 관리 기능을 갖춘 통합 제어 시스템을 제공한다.

cgroup v2는 cgroup v1에 비해 다음과 같은 여러 개선 사항을 제공한다.

  • API의 단일 통합 계층 구조 설계
  • 컨테이너에 대한 더 안전한 서브트리 위임
  • 커널 압력 정보(Pressure Stall Information)와 같은 새로운 기능
  • 다양한 리소스에 걸친 향상된 리소스 할당 관리 및 격리
    • 다양한 유형의 메모리 할당(네트워크 메모리, 커널 메모리 등)에 대한 통합 회계
    • 페이지 캐시 라이트백과 같은 비-즉각적인 자원 변경에 대한 회계

일부 쿠버네티스 기능은 향상된 자원 관리 및 격리를 위해 오직 cgroup v2만을 사용합니다. 예를 들어, MemoryQoS 기능은 메모리 QoS를 향상시키고 cgroup v2 primitives에 의존합니다.

cgorup v2 사용하기

cgroup v2를 사용하는 권장 방법은 cgroup v2를 기본적으로 활성화하고 사용하는 리눅스 배포판을 이용하는 것이다.

사용 중인 배포판이 cgroup v2를 사용하는지 확인하려면, 리눅스 노드에서 cgroup 버전 확인하기를 참조한다.

요구사항

cgroup v2에는 다음과 같은 요구 사항이 있다.

  • OS 배포판에서 cgroup v2가 활성화되어 있어야 한다.
  • 리눅스 커널 버전은 5.8 이상이어야 한다.
  • 컨테이너 런타임이 cgroup v2를 지원해야 한다. 예를 들어,
  • kubelet과 컨테이너 런타임은 systemd cgroup driver를 사용하도록 구성되어야 한다.

리눅스 배포판 cgroup v2 지원

cgroup v2를 사용하는 리눅스 배포판 목록은, cgroup v2 문서를 참조한다.

  • Container Optimized OS (M97 버전부터)
  • Ubuntu (21.10 버전부터, 22.04+ 권장)
  • Debian GNU/Linux (Debian 11 bullseye 버전부터)
  • Fedora (31 버전부터)
  • Arch Linux (2021년 4월부터)
  • RHEL 및 RHEL 기반 배포판 (9 버전부터)

사용 중인 배포판이 cgroup v2를 사용하는지 확인하려면, 해당 배포판의 문서를 참조하거나 리눅스 노드에서 cgroup 버전 확인하기의 지침을 따른다.

또한 커널 cmdline 부트 파라미터를 수정하여 리눅스 배포판에서 cgroup v2를 수동으로 활성화할 수 있다. 사용 중인 배포판이 GRUB을 사용하는 경우, /etc/default/grub 파일의 GRUB_CMDLINE_LINUXsystemd.unified_cgroup_hierarchy=1을 추가한 다음, sudo update-grub을 실행해야 한다. 그러나, 권장되는 방법은 cgroup v2를 기본적으로 활성화하는 배포판을 사용하는 것이다.

cgroup v2로 마이그레이션

cgroup v2로 마이그레이션하려면, 요구 사항을 충족하는지 확인한 다음, cgroup v2를 기본적으로 활성화하는 커널 버전으로 업그레이드한다.

kubelet은 OS가 cgroup v2에서 실행 중임을 자동으로 감지하며 추가 구성 없이 그에 맞춰 작동한다.

cgroup v2로 전환할 때 사용자 경험에서 눈에 띄는 차이는 없어야 한다. 단, 사용자가 노드 또는 컨테이너 내부에서 cgroup 파일 시스템에 직접 접근하는 경우는 예외이다.

cgroup v2는 cgroup v1과 다른 API를 사용하므로, cgroup 파일 시스템에 직접 접근하는 애플리케이션이 있다면, cgroup v2를 지원하는 새로운 버전으로 업데이트해야 한다. 예를 들어,

  • 일부 서드파티 모니터링 및 보안 에이전트는 cgroup 파일 시스템에 의존할 수 있다. 이러한 에이전트들을 cgroup v2를 지원하는 버전으로 업데이트 한다.
  • cAdvisor를 파드 및 컨테이너 모니터링을 위한 독립형 DaemonSet으로 실행하는 경우, v0.43.0 이상으로 업데이트 한다.
  • 자바 애플리케이션을 배포하는 경우, cgroup v2를 완전히 지원하는 버전을 선호한다.
  • uber-go/automaxprocs 패키지를 사용하는 경우, 사용하는 버전이 v1.5.1 이상인지 확인한다.

리눅스 노드에서 cgroup 버전 확인하기

cgroup 버전은 사용 중인 리눅스 배포판과 OS에 설정된 기본 cgroup 버전에 따라 달라진다. 배포판이 어떤 cgroup 버전을 사용하는지 확인하려면, 노드에서 stat -fc %T /sys/fs/cgroup/ 명령을 실행한다.

stat -fc %T /sys/fs/cgroup/

cgroup v2의 경우, 출력은 cgroup2fs 이다.

cgroup v1의 경우, 출력은 tmpfs 이다.

최종 수정 September 22, 2025 at 3:34 PM PST: add cgroups.md (ko) (88f4495c5c)