Computer >> 컴퓨터 >  >> 시스템 >> Linux

LXD 컨테이너 리소스 사용량 제한하는 방법 완벽 가이드

LXD 컨테이너 리소스 사용량 제한하는 방법 완벽 가이드

이전 글에서는 LXD가 무엇인지, 그리고 이 플랫폼을 처음 접하는 분들을 위해 어떻게 시작하는지 살펴보았습니다.

대부분의 경우 하나의 시스템에서 여러 컨테이너를 운영하여 큰 전체를 작은 구성 요소로 나누게 됩니다. 이때 각 구성 요소가 사용할 수 있는 리소스 양을 제한하는 것이 합리적입니다. 하지만 왜 그럴까요? 당연히 그 이유는 컨테이너를 활용할 수 있는 시나리오만큼이나 무궁무진합니다.

LXD 컨테이너에 제한을 두면 유용한 경우

  • 고객별 서비스 제공: 대형 서버 한 대에서 고객별 웹사이트를 개별 LXD 인스턴스로 호스팅한다고 가정해 봅시다. 특정 웹사이트에 트래픽이 갑자기 몰리면 다른 인스턴스까지 느려질 수 있습니다. 하지만 제한을 걸어두면 해당 컨테이너만 느려지고 나머지는 정상적으로 동작합니다.
  • 차등 서비스 플랜 판매: 비슷한 시나리오에서 서로 다른 요금제를 쉽게 운영할 수 있습니다. 한 고객은 X만큼의 리소스를, 다른 고객은 Y만큼의 리소스를 사용하도록 하고, 간단한 명령어 몇 개로 손쉽게 조정할 수 있습니다.
  • DoS 공격 방어: 단순한 형태의 서비스 거부(Denial of Service) 공격으로부터 스스로를 보호할 수 있습니다. 특정 컨테이너가 공격을 받으면 해당 컨테이너는 자신의 리소스 사용 한도에 도달할 뿐, 다른 컨테이너는 영향을 받지 않습니다.
  • 작업 우선순위 조정: 두 개의 컨테이너가 각각 사용 가능한 CPU 시간을 100% 활용하지만, 한쪽이 더 빨리 작업을 끝내기를 원하는 경우입니다. 예를 들어 내일 필요한 프로젝트 영상을 렌더링해야 한다면 첫 번째 컨테이너에 CPU 시간의 90%를, 두 번째에는 10%를 할당할 수 있습니다.

물론 여러분만의 이유가 있을 수 있습니다. 시스템 전체에서 컨테이너를 하나만 사용한다면 굳이 필요하지 않을 수도 있습니다. 하지만 여러 컨테이너를 운영한다면 어떤 형태로든 제한을 설정하는 것이 거의 필수입니다. 한 LXD 인스턴스에서 발생한 공격, 버그 또는 기타 비정상 동작이 시스템 전체에 영향을 미쳐 성능을 떨어뜨릴 수 있기 때문입니다. 컨테이너가 많아질수록 이런 상황이 발생할 가능성은 더욱 높아집니다.

LXD 컨테이너에 리소스 제한 설정하기

디스크 관련 작업의 리소스 제어에는 ZFS가 설치되어 있어야 합니다. 이전 튜토리얼을 따라 했다면 이미 설치되어 있을 것입니다. 그렇지 않다면 튜토리얼의 안내에 따라 ZFS 유틸리티를 설치한 후 아래 명령어를 다시 실행하세요. 스토리지 백엔드를 선택하라는 질문이 나오면 ZFS를 선택합니다.

sudo lxd init

메모리 사용량 제한

아래 명령어에서 "container_name"은 실제 컨테이너 이름으로 바꿔 입력하세요. 메모리 제한은 다음과 같이 간단하게 설정할 수 있습니다:

lxc config set container_name limits.memory 100MB

메가바이트 대신 기가바이트 단위를 사용하려면 "MB" 대신 "GB"를 입력하면 됩니다.

CPU 사용량 제한

컨테이너가 사용할 수 있는 CPU 코어 수를 제한하려면 다음을 입력합니다:

lxc config set container_name limits.cpu 2

특정 CPU 코어에 "고정(pin)"하려면 다음을 사용합니다:

lxc config set container_name limits.cpu 0-0

이렇게 하면 컨테이너가 첫 번째 CPU만 사용하게 됩니다. 두 번째 코어를 사용하려면 1-1을, 첫 번째부터 세 번째까지 모든 코어를 사용하려면 0-3을 입력하면 됩니다.

또 다른 종류의 제한은 컨테이너가 사용할 수 있는 CPU 시간의 비율입니다.

lxc config set container_name limits.cpu.allowance 10ms/100ms

이 설정은 100밀리초마다 10밀리초의 CPU 시간만 사용하도록 허용합니다. 즉, CPU 코어 하나 기준 약 10%입니다.

디스크 사용량 제한

디스크 관련 리소스를 제한하려면 먼저 컨테이너에 루트 디스크 장치를 추가해야 합니다. 기본 LXD 프로필에서 상속받아 기본적으로 존재하지만, 직접 추가하기 전에는 컨테이너별로 설정을 변경할 수 없습니다.

lxc config device add container_name root disk pool=default path=/

스토리지 풀 이름을 다르게 지정했다면 "default"를 실제 풀 이름으로 바꾸세요. 이름을 잊었다면 다음 명령어로 확인할 수 있습니다:

lxc storage list

LXD 인스턴스가 사용할 수 있는 디스크 공간을 제한하려면:

lxc config device set container_name root size 7GB

안타깝게도 현재 I/O 제한(읽기/쓰기 "속도" 및 IOPS)은 작동하지 않습니다.

네트워크 사용량 제한

디스크와 마찬가지로 먼저 설정 가능한 가상 이더넷 장치를 추가해야 합니다. LXD 인스턴스를 외부 세계와 연결하는 네트워크 브리지의 이름을 확인하세요.

lxc network list

필요하다면 "lxdbr0"을 실제 브리지 이름으로 바꾸세요. "lxd init" 구성 단계에서 네트워크 유형을 브리지(기본 답변)로 선택하지 않았다면, 아래 명령어를 선택에 맞게 수정해야 할 수 있습니다. 예를 들어 "nictype"도 LXD 네트워크에 사용한 값으로 변경해야 할 수 있습니다.

lxc config device add container_name eth0 nic name=eth0 nictype=bridged parent=lxdbr0

마지막으로 네트워크 인그레스(다운로드) 및/또는 이그레스(업로드)에 제한을 설정합니다.

lxc config device set container_name eth0 limits.ingress 1Mbit

1Mbit는 1메가비트(메가바이트가 아님)입니다. 1바이트는 8비트이므로, 이 설정은 다운로드 속도를 초당 약 1/8=0.125Mbit, 즉 약 120킬로바이트로 제한합니다. 따라서 초당 1MB(메가바이트)로 다운로드하려면 8을 곱해 인그레스 제한을 8Mbit로 설정하면 됩니다.

이그레스(업로드)는 다음과 같이 설정합니다:

lxc config device set container_name eth0 limits.egress 1Mbit

결론

여기까지가 리소스 제한과 관련된 가장 많이 사용되는 속성들입니다. 하지만 lxc config device setlxc config set으로 설정할 수 있는 변수는 훨씬 더 많습니다. 조절 가능한 컨테이너 속성에 대한 자세한 내용은 LXD의 GitHub 페이지에서 확인할 수 있습니다.