콘텐츠로 이동

6장: 프로필

이 장에서는 처음부터 이 책을 따라오셨다면 비권한 사용자("lxdadmin")로 명령을 실행해야 합니다.

LXD를 설치하면 기본 프로필이 제공되며, 이 프로필은 삭제하거나 수정할 수 없습니다. 그러나 기본 프로필을 사용하여 컨테이너에 사용할 새 프로필을 만들 수 있습니다.

컨테이너 목록을 살펴보면 각 경우의 IP 주소가 브리지 인터페이스에서 나온 것을 알 수 있습니다. 프로덕션 환경에서는 다른 주소를 사용하고 싶을 수 있습니다. 이는 LAN 인터페이스로부터 할당된 DHCP 주소 또는 WAN으로부터 정적으로 할당된 주소가 될 수 있습니다.

LXD 서버를 두 개의 인터페이스로 구성하고 각각에 WAN과 LAN의 IP를 할당하면 컨테이너의 IP 주소를 컨테이너가 직면해야 하는 인터페이스를 기준으로 할당할 수 있습니다.

Rocky Linux의 9.0 버전부터 (사실상 Red Hat Enterprise Linux의 버그를 그대로 복사한 것도) 프로필을 사용하여 IP 주소를 정적으로 또는 동적으로 할당하는 방법은 작동하지 않습니다.

이를 해결하는 방법은 있지만 귀찮을 수 있습니다. 이는 macvlan에 영향을 주는 Network Manager에 대한 변경 사항과 관련이 있는 것 같습니다. macvlan을 사용하면 다른 Layer 2 주소를 가진 많은 인터페이스를 만들 수 있습니다.

지금은 RHEL을 기반으로 한 컨테이너 이미지를 선택할 때 이러한 단점을 알아두세요.

macvlan 프로필 생성 및 할당

macvlan 프로필을 만들려면 다음 명령을 사용하세요:

lxc profile create macvlan

여러 인터페이스를 가진 기계에 있어서 원하는 네트워크를 달성하기 위해 더 than one macvlan 템플릿이 필요한 경우 "lanmacvlan"이나 "wanmacvlan" 또는 기타 원하는 프로필 식별을 위해 사용할 수 있는 다른 이름을 사용할 수 있습니다. "macvlan"을 프로필 생성 문에 사용할 것인지는 완전히 당신에게 달렸습니다.

macvlan 인터페이스를 변경하려면 변경하기 전에 LXD 서버의 상위 인터페이스를 알아야 합니다. 이는 LAN (이 경우)에 할당된 IP를 가진 인터페이스입니다. 다음 명령을 사용하여 해당 인터페이스를 찾으세요:

ip addr

그런 다음 192.168.1.0/24 네트워크에서 LAN IP 할당이 있는 인터페이스를 찾습니다.

2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 40:16:7e:a9:94:85 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.106/24 brd 192.168.1.255 scope global dynamic noprefixroute enp3s0
       valid_lft 4040sec preferred_lft 4040sec
    inet6 fe80::a308:acfb:fcb3:878f/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

이 경우 인터페이스는 "enp3s0"입니다.

다음으로 프로필을 변경하세요:

lxc profile device add macvlan eth0 nic nictype=macvlan parent=enp3s0

이 명령은 macvlan 프로필에 사용되는 필요한 모든 매개변수를 추가합니다.

다음 명령을 사용하여 이 명령이 생성한 내용을 확인할 수 있습니다:

lxc profile show macvlan

다음과 유사한 결과가 표시됩니다.

config: {}
description: ""
devices:
  eth0:
    nictype: macvlan
    parent: enp3s0 
    type: nic
name: macvlan
used_by: []

프로필은 다른 많은 용도로 사용할 수 있지만, 컨테이너에 정적 IP를 할당하거나 자체 DHCP 서버를 사용하는 것은 일반적인 요구 사항입니다.

macvlan 프로필을 rockylinux-test-8에 할당하려면 다음을 수행해야 합니다:

lxc profile assign rockylinux-test-8 default,macvlan

rockylinux-test-9에 대해서도 동일한 작업을 수행합니다:

lxc profile assign rockylinux-test-9 default,macvlan

이렇게 하면 default 프로필을 사용하고 macvlan 프로필도 적용하려는 것입니다.

Rocky Linux macvlan

RHEL 배포판 및 클론에서는 Network Manager가 지속적으로 변경되고 있습니다. 이로 인해 macvlan 프로필의 작동 방식이 다른 배포판과 비교하여 제대로 작동하지 않으며, DHCP 또는 정적으로 IP 주소를 할당하는 데 약간의 추가 작업이 필요합니다.

