Container는 보통 리눅스의 프로세스로 실행이 된다.
한 프로세스가 다른 프로세스들에게 영향을 끼치면 안되기 때문에 cgroup을 통해서 제한을 할 수 있다.
cgroup 제어그룹, 구조
리눅스 커널은 보통 /sys/fs/cgroup에서 위계구조를 갖고 있음
/sys/fs/cgroup$ ls
blkio cpu,cpuacct freezer memory...
memory쪽을 자세히 보면
/sys/fs/cgroup$ ls memory/
cgroup.clone_children memory.memsw.limit_in_bytes
cgroup.event_control memory.memsw.max_usage_in_bytes
cgroup.procs memory.memsw.usage_in_bytes
cgroup.sane_behavior memory.move_charge_at_immigrate
kubepods.slice memory.numa_stat
memory.failcnt memory.oom_control
...
다양한 제어그룹이 있는데 tcp버퍼의 사이즈, 커널관련된 제어그룹 등등 다양
파일 이름이 명확하여 이해하기 쉬움
모든 프로세스의 정보를 담고있는 상태이고, 제어그룹을 따로 생성하여 그룹에 배정해야함
/sys/fs/cgroup/memory/dev-chicken# ls
cgroup.clone_children memory.memsw.failcnt
cgroup.event_control memory.memsw.limit_in_bytes
cgroup.procs memory.memsw.max_usage_in_bytes
memory.failcnt memory.memsw.usage_in_bytes
memory.force_empty memory.move_charge_at_immigrate
memory.kmem.failcnt memory.numa_stat
memory.kmem.limit_in_bytes memory.oom_control
...
이렇게 원하는 자원의 하위에 디렉토리를 만들면 자동으로 채워줌
이 안에서 컨테이너를 위한 제어정보를 저장하는데, 예를들어 memory.usage_in_bytes는 현재 메모리 사용량을 담고 있음
제어하는 것이 목적이기 때문에 한계도 설정할 수 있는데, memory.limit_in_bytes를 보면 확인 가능
process 배정
제어그룹의 특정 파일에 프로세스 ID를 추가하면 해당 프로세스가 제어그룹에 설정이 됨
앞서 설명한 것들과 합쳐 차례대로 설명하면
1. 원하는 자원의 위치에서 하위 디렉토리를 생성
2. 사용할 프로세스에 원하는 limit값을 설정
3. 프로세스ID를 제어 그룹의 cgroup.procs파일에 추가
/sys/fs/cgroup/memory/dev-chicken# echo {process_id} > cgroup.procs
이렇게 하면 원하는 프로세스의 자원을 제한하게 됨
cgroup version1 vs version2
cgroup | version 1 | version2 |
Simplicity | 하나의 프로세스를 자원별 그룹에 배정하다 보니 복잡할 수 있음 | 자원이 아닌 cgroup자체의 제어그룹에 배정하여 좀 더 simple한 그룹화가 가능함 |
Rootless Containers | 지원이 빈약 | 지원이 조금 더 잘 되어있음 |
Runtime Support | 새로운 Container표준에 잘 맞지 않음 | 새로운 Container표준에 좀 더 가까움 |
대부분 version2에서 개선이 많이 진행되었고 설명이 부족한 Rootless Containers, Runtime Support를 보면,
Rootless Containers는 보안상 좀 더 유리하기 때문에 version2에서 좀 더 이점이 있는 것
추가로 Runtime Suppport는 보면 kubernetes에서 Docker가 이제 deprecated되는데 해당 변화점에 대해서는 version2가 더 잘 지원해주는 것으로 보면 될 것 같음
'개발 > 개발공부' 카테고리의 다른 글
Network Namespace / Container 기초, 네트워크, 네임스페이스, 컨테이너, 간단 정리 (0) | 2023.01.06 |
---|---|
Docker vs Containerd / Container runtime, 쿠버네티스, 도커, 차이점, 장단점 (2) | 2023.01.04 |
Container 사전지식 / 리눅스, 권한, 컨테이너, 파일, 시스템콜 (0) | 2023.01.01 |
Kubernetes Components (Worker Node) / 쿠버네티스 컴포넌트, 워커 노드, 노드 컴포넌트 (0) | 2022.12.28 |
Kubernetes Components (Control plane) / 쿠버네티스 컴포넌트, 마스터, 컨트롤 플레인 (4) | 2022.12.27 |
댓글