이전 기사에서 LXD가 무엇인지, 플랫폼에 익숙하지 않은 경우를 대비하여 LXD를 시작하는 방법을 알아볼 수 있습니다.
대부분의 경우 동일한 시스템에서 여러 컨테이너를 사용하여 더 큰 전체를 더 작은 구성 요소로 분할합니다. 각 구성 요소가 사용할 수 있는 리소스의 양을 제한하는 것이 좋습니다. 하지만 왜? 분명히 이유의 수는 컨테이너를 사용할 수 있는 시나리오만큼 무제한입니다.
LXD 컨테이너에 대한 제한이 유용할 수 있는 경우
- 서비스를 제공하고 각 고객에게 LXD 인스턴스를 제공합니다. 예를 들어, 이것은 대규모 서버일 수 있으며 각 고객 웹사이트를 별도의 컨테이너에 호스팅합니다. 웹 사이트에 트래픽이 갑자기 급증하면 다른 인스턴스의 속도가 느려질 수 있습니다. 제한이 있는 경우 하나의 컨테이너만 속도가 느려지고 나머지는 정상적으로 작동합니다.
- 비슷한 시나리오에서 다른 서비스 계획을 쉽게 판매할 수 있습니다. 한 고객은 X만큼의 자원에 대해 지불할 수 있고 다른 고객은 Y만큼을 지불할 수 있습니다. 그리고 몇 가지 간단한 명령으로 이를 쉽게 조정할 수 있습니다.
- 간단한 형태의 서비스 거부 공격으로부터 자신을 보호할 수 있습니다. 하나의 컨테이너가 폭격을 당하면 리소스 사용 제한에 도달합니다. 다른 컨테이너는 영향을 받지 않습니다.
- 사용 가능한 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 코어에 "고정"하려면 다음을 사용하십시오.
lxc config set container_name limits.cpu 0-0
이렇게 하면 컨테이너가 첫 번째 CPU만 사용하게 됩니다. 두 번째를 사용하려면 1-1을 입력합니다. 첫 번째부터 세 번째까지 모든 CPU 코어를 사용하려면 0-3을 입력합니다.
또 다른 유형의 제한은 컨테이너가 사용할 수 있는 CPU 시간입니다.
lxc config set container_name limits.cpu.allowance 10ms/100ms
이렇게 하면 컨테이너가 매 100밀리초 중 10밀리초의 CPU 시간만 사용할 수 있으므로 CPU 코어 1개의 약 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.125Mbits(약 120킬로바이트)로 제한됩니다. 따라서 1MB/s(메가바이트)로 다운로드하려면 8을 곱하고 수신 제한을 8Mbit로 설정합니다.
이그레스의 경우 다음을 사용하세요.
lxc config device set container_name eth0 limits.egress 1Mbit
결론
여기에는 리소스 제한과 관련하여 가장 일반적으로 사용되는 속성이 포함됩니다. 하지만 lxc config device set
로 설정할 수 있는 변수가 훨씬 더 많습니다. 및 lxc config set
. LXD의 GitHub 페이지에서 이러한 조정 가능한 컨테이너 속성에 대해 자세히 알아볼 수 있습니다.