Авторские статьи

LXD 2.0: Управление образами [5/12].


В пятой статье разбираем формат образа и как создать свой образ, чтобы в дальнейшем распространить его.

Образы контейнера

Если вы ранее использовали LXC, то помните понятие в LXC - шаблон (template). Это обычный shell скрипт, который оформлял файловую систему контейнера и немного конфигурацию. Большинство шаблонов генерировало файловую систему, делая полный bootstrapping на вашей машине. Это занимало время, не всегда работало на всех linux дистрибутивах и занимало сетевую полосу пропускания.

Возвращаясь к истории LXC, был создан шаблон "download", который позволял пользователям загружать готовый образ контейнера, созданный на центральном сервере, сильно сжатый, подписанный ключом и доступный по https. Многие пользователи оценили и переключились на этот новый способ, который гораздо быстрее и надёжнее создаёт контейнеры.

С LXD, сделан шаг вперёд - все работы основаны на образах. Все контейнеры создаются из образов, скачанные образы кэшируются и поддерживается актуальность образов в хранилище.

Взаимодействие с LXD образами

Перед тем как углубиться в формат образа, быстро пробежимся, что LXD позволяет делать с образами.

Прозрачный импорт образа

Все контейнеры создаются из образов. Образ берётся с удалённого сервера, получая полный хэш, короткий хэш или алиас, сохраняется и уже из локального образа создаётся LXD контейнер.

Примеры
lxc launch ubuntu:14.04 c1
lxc launch ubuntu:75182b1241be475a64e68a518ce853e800e9b50397d2f152816c24f038c94d6e c2
lxc launch ubuntu:75182b1241be c3

Все вышеописанные команды относятся к одному и тому же образу (на день написания статьи). Первая команда при запуске заставит образ скачаться в локальное хранилище, как кэшированный образ. Затем контейнер будет создан из данного образа.

Следующие команды при своём запуске заставят LXD проверить образ на актуальность и если образ up-to-date, то контейнер будет создан, не скачивая ничего более. Теперь когда образ закэширован в локальном хранилище, вы можете запускать, не проверяя актуальность - lxc launch 75182b1241be c4

Если у вас есть собственный локальный образ по имени my-image, то просто командуйте - lxc launch my-image c5

Если вы хотите, то можете подправить параметры кэширования и устаревания образов, как уже было описано в разделе Управление образами.

Ручное импортирование образов

Копирование с удалённого сервера

Если вы просто хотите скопировать образ с удалённого сервера в локальное хранилище БЕЗ создания контейнера, то можете использовать команду lxc image copy - lxc image copy ubuntu:14.04 local: Это было простое копирование.

Если вы хотите в дальнейшем ссылаться на образ попроще, чем указывая его fingerprint, то можете создать алиас во время копирования.
lxc image copy ubuntu:12.04 local: --alias old-ubuntu
lxc launch old-ubuntu c6

Если хотите использовать алиасы, которые даны на исходном сервере, то можно попросить LXD скопировать их.
lxc image copy ubuntu:15.10 local: --copy-aliases
lxc launch 15.10 c7

Все команды, что мы делали выше, скачивают только текущую версию образа на день операции. Если вы хотите, чтобы LXD отслеживал актуальность копии, то используйте флаг --auto-update - lxc image copy images:gentoo/current/amd64 local: --alias gentoo --auto-update

Импорт тарбола

Если кто-то предоставил вам LXD образ как единый тарбол, вы можете импортировать его - lxc image import name-tarball

Если хотите сделать алиас при импортировании, то lxc image import name-tarball --alias random-image

Иногда вы можете встретить два тарбола, один из которых содержит LXD метаданные. Имя тарбола ничего не даст, ориентируйтесь на размер - тарбол с метаданными меньше. Импортировать оба - lxc image import metadata-tarball rootfs-tarball

Импорт из URL

Команда lxc image import так же работает со специальными URL. Если у вас есть веб-сервер, который обрабатывает заголовки LXD-Image-URL и LXD-Image-Hash, то LXD может брать образы с него.

lxc image import https://dl.stgraber.org/lxd --alias busybox-amd64

При скачивании образа LXD заполняет заголовки нужным значением, которые проверит удалённый веб-сервер и вернёт соответствующий образ. Это может звучать как сервер образов бедного человека, но зато с помощью веб-сервера можно предоставить дружественный пользователю путь для импорта.

Управление локальным хранилищем образов

Теперь когда у нас есть пачка скачанных образов в нашем локальном хранилище, давайте глянем, что можно с ними сделать. Мы уже делали очевидное - создавали контейнеры из них, но есть и другие операции.

Список образов

Список всего в вашем хранилище - lxc image list

