본문 바로가기

Infrastructure/Kubernetes

[클러스터 아키텍처] cgroup v2

cgroup v2

쿠버네티스 공식문서를 확인하며 cgroup v2에 대해서 기억해야 하는 부분을 기록한다.

  • 리눅스에서는 통제 그룹(control group) 프로세스에 할당되는 리소스를 제한한다.
  • kubelet 기본 컨테이너 런타임은 cgroup과 인터페이스하여 컨테이너화 된 워크로드에 대한 CPU/Memory 요청 및 제한과 같은 리소스 관리를 해야 한다.
  • 리눅스에는 cgroup v1 및 cgroup v2 두 가지 버전이 존재하고 여기서 cgroup v2가 cgroup API의 새로운 버전이다.

cgroup v2는 무엇인가

  • cgroup v2는 Linux cgroup API의 다음 버전으로 cgroup v2는 기존에 비해 향상된 리소스 관리 기능을 갖춘 통합 제어 시스템을 제공한다.
  • cgroup v2는 cgroup v1에 비해 아래와 같은 개선사항을 제공한다.
    • API의 단일 통합 계층 구조 설계
    • 컨테이너에 대한 보다 안전한 하위 트리 위임
    • Pressure Stall 정보와 같은 새로운 기능
    • 여러 리소스에 대한 향상된 리소스 할당 관리 및 격리
      • 다양한 유형의 메모리 할당(네트워크 메모리, 커널 메모리 등)에 대한 통합 계정
      • 페이지 캐시 쓰기 되돌림과 같은 즉각적이지 않은 리소스 변경에 대한 설명
  • 일부 쿠버네티스의 기능은 향상된 리소스 관리 및 격리를 위해 cgroup v2를 독점적으로 사용한다. 예를 들어, MemoryQoS 기능은 메모리 QoS를 개선하고 cgroup v2의 기본 요소에 의존한다.

[정리]

cgroup v2는 리눅스의 리소스를 관리하며 기존에 사용되던 cgroup 을 대체한다. 쿠버네티스는 파드 및 컨테이너의 리소스 관리를 위해 cgroup v2의 기능에 의존하고 있다.


cgroup v2 사용

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

요구 사항

  • cgroup v2에는 아래와 같은 요구 사항이 있다.
    • OS에서 cgroup v2를 활성화 해야 한다.
    • Linux의 커널 버전이 5.8 이상이어야 한다.
    • 컨테이너 런타임이 cgroup v2를 지원해야 한다. (containerd v1.4 이상, cri-o v1.20 이상)
    • kubelet 및 컨테이너 런타임은 systemd cgroup 드라이버를 사용하도록 구성된다.

Linux 배포판에서 cgroup v2 지원

  • 주요 cgroup v2를 사용하는 Linux 배포판 목록은 아래와 같다.
    • Container Optimized OS (M97 이후)
    • Ubuntu (21.10 이후, 22.04 이상 권장)
    • Debian GNU/Linux (Debian 11 bullseye 이후)
    • Fedora (31 이후)
    • Arch Linux (2021년 4월 이후)
    • RHEL and RHEL-like 배포판 (9 이후)
  • 커널 cmdline 부팅 매개변수를 수정하여 Linux 배포판에서 cgroup v2를 수동으로 활성화할 수 있다.
  • 배포판에서 GRUB을 사용하고 있는 경우 sudo update-grub을 통해 grub을 업데이트 하고 systemd.unified_cgroup_hierarchy=1/etc/default/grab 하위에 GRUB_CMDLINE_LINUX가 추가되어야 한다. 하지만 권장되는 방법은 기본적으로 cgroup v2를 활성화하는 배포판을 사용하는 것이다.

[정리]

cgroup v2를 사용하기 위해서는 호스트 OS의 버전과 컨테이너 런타임의 버전의 중요하다.

grub을 사용하는 경우에도 cgroup v2를 활성화할 수는 있으나 추천하는 방법은 아니다.


cgroup v2로 마이그레이션

  • cgroup v2로 마이그레이션 하기 위해서는 요구 사항을 충족하는지 확인하고 기본적으로 cgroup v2를 활성화하는 커널 버전으로 업그레이드 해야 한다.
  • kubelet은 OS가 cgroup v2에서 실행되고 있음을 자동으로 감지하고 추가 구성 없이 그에 따라 사용된다.
  • 사용자는 노드 도는 컨테이너 내에서 직접 cgroup 파일 시스템에 액세스 하는 상황이 아니라면 cgroup v2로 마이그레이션 한 이후에도 사용자 경험에는 차이가 없어야 한다.
  • cgroup v2는 cgroup v1과 다른 API를 사용하므로 cgroup 파일 시스템에 직접 액세스하는 응용 프로그램이 있는 경우 cgroup v2를 지원하는 최신 버전으로 업데이트 해야 한다.
    • 일부 모니터링 및 보안 에이전트는 cgroup 파일 시스템에 의존할 수 있다.
    • 파드 및 컨테이너 모니터링을 위해 독립 실행형 DaemonSet으로 cAdvisor를 실행하는 경우 v0.43.0 이상으로 업데이트 해야 한다.
    • JDK를 사용하는 경우 cgroup v2를 완전히 지원하는 JDK 11.0.16 이상 또는 JDK 15 이상을 사용하는 것을 선호한다.

[정리]

cgroup v2로 마이그레이션 하기 위해서는 OS의 버전을 먼저 업데이트 해야 한다.

구버전 써드파티 라이브러리들은 cgroup v2를 지원하지 않을 수 있으므로 이를 지원하는 새로운 버전으로 업데이트 해주어야 한다. 자바의 경우도 JDK 11 이상의 버전을 사용하는 것을 선호한다.


참고한 자료