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 이상의 버전을 사용하는 것을 선호한다.
참고한 자료
'Infrastructure > Kubernetes' 카테고리의 다른 글
[클러스터 아키텍처] 컨테이너 런타임 인터페이스(CRI) (0) | 2022.10.13 |
---|---|
[클러스터 아키텍처] 가비지 수집 (0) | 2022.10.13 |
[클러스터 아키텍처] 클라우드 컨트롤 매니저 (0) | 2022.10.13 |
[클러스터 아키텍처] 컨트롤러 (0) | 2022.10.13 |
[클러스터 아키텍처] 컨트롤 플레인-노드 간 통신 (0) | 2022.10.13 |