+---------------+--------------+--------+-------------------------------------------------+--------+----------+------------------------------+
|     ALIAS     | FINGERPRINT  | PUBLIC |                     DESCRIPTION                 |  ARCH  |   SIZE   |         UPLOAD DATE          |
+---------------+--------------+--------+-------------------------------------------------+--------+----------+------------------------------+
| alpine-32     | 6d9c131efab3 | yes    | Alpine edge (i386) (20160329_23:52)             | i686   | 2.50MB   | Mar 30, 2016 at 4:36am (UTC) |
+---------------+--------------+--------+-------------------------------------------------+--------+----------+------------------------------+
| busybox-amd64 | 74186c79ca2f | no     | Busybox x86_64                                  | x86_64 | 0.79MB   | Mar 30, 2016 at 4:33am (UTC) |
+---------------+--------------+--------+-------------------------------------------------+--------+----------+------------------------------+
| gentoo        | 1a134c5951e0 | no     | Gentoo current (amd64) (20160329_14:12)         | x86_64 | 232.50MB | Mar 30, 2016 at 4:34am (UTC) |
+---------------+--------------+--------+-------------------------------------------------+--------+----------+------------------------------+
| old-ubuntu    | 4d558b08f22f | no     | ubuntu 12.04 LTS amd64 (release) (20160315)     | x86_64 | 155.09MB | Mar 30, 2016 at 4:30am (UTC) |
+---------------+--------------+--------+-------------------------------------------------+--------+----------+------------------------------+
| w (11 more)   | d3703a994910 | no     | ubuntu 15.10 amd64 (release) (20160315)         | x86_64 | 153.35MB | Mar 30, 2016 at 4:31am (UTC) |
+---------------+--------------+--------+-------------------------------------------------+--------+----------+------------------------------+
|               | 75182b1241be | no     | ubuntu 14.04 LTS amd64 (release) (20160314)     | x86_64 | 118.17MB | Mar 30, 2016 at 4:27am (UTC) |
+---------------+--------------+--------+-------------------------------------------------+--------+----------+------------------------------+

Можно фильтровать по алиасу или fingerprint - lxc image list amd64

+---------------+--------------+--------+-----------------------------------------+--------+----------+------------------------------+
|     ALIAS     | FINGERPRINT  | PUBLIC |               DESCRIPTION               |  ARCH  |   SIZE   |          UPLOAD DATE         |
+---------------+--------------+--------+-----------------------------------------+--------+----------+------------------------------+
| busybox-amd64 | 74186c79ca2f | no     | Busybox x86_64                          | x86_64 | 0.79MB   | Mar 30, 2016 at 4:33am (UTC) |
+---------------+--------------+--------+-----------------------------------------+--------+----------+------------------------------+
| w (11 more)   | d3703a994910 | no     | ubuntu 15.10 amd64 (release) (20160315) | x86_64 | 153.35MB | Mar 30, 2016 at 4:31am (UTC) |
+---------------+--------------+--------+-----------------------------------------+--------+----------+------------------------------+

Можно фильтровать по ключ=значение свойств образа - lxc image list os=ubuntu

+-------------+--------------+--------+---------------------------------------------+--------+----------+------------------------------+
|    ALIAS    | FINGERPRINT  | PUBLIC |                  DESCRIPTION                |  ARCH  |   SIZE   |          UPLOAD DATE         |
+-------------+--------------+--------+---------------------------------------------+--------+----------+------------------------------+
| old-ubuntu  | 4d558b08f22f | no     | ubuntu 12.04 LTS amd64 (release) (20160315) | x86_64 | 155.09MB | Mar 30, 2016 at 4:30am (UTC) |
+-------------+--------------+--------+---------------------------------------------+--------+----------+------------------------------+
| w (11 more) | d3703a994910 | no     | ubuntu 15.10 amd64 (release) (20160315)     | x86_64 | 153.35MB | Mar 30, 2016 at 4:31am (UTC) |
+-------------+--------------+--------+---------------------------------------------+--------+----------+------------------------------+
|             | 75182b1241be | no     | ubuntu 14.04 LTS amd64 (release) (20160314) | x86_64 | 118.17MB | Mar 30, 2016 at 4:27am (UTC) |
+-------------+--------------+--------+---------------------------------------------+--------+----------+------------------------------+

Посмотреть всё что знает LXD о данном образе можно командой - lxc image info ubuntu

Fingerprint: e8a33ec326ae7dd02331bd72f5d22181ba25401480b8e733c247da5950a7d084
Size: 139.43MB
Architecture: i686
Public: no
Timestamps:
 Created: 2016/03/15 00:00 UTC
 Uploaded: 2016/03/16 05:50 UTC
 Expires: 2017/04/26 00:00 UTC