이 모든 것이 특히 Rocky Linux와 관련이 있는 것은 아니며, 업스트림 패키지 구현과 관련이 있습니다.

LAN 또는 WAN 네트워크에서 IP 주소를 할당하고 Rocky Linux 컨테이너를 실행하려면 운영 체제의 컨테이너 버전(8.x 또는 9.x)에 따라 프로세스가 다릅니다.

Rocky Linux 9.0 macvlan - DHCP 수정

먼저, macvlan 프로필을 할당한 후에 두 컨테이너를 중지하고 다시 시작한 경우에 어떤 일이 발생하는지 설명하겠습니다.

프로필이 할당되었지만, 기본 구성인 DHCP는 변경되지 않습니다.

이를 테스트하려면 다음을 수행하세요:

lxc restart rocky-test-8
lxc restart rocky-test-9

컨테이너 목록을 다시 나열하고 rockylinux-test-9가 더 이상 IP 주소를 갖지 않는 것을 확인하세요:

lxc list

+-------------------+---------+----------------------+------+-----------+-----------+
|       NAME        |  STATE  |         IPV4         | IPV6 |   TYPE    | SNAPSHOTS |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-8 | RUNNING | 192.168.1.114 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-9 | RUNNING |                      |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+
| ubuntu-test       | RUNNING | 10.146.84.181 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+
보시다시피, Rocky Linux 8.x 컨테이너는 LAN 인터페이스에서 IP 주소를 받았지만 Rocky Linux 9.x 컨테이너는 받지 못했습니다.

문제를 더 자세히 설명하기 위해 Rocky Linux 9.0 컨테이너에서 dhclient를 실행해야 합니다. 이를 통해 macvlan 프로필이 실제로 적용되었는지 확인할 수 있습니다.

lxc exec rockylinux-test-9 dhclient

lxc list를 사용하는 새 목록은 이제 다음을 표시합니다.

+-------------------+---------+----------------------+------+-----------+-----------+
|       NAME        |  STATE  |         IPV4         | IPV6 |   TYPE    | SNAPSHOTS |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-8 | RUNNING | 192.168.1.114 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-9 | RUNNING | 192.168.1.113 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+
| ubuntu-test       | RUNNING | 10.146.84.181 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+

이는 컨테이너의 간단한 중지 및 시작으로 발생했어야 하지만 그렇지 않습니다. 매번 DHCP 할당 IP 주소를 사용한다고 가정하면 간단한 crontab 항목으로 이 문제를 해결할 수 있습니다. 이렇게 하려면 다음을 입력하여 컨테이너에 대한 셸 액세스 권한을 얻어야 합니다.

lxc exec rockylinux-test-9 bash

다음으로 dhclient에 대한 전체 경로를 결정하겠습니다. 이 작업을 수행하려면 최소 이미지를 기반으로 구축되었기 때문에 먼저 다음을 설치해야 합니다:

dnf install which

그런 다음 실행하십시오.

which dhclient

다음과 같이 반환해야 합니다:

/usr/sbin/dhclient

다음으로, root의 crontab을 변경합니다:

crontab -e

그리고 다음 줄을 추가합니다.

@reboot    /usr/sbin/dhclient

입력하는 crontab 명령은 _vi_를 사용합니다. 변경 사항을 저장하고 빠져나가려면 SHIFT+:+wq를 사용하세요.

컨테이너에서 나와 rockylinux-test-9를 재시작하세요:

SHIFT:wq!

컨테이너 목록을 다시 나열하면, 컨테이너에 DHCP 주소가 할당되었음을 확인할 수 있습니다:

lxc restart rockylinux-test-9

Rocky Linux 9.0 macvlan - 고정 IP 수정

정적 IP 주소를 할당하려면 상황이 더 복잡해집니다. Rocky Linux 9.x에서는 이제 network-scripts가 사용되지 않으므로 정적 할당을 통해 이 작업을 수행해야 하며, 컨테이너가 네트워크를 사용하는 방식 때문에 일반적인 ip route 문으로 경로를 설정할 수 없을 것입니다. 문제는 macvlan 프로필을 적용할 때 할당된 인터페이스 (이 경우 eth0)가 Network Manager에서 관리할 수 없다는 것입니다. 해결 방법은 컨테이너를 다시 시작한 후 네트워크 인터페이스의 이름을 변경하고 정적 IP를 할당하는 것입니다. 이를 위해 스크립트를 사용하고 (다시 한 번) root의 crontab에서 실행합니다. ip 명령을 사용하여 수행합니다.

