Перейти до змісту

Розділ 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+:+wq.

Вийдіть із контейнера та перезапустіть 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