[Linux] namespace, cgroup
Docker 및 Kubernetes와 같은 컨테이너 도구들이 현대적인 애플리케이션에서 대부분 사용되고 있다.
컨테이너의 기반이 된 리눅스의 기술들에 대해 궁금즘이 생겨 알아보고자 한다.
Namespaces
2002년부터 Linux 커널의 일부였으며, 실제 지원은 13년에 추가 되었다.
네임스페이스의 주요 기능은 프로세스를 서로 격리한다는 것이다.
다양한 서비스를 실행하는 서버에서, 각 서비스 및 관련 프로세스를 다른 서비스와 격리하면
변경사항과 호환성을 관리하기 쉬워진다.
os, 커널에서 작동하며, 한 덩어리의 데이터에 이름을 붙여 분할함으로써
네임스페이스가 다르면 이름이 같아도 다르게 처리하게된다.
네임스페이스 종류
- mnt : 마운트 조작 시 namespace에서 격리된 파일 시스템 트리를 만든다.
- pid : pid와 프로세스를 격리시키고, namespace가 다른 프로세스끼리 액세스할 수 없다.
- net : network 리소스의 관련된 정보를 분할한다. 호스트 os상에서 사용 중인 포트가 있더라도 컨테이너 안에서 동일한 번호의 포트를 사용할 수 있다.
- ipc : 프로세스 간 독립적인 통신 통로를 할당한다. IPC는 공유 메모리, 세마포어 또는 메시지 큐를 말한다.
- uts : 독립적인 hostname을 할당한다.
- user : uid, gid를 분할하여 격리한다.
Namespaces 생성
자체 사용자 및 PID 네임스페이스가 있는 새 네임스페이스를 생성 할 수 있다.
루트 사용자를 새 네임스페이스에 매핑하고, 새 proc 파일 시스템을 마운트한다.
unshare --user --pid --map-root-user --mount-proc --fork bash
(exec -it /bin/bash 명령을 싱행하는 것과 동일한 작업을 수행한다.)
Cgroups (control groups)
리눅스 커널의 control groups 기능을 사용하여 컨테이너 자원 할당 등을 관리할 수 있다.
프로세스 모음의 리소스 사용량 (CPU, 메모리, 디스크 I/O, 네트워크 등)을 제한하고 격리할 수 있는 기능이다.
Cgroup의 기능
- Resource Limits : 프로세스가 사용할 수 있는 특정 리소스의 양을 제한할 수 있다.
- Prioritization : 리소스 경합이 있을 때, 다른 cgroup의 프로세스와 비교하여 프로세스가 사용할 수 있는 리소스의 양을 제어할 수 있다.
- Accounting : 리소스 제한은 croup 수준에서 모니터링되고 보고된다.
- Control : 단일 명령으로 croup에 있는 모든 프로세스의 상태를 변경할 수 있다.\
기본적으로 cgroup을 사용하여 프로세스 또는 프로세스 집합에서 액세스하거나 사용할 수 있는
저장된 키 리소스의 양을 제어한다.
컨테이너에서 함께 제어해야하는 여러 프로세스가 실행되는 경우가 많이 때문에
컨테이너의 핵심 구성 요소라고 할 수 있다.
Cgroup 생성
foo라는 v1 cgroup을 생성하고, 메모리 제한을 50MB로 설정한다.
mkdir -p /sys/fs/cgroup/memory/foo
echo 50000000 > /sys/fs/cgroup/memory/foo/memory.limit_in_bytes
다음과 같이 백그라운드에 스크립트를 실행하고 PID를 cgroup 파일에 파이프하여
cgroup에 프로세스를 할당하여 cgroup의 메모리 제한을 적용할 수있다.
./test.sh &
[1] 2428
echo 2438 > /sys/fs/cgroup/memory/foo/cgroup.procs
os는 cgroup에서 정의한 리소스 제한을 초과할 때 프로세스를 종료한다.
참고
'🌏 OS > Linux' 카테고리의 다른 글
[Linux] umask (0) | 2024.06.17 |
---|---|
[Linux] failed to enable unit: Unit file /lib/systemd/system/nfs-common.service is masked (0) | 2024.06.11 |
[Linux] conda : command not found (0) | 2024.02.05 |
[Linux] nohup (0) | 2024.02.02 |
[Linux] 사용자에게 sudo 권한이 있는지 확인하기 (0) | 2024.01.18 |