이렇게 하려면 컨테이너에 대한 셸 액세스 권한을 다시 얻어야 합니다.

+-------------------+---------+----------------------+------+-----------+-----------+
|       NAME        |  STATE  |         IPV4         | IPV6 |   TYPE    | SNAPSHOTS |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-8 | RUNNING | 192.168.1.114 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-9 | RUNNING | 192.168.1.113 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+
| ubuntu-test       | RUNNING | 10.146.84.181 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+

다음으로 /usr/local/sbin에 "static"이라는 bash 스크립트를 생성합니다.

lxc exec rockylinux-test-9 bash

이 스크립트의 내용은 간단합니다.

vi /usr/local/sbin/static

여기서 우리는 무엇을 하고 있나요?

  • eth0의 이름을 관리할 수 있는 새로운 이름("net0")으로 변경합니다.
  • 할당된 컨테이너용 새로운 정적 IP(192.168.1.151)를 할당합니다.
  • 새로운 "net0" 인터페이스를 활성화합니다.
  • 인터페이스에 대한 기본 경로를 추가해야 합니다.

다음과 같이 스크립트를 실행 가능하게 만듭니다:

chmod +x /usr/local/sbin/static

다음을 root의 crontab에 @reboot 시간으로 추가합니다:

@reboot     /usr/local/sbin/static

마지막으로 컨테이너를 종료하고 다시 시작합니다:

SHIFT:wq!

잠시 기다린 다음 컨테이너 목록을 다시 나열합니다:

lxc list

성공한 결과가 표시되어야 합니다:

+-------------------+---------+----------------------+------+-----------+-----------+
|       NAME        |  STATE  |         IPV4         | IPV6 |   TYPE    | SNAPSHOTS |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-8 | RUNNING | 192.168.1.114 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-9 | RUNNING | 192.168.1.151 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+
| ubuntu-test       | RUNNING | 10.146.84.181 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+

Ubuntu macvlan

다행히도 Ubuntu의 Network Manager 구현에서는 macvlan 스택이 깨져 있지 않습니다. 이를 훨씬 쉽게 배포할 수 있습니다!

rockylinux-test-9 컨테이너와 마찬가지로 프로필을 컨테이너에 할당해야 합니다:

lxc profile assign ubuntu-test default,macvlan

DHCP가 컨테이너에 주소를 할당하는지 확인하기 위해 컨테이너를 중지하고 다시 시작합니다:

lxc restart ubuntu-test

컨테이너 목록을 다시 나열합니다:

+-------------------+---------+----------------------+------+-----------+-----------+
|       NAME        |  STATE  |         IPV4         | IPV6 |   TYPE    | SNAPSHOTS |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-8 | RUNNING | 192.168.1.114 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-9 | RUNNING | 192.168.1.151 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+
| ubuntu-test       | RUNNING | 192.168.1.132 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+

성공입니다!

정적 IP를 구성하는 방법은 약간 다르지만 전혀 어렵지 않습니다. 컨테이너의 연결에 연결된 .yaml 파일(10-lxc.yaml)을 변경해야 합니다. 이 정적 IP에서는 192.168.1.201을 사용할 것입니다:

vi /etc/netplan/10-lxc.yaml

그리고 다음과 같이 변경합니다:

network:
  version: 2
  ethernets:
    eth0:
      dhcp4: false
      addresses: [192.168.1.201/24]
      gateway4: 192.168.1.1
      nameservers:
        addresses: [8.8.8.8,8.8.4.4]

변경 사항을 저장하고(SHFT:wq!) 컨테이너를 종료합니다.

이제 컨테이너를 다시 시작합니다.

lxc restart ubuntu-test

컨테이너를 다시 나열하면 정적 IP가 표시됩니다:

+-------------------+---------+----------------------+------+-----------+-----------+
|       NAME        |  STATE  |         IPV4         | IPV6 |   TYPE    | SNAPSHOTS |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-8 | RUNNING | 192.168.1.114 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-9 | RUNNING | 192.168.1.151 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+
| ubuntu-test       | RUNNING | 192.168.1.201 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+

성공입니다!

이 장에서 사용된 예제에서는 의도적으로 설정하기 어려운 컨테이너와 덜 복잡한 두 가지를 선택했습니다. 이미지 목록에는 더 많은 Linux 버전이 있습니다. 즐겨 사용하는 것을 설치해 보고 macvlan 템플릿을 할당하고 IP를 설정해 보세요.

Author: Steven Spencer

Contributors: Ezequiel Bruni