Properties:
 version: 12.04
 aliases: 12.04,p,precise
 architecture: i386
 description: ubuntu 12.04 LTS i386 (release) (20160315)
 label: release
 os: ubuntu
 release: precise
 serial: 20160315
Aliases:
 - ubuntu
Auto update: enabled
Source:
 Server: https://cloud-images.ubuntu.com/releases
 Protocol: simplestreams
 Alias: precise/i386

Редактирование образов

Удобный способ редактировать свойства образа с помощью - lxc image edit alias-or-fingerprint
Вам откроют редактор по умолчанию с чем-то вроде:

autoupdate: true
properties:
 aliases: 14.04,default,lts,t,trusty
 architecture: amd64
 description: ubuntu 14.04 LTS amd64 (release) (20160314)
 label: release
 os: ubuntu
 release: trusty
 serial: "20160314"
 version: "14.04"
public: false

Удаление образа

Удалить образ - lxc image delete alias-or-fingerprint
Вы можете не удалять принудительно кэшированные образы, так как они автоматически будут удалены LXD после истечения срока (по умолчанию 10 дней после последнего использования).

Экспорт образа

Если вы хотите получить тарболы из образа, который сейчас у вас в локальном хранилище, то поможет - lxc image export

lxc image export old-ubuntu .

Output is in .

ls -lh *.tar.xz

-rw------- 1 stgraber domain admins 656 Mar 30 00:55 meta-ubuntu-12.04-server-cloudimg-amd64-lxd.tar.xz
-rw------- 1 stgraber domain admins 156M Mar 30 00:55 ubuntu-12.04-server-cloudimg-amd64-lxd.tar.xz

Форматы образов

LXD поддерживает 2 формата образов: единый (unified) и разделённый (split). Оба эффективны, но split облегчает повторное использование файловой системы другими контейнерами. LXD фокусируется исключительно на контейнерах с системами (system container). Не поддерживает контейнеры приложений (application container) и не планирует. Образы в своей сути просты. В них файловая система контейнера и метаданные, описывающие когда сделано, когда истекает срок, архитектура и т.д.

Подробно в документации Image Format.

Единый образ. Unified image. Одиночный тарбол.

Один большой тарбол, содержащий файловую систему внутри rootfs каталога, файл metadata.yaml и шаблоны в каталоге templates. Сжатие тарбола любое, вплоть до его отсутствия. Хэш образа - это sha256 итогового тарбола.

Разделённый образ. Split image. Два тарбола.

Данный формат часто используется при развёртывании своих личных образов, обладая уже сжатым тарболом файловой системы. Второй тарбол хранит только метаданные в файле metadata.yaml и каталог шаблонов templates. Хэш образа в sha256 - это конкатенация обоих тарболов.

Метаданные образа

Типичный metadata.yaml файл выглядит схоже:

architecture: "i686"
creation_date: 1458040200
properties:
 architecture: "i686"
 description: "Ubuntu 12.04 LTS server (20160315)"
 os: "ubuntu"
 release: "precise"
templates:
 /var/lib/cloud/seed/nocloud-net/meta-data:
  when:
   - start
  template: cloud-init-meta.tpl
 /var/lib/cloud/seed/nocloud-net/user-data:
  when:
   - start
  template: cloud-init-user.tpl
  properties:
   default: |
    #cloud-config
    {}
 /var/lib/cloud/seed/nocloud-net/vendor-data:
  when:
   - start
  template: cloud-init-vendor.tpl
  properties:
   default: |
    #cloud-config
    {}
 /etc/init/console.override:
  when:
   - create
  template: upstart-override.tpl
 /etc/init/tty1.override:
  when:
   - create
  template: upstart-override.tpl
 /etc/init/tty2.override:
  when:
   - create
  template: upstart-override.tpl
 /etc/init/tty3.override:
  when:
   - create
  template: upstart-override.tpl
 /etc/init/tty4.override:
  when:
   - create
  template: upstart-override.tpl

Свойства

Есть два обязательных поля: дата создания в формате UNIX EPOCH и архитектура. Всё остальное можно оставить без установленных значений и импорт образа будет успешен.

Дополнительные свойства помогают пользователю при работе с образом. Description видно в выводе команды lxc image list. Другие свойства могут использоваться при поиске по ключ=значение. Все свойства, кроме даты создания и архитектуры, пользователь может подправить командой lxc image edit.

Шаблоны

