Розділ 6: Профілі¶
У цій главі вам потрібно буде виконувати команди як непривілейований користувач ("lxdadmin", якщо ви слідкували за цим із самого початку цієї книги).
Під час встановлення LXD ви отримуєте профіль за замовчуванням, і цей профіль не можна видалити чи змінити. Тим не менш, ви можете використовувати профіль за замовчуванням для створення нових профілів для використання з вашими контейнерами.
Якщо ви перевірите свій список контейнерів, ви помітите, що IP-адреса в кожному випадку походить з мостового інтерфейсу. У виробничому середовищі ви можете використовувати щось інше. Це може бути адреса, призначена DHCP з вашого інтерфейсу LAN, або навіть статична адреса з вашої WAN.
Якщо ви налаштуєте свій сервер LXD з двома інтерфейсами та призначите кожному IP-адресу в глобальній і локальній мережах, можна призначити IP-адреси вашого контейнера на основі інтерфейсу, до якого контейнер має бути спрямований.
Починаючи з версії 9.0 Rocky Linux (і фактично будь-якої помилки для копії помилок Red Hat Enterprise Linux) метод статичного або динамічного призначення IP-адрес із профілями не працює.
Є способи обійти це, але це дратує. Схоже, це якось пов’язано зі змінами, внесеними в Network Manager, які впливають на macvlan. macvlan дозволяє створювати багато інтерфейсів з різними адресами рівня 2.
Наразі майте на увазі, що це має недоліки під час вибору зображень контейнерів на основі RHEL.
Створення профілю macvlan і його призначення¶
Щоб створити наш профіль macvlan, скористайтеся цією командою:
lxc profile create macvlan
Якщо ви користуєтеся комп’ютером із кількома інтерфейсами та бажаєте мати більше одного шаблону macvlan на основі мережі, яку ви хочете охопити, ви можете використати «lanmacvlan» або «wanmacvlan» або будь-яке інше ім’я, яке ви бажаєте використати для ідентифікації профілю. Використовувати «macvlan» у заяві про створення профілю повністю залежить від вас.
Ви хочете змінити інтерфейс macvlan, але перш ніж це зробити, вам потрібно знати, що таке батьківський інтерфейс для нашого сервера LXD. Це буде інтерфейс, якому призначено IP-адресу локальної мережі (у цьому випадку). Щоб дізнатися, що це за інтерфейс, використовуйте:
ip addr
Шукайте інтерфейс із призначенням IP LAN у мережі 192.168.1.0/24:
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
Тут сказано, що вам потрібен профіль за замовчуванням, а також застосувати профіль macvlan.
Rocky Linux macvlan¶
У дистрибутивах і клонах RHEL Network Manager постійно змінювався. На початку Rocky Linux 8 профіль macvlan був зламаний.
Майте на увазі, що нічого з цього не має нічого спільного з Rocky Linux, а лише з реалізацією пакета вище.
Якщо ви хочете запускати контейнери Rocky Linux і використовувати macvlan для призначення IP-адреси з вашої мережі LAN або WAN, процес залежить від версії контейнера операційної системи (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 отримав IP-адресу від інтерфейсу LAN, тоді як контейнер Rocky Linux 9.x ні.
Щоб детальніше продемонструвати проблему, вам потрібно запустити dhclient
у контейнері Rocky Linux 9.0. Це покаже нам, що профіль macvlan є фактично застосованим:
lxc exec rockylinux-test-9 dhclient
Інший список контейнерів тепер показує наступне:
+-------------------+---------+----------------------+------+-----------+-----------+
| 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
. Для цього, оскільки цей контейнер створено з мінімального зображення, вам потрібно спочатку встановити which
:
dnf install which
потім запустіть:
which dhclient
який має повернути:
/usr/sbin/dhclient
Далі змінимо crontab користувача root:
crontab -e
І додайте цей рядок:
@reboot /usr/sbin/dhclient
Введена команда crontab використовує vi. Щоб зберегти зміни та вийти, використовуйте Shift+:+w+q.
Вийдіть із контейнера та перезапустіть rockylinux-test-9:
lxc restart rockylinux-test-9
Інший список показує, що контейнеру призначено адресу DHCP:
+-------------------+---------+----------------------+------+-----------+-----------+
| 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 |
+-------------------+---------+----------------------+------+-----------+-----------+
Rocky Linux 9.0 macvlan – виправлення статичної IP-адреси¶
Для статичного призначення IP-адреси все стає ще заплутанішим. Оскільки network-scripts
тепер застаріло в Rocky Linux 9.x, єдиний спосіб зробити це – через статичне призначення, і через те, як контейнери використовують мережу, ви не зможете щоб встановити маршрут за допомогою звичайного оператора ip route
. Проблема полягає в тому, що інтерфейс, призначений під час застосування профілю macvlan (у цьому випадку eth0), не можна керувати за допомогою Network Manager. Виправлення полягає в перейменуванні мережевого інтерфейсу контейнера після перезапуску та призначенні статичної IP-адреси. Ви можете зробити це за допомогою сценарію та запустити (ще раз) у crontab root. Зробіть це за допомогою команди ip
.
Для цього вам потрібно знову отримати доступ оболонки до контейнера:
lxc exec rockylinux-test-9 bash
Далі ми створимо сценарій bash у /usr/local/sbin
під назвою «static»:
vi /usr/local/sbin/static
Вміст цього сценарію простий:
#!/usr/bin/env bash
/usr/sbin/ip link set dev eth0 name net0
/usr/sbin/ip addr add 192.168.1.151/24 dev net0
/usr/sbin/ip link set dev net0 up
/usr/sbin/ip route add default via 192.168.1.1
Що ми тут робимо?
- ви перейменовуєте eth0 на нове ім'я, яким ми можемо керувати ("net0")
- ви призначаєте новий статичний IP, який ми виділили для нашого контейнера (192.168.1.151)
- ви відкриваєте новий інтерфейс "net0"
- вам потрібно додати маршрут за замовчуванням для нашого інтерфейсу
Зробіть наш сценарій виконуваним за допомогою:
chmod +x /usr/local/sbin/static
Додайте це до root-файлу crontab для контейнера з часом @reboot:
@reboot /usr/local/sbin/static
Нарешті, вийдіть з контейнера та перезапустіть його:
lxc restart rockylinux-test-9
Зачекайте кілька секунд і знову виведіть список контейнерів:
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¶
На щастя, у реалізації Network Manager в Ubuntu стек 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]
Збережіть зміни та вийдіть з контейнера.
Перезапустіть контейнер:
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, Ganna Zhyrnova