Механизм шаблонов позволяет некоторым файлам внутри контейнера изменяться в какой-то момент во время жизненного цикла контейнера. Для этих целей используется pongo2 (templating engine). Таким образом, свойства, определённые пользователем, или LXD свойства могут менять содержимое определённых файлов. В примере, в Убунту мы вызываем cloud-init и выключаем некоторые скрипты инициализации.

Создание своих образов

LXD фокусируется на запуске полноценных Linux систем, что означает использование пользователями чистых linux дистрибутивов, а не раскатывание своего образа. Однако есть случаи, когда создание своего образа очень полезно. Например, предварительно настроенный образ для ваших серверов или архитектура, для которой никто не делает образ, кроме вас.

Превращение контейнера в образ

Самый простой способ сделать образ в LXD - это превратить контейнер в образ.

lxc launch ubuntu:14.04 my-container
lxc exec my-container bash
ваши команды, изменяющие что-либо
lxc publish my-container --alias my-new-image

Можно последние наработки, сохранённые в снимке сохранить как образ - lxc publish my-container/some-snapshot --alias some-image

Ручное создание образа

Создание своего образа не сложно:
1) Создаётся файловая система контейнера. Этот шаг целиком зависит от используемого вами linux дистрибутива. Для Ubuntu и Debian можно использовать debootstrap.
2) Если нужно, то настройте необходимое в вашем дистрибутиве.
3) Создайте тарбол файловой системы контейнера, опционально сжав его.
4) Сделайте metadata.yaml, основываясь на описанном выше.
5) Создайте ещё тарбол из файла metadata.yaml.
6) Импортируйте два тарбола в итоговый образ LXD - lxc image import metadata-tarball rootfs-tarball --alias some-name

Вероятно, шаги придётся повторить несколько раз прежде чем всё заработает как надо, добавив шаблоны и свойства.

Публикация вашего образа

Все LXD демоны действуют как сервера образов. Если не сказано иного, все образы, загруженные с удалённых хранилищ, метятся как приватные и только доверенные (trust) клиенты могут их использовать. Но вы можете сделать сервер публичным: вы должны пометить (tag) образы как public и убедиться, что LXD демон слушает сеть.

Просто запуск публичного LXD сервера

Простой путь расшарить образы состоит в запуске публичного LXD. Наберите - lxc config set core.https_address "[::]:8443"

Удалённые пользователи могут добавить ваш сервер как публичный - lxc remote add имя-сервера IP-DNS --public
Добавленный сервер можно использовать так же, как и сервера образов, доступных по умолчанию. Так как сервер добавлен с ключём --public, то у клиента никакой аутентификации не требуется и ему доступны все образы, помеченные как public. Чтобы сделать образ публичным, используйте lxc image edit и выставьте флаг public в true.

Веб-сервер

Как упоминалось ранее, lxc image import поддерживает скачивание с http сервера. Требования просты:

  • сервер должен поддерживать HTTPS с сертификатами, TLS1.2 и шифры на эллиптических кривых (EC).
  • сервер должен возвращать ответ, включая заголовки LXD-Image-Hash и LXD-Image-URL.

Если хотите сделать всё динамичнее, то сервер можно обязать проверять LXD-Server-Architectures и LXD-Server-Version, которыми обеспечит демон LXD, что позволит реализовать скачивание образа с правильной архитектурой.

Создание сервера simplestreams

Удалённые сервера ubuntu: и ubuntu-daily: не используют LXD протокол (images:), а используют протокол simplestreams. Simplestreams - формат описания сервера образов, использующий JSON. Он используется в таких инструментах как OpenStack, Juju, MAAS для поиска, скачивания и зеркалирования образов систем. LXD использует его, как и основной протокол, для получения образов.

Возможно, это не самый простой способ предоставить образы, но за дополнительной информацией можете обратиться к Simple Streams.

Итог

Надеюсь, что статья дала хорошее представление о том, как LXD управляет образами, как создавать и распространять свои собственные. Способность легко получить бит-в-бит нужный образ в современном, глобальном мире является большим шагом по сравнению со старым LXC и ведёт к более воспроизводимой инфраструктуре.

Оглавление цикла статей про LXD 2.0.
Предыдущая статья LXD 2.0: Контроль ресурсов [4/12].
Следующая статья LXD 2.0: Удалённые хосты и миграция контейнеров [6/12].

Дата последней правки: 2023-12-26 17:19:35

RSS vasilisc.com   


Разделы

Главная
Новости
Ворох бумаг
Видео Linux
Игры в Linux
Безопасность
Статьи об Astra Linux
Статьи о FreeBSD
Статьи об Ubuntu
Статьи о Snappy
Статьи об Ubuntu Phone
Статьи о Kubuntu
Статьи о Xubuntu
Статьи о Lubuntu
Статьи об Open Source
Карта сайта