Статьи

Начало работы с rkt

В феврале CoreOS объявила, что их среда выполнения контейнера rkt перешла на версию 1.0 . С момента своего первоначального объявления в декабре 2014 года rkt прошел долгий путь, поэтому сейчас самое время поближе взглянуть и рассмотреть, как он вписывается в быстро меняющуюся контейнерную экосистему.

Эта статья предназначена для людей, которые плохо знакомы с rkt, но имеют некоторый опыт работы с контейнерами Linux, например , с Docker. В этом посте я буду предполагать, что вы используете rkt с systemd в Linux.

Ты выучишь:

  • история и контекст
  • как создать образы ACI с помощью acbuild для работы с rkt
  • запуск и остановка контейнеров с помощью rkt и systemd
  • как работает обнаружение образов, в отличие от реестра Docker
  • стручки и ркт
  • cgroups и rkt

история

CoreOS начал строить rkt, потому что они чувствовали, что Docker больше не был «простым составным строительным блоком, который [они] предвидели».

rkt был анонсирован вместе с набором спецификаций appc, которые фокусировались на компоновке, безопасности, распространении изображений и открытости контейнеров. Демон Docker и монолитный инструмент CLI делают проблему компоновки — процессов в случае демона и инструментов в этом из CLI. Тот факт, что Weave и Flocker пришлось прибегнуть к обертке инструмента Docker CLI, свидетельствует о последнем (до появления плагинов).

Сообщение в блоге об rkt оказалось достаточно успешным, чтобы заставить Docker принять открытые стандарты. Проект Open Container (позже переименованный в Open Container Initiative ) с основателями appc и CoreOS Алексом Полви и Брэндоном Филипсом в качестве учредителей был запущен 22 июня 2015 года.

С тех пор мы не видели такого прогресса в стандартах от OCI, который обеспечит истинную совместимость среды обнаружения, распространения и среды выполнения контейнеров между Docker, rkt и другими. Docker явно идет ва-банк в построении платформы, в то время как rkt явно нацелен на разработчиков платформ. Это разумный шаг со стороны CoreOS, учитывая признаки того, что массовое внедрение платформы Docker может привести к блокировке поставщиков.

Особенности rkt

rkt имеет следующие особенности:

  • Модульность — rkt проектируется поэтапно (выборка изображений, настройка cgroup и сети, а также выполнение), которые могут иметь различные реализации, обеспечивая разделение привилегий и проблем.
  • Композиционируемость — rkt не является демоном, не является родительским процессом для всех ваших контейнеров (и, следовательно, может обновляться без влияния на запущенные контейнеры), и его можно комбинировать с другими инструментами. Собственно запускает образы приложений, созданные с помощью acbuild.
  • Безопасность — поддержка Intel Clear Container, SELinux и TPM, а также проверка подписи изображений.
  • Он может запускать образы Docker.

Новая версия 1.0 включает некоторые заметные исправления и улучшения:

  • Автозаполнение Bash для команд rkt
  • rkt fly — новый rkt stage1 , позволяющий запускать контейнеры с пониженной изоляцией и дополнительными привилегиями. Это полезно для запуска программного обеспечения, такого как контроллеры управления кластером.

Сборка и запуск контейнеров с ркт

rkt — это среда выполнения контейнера, а не инструмент для создания образа. Поскольку он изначально запускает контейнеры appc, мы будем использовать инструмент appc acbuild для создания образов. Давайте начнем с очень простого приложения на C:

1
2
3
4
5
6
7
8
$ cat hello.c
#include <stdio.h>
 
int main (int argc, char** argv) {
  printf("Hello, world!\n");
  return 0;
}
$ gcc -o hello -static hello.c

Создание изображений с помощью acbuild похоже на создание изображений Docker, но без Dockerfile — то есть мы запускаем последовательность команд acbuild. Мы можем поместить их в скрипт, чтобы дать нам одну строчку для построения нашего имиджа. Мы можем использовать этот простой скрипт для построения изображения:

1
2
3
4
5
6
7
8
$ cat appc-hello.sh
#!/usr/bin/env bash
acbuild begin
acbuild set-name hello
acbuild copy hello /app/hello
acbuild set-working-directory /app
acbuild set-exec -- /app/hello
acbuild write --overwrite hello-latest-linux-amd64.aci

Если мы запустим этот скрипт, он создаст наш образ:

1
2
3
4
5
6
7
$ ./appc-hello.sh
Beginning build with an empty ACI
Setting name of ACI to hello
Copying host:hello to aci:/app/hello
Setting working directory to /app
Setting exec command [/app/hello]
Writing ACI to hello-latest-linux-amd64.aci

В результате мы имеем файл hello-latest-linux-amd64.aci в нашем текущем каталоге. Это неподписанное, незашифрованное изображение контейнера appc, которое мы можем запустить с помощью rkt. Мы можем видеть это в списке изображений rkt:

1
2
3
$ sudo rkt image list
ID          NAME                    IMPORT TIME LAST USED   SIZE    LATEST
sha512-c500b17b60fa hello                   3 minutes ago   3 minutes ago   1.6MiB  false

Теперь мы можем запустить контейнер из этого изображения:

1
2
3
4
5
6
$ sudo rkt --insecure-options=image run hello-latest-linux-amd64.aci
image: using image from local store for image name coreos.com/rkt/stage1-coreos:1.0.0
image: using image from file hello-latest-linux-amd64.aci
networking: loading networks from /etc/rkt/net.d
networking: loading network default with type ptp
[296002.703623] hello[4]: Hello, world!

Как и в Docker, контейнер все еще присутствует после завершения выполнения:

1
2
3
$ sudo rkt list
UUID        APP IMAGE NAME  STATE   CREATED     STARTED     NETWORKS
6e651372    hello   hello       exited  3 seconds ago   2 seconds ago

rkt включает в себя удобную команду, которая поможет вам очистить неиспользуемые изображения и контейнеры. Чтобы очистить изображения:

1
$ sudo rkt gc

Для очистки контейнеров (контейнеров):

1
$ sudo rkt image gc

Теперь мы запустим кое-что, что делает некоторую сеть:

1
2
3
4
$ git clone https://github.com/lukebond/demo-api
$ cd demo-api
$ sudo ./appc.sh
$ sudo rkt --insecure-options=image run demo-api-latest-linux-amd64.aci

Запустите другой терминал и выполните следующее, чтобы узнать IP-адрес и проверить его с помощью curl :

1
2
3
4
5
6
$ sudo rkt list
UUID        APP     IMAGE NAME      STATE   CREATED     STARTED     NETWORKS
55cb3a96    demo-api    lukebond/demo-api   running 4 minutes ago   4 minutes ago   default:ip4=172.16.28.7
6e651372    hello       hello           exited  2 days ago  2 days ago 
$ curl 172.16.28.7:9000
"Hello, world 172.16.28.7!"

бревна

Для доступа к журналам наших контейнеров мы используем systemd’s journalctl , например:

1
2
3
4
5
6
7
8
$ machinectl list
MACHINE                                  CLASS     SERVICE
rkt-e16bafd0-3b0b-4ade-b482-d6de42d35e8c container nspawn
 
1 machines listed.
$ journalctl -M rkt-e16bafd0-3b0b-4ade-b482-d6de42d35e8c
-- Logs begin at Fri 2016-02-26 12:57:14 GMT, end at Fri 2016-02-26 12:57:14 GMT. --
...

Остановка контейнеров

Поскольку используемая нами реализация rkt использует systemd-nspawn в качестве основного инструмента для запуска контейнеров, поэтому мы используем systemd для остановки контейнеров:

1
2
3
4
5
6
$ machinectl list
MACHINE                                  CLASS     SERVICE
rkt-55cb3a96-8199-4d08-a998-713b631d3210 container nspawn
 
1 machines listed.
$ machinectl kill rkt-55cb3a96-8199-4d08-a998-713b631d3210

По сообщениям, в следующем выпуске появится нативная команда rkt для остановки контейнеров.

Подписание изображений

Вы заметите, что мы передали --insecure-options=image для rkt run . Это отключает проверку подписи, которая по умолчанию включена в rkt. Подписывать изображения легко, используя стандартные инструменты gpg. Инструкции можно найти здесь .

Преобразование изображений Docker

Инструмент docker2aci можно использовать для загрузки изображений Docker и преобразования их в формат ACI приложения. Получить инструмент здесь .

Преобразование образа Docker так же просто, как:

1
$ docker2aci docker://lukebond/demo-api

Это сократит слои Docker в один файл ACI. Если вы предпочитаете хранить их отдельно, передайте --nosquash , и он установит правильные зависимости между слоями.

Прямой запуск образов Docker

rkt также может запускать образы Docker напрямую, без предварительного преобразования их в отдельный этап сборки.

1
$ sudo rkt run --insecure-options=image docker://lukebond/demo-api

Здесь требуется опция «небезопасный», потому что Docker не поддерживает ту же проверку подписи образа, что и rkt.

Обнаружение и распространение изображений

В то время как Docker поддерживает обнаружение изображений через реестры (по умолчанию, Docker Hub или другой), rkt следует спецификации appc и использует комбинацию meta тегов HTTPS и HTML через URL-адрес обнаружения.

Например, посмотрите на это для CoreOS ‘Etcd:

1
2
3
$ curl -sL https://quay.io/coreos/etcd | grep meta | grep discovery
  <meta name="ac-discovery" content="quay.io https://quay.io/c1/aci/{name}/{version}/{ext}/{os}/{arch}/">
  <meta name="ac-discovery-pubkeys" content="quay.io https://quay.io/aci-signing-key">

Атрибуты content — это шаблонные локаторы, которые можно использовать для получения URL-адреса для загрузки для конкретной ОС и архитектуры. Используя этот метод, можно также получить подписи и открытые ключи для использования rkt при проверке.

Appc image discovery настолько прост и гибок, что вы можете хранить ваши изображения практически в любом месте и в любом месте. Если вы соответствуете схеме метатегов HTTPS + HTML, rkt сможет найти ваши изображения. Реестр не требуется. Вы можете хранить изображения rkt в сервисе CoreOS Quay .

Бобы

«Стручок» — это термин, популяризированный проектом Kubernetes. Вы можете определить его как набор приложений, которые логически сгруппированы и должны запускаться на одном компьютере. Короче говоря, они должны быть запланированы как единое целое.

Начиная с версии 0.5, стручки были первоклассным гражданином в rkt. Спецификация appc определяет модуль как «развертываемый, исполняемый модуль… список приложений, которые будут запускаться вместе в общем контексте выполнения», который включает конфигурацию сети и изоляторы. Независимо от того, выполняете ли вы один процесс или несколько, rkt все еще считает его модулем.

Давайте рассмотрим пример запуска двух приложений, которые должны общаться друг с другом. Мы будем использовать супер-тривиальное расширение вышеупомянутого приложения demo-api , которое имеет одну конечную точку GET, которая увеличивает счетчик в Redis при каждом запросе.

1
2
3
4
$ git clone https://github.com/lukebond/demo-api-redis
$ cd demo-api-redis
$ sudo ./appc.sh
$ sudo rkt run --volume volume--var-lib-redis,kind=host,source=/var/lib/redis quay.io/quay/redis --insecure-options=image --port=http:9000 --set-env REDIS_HOST=localhost ~/Development/demo-api-redis/demo-api-redis-latest-linux-amd64.aci

Выше будет создан ACI для приложения, а затем запущен один модуль, содержащий Redis (подписанный ACI, извлеченный из quay.io) и демонстрационное приложение. Передача --port отображает порт на хост, а --set-env сообщает демонстрационному приложению, как связаться с Redis. Аргумент --volume будет монтировать каталог хоста /var/lib/redis в каталог данных контейнера Redis, где он будет записывать свои снимки.

01
02
03
04
05
06
07
08
09
10
$ sudo rkt list
UUID      APP             IMAGE NAME                STATE   CREATED       STARTED       NETWORKS
e16bafd0  redis           quay.io/quay/redis:latest running 6 seconds ago 6 seconds ago default:ip4=172.16.28.6
          demo-api-redis  lukebond/demo-api-redis      
$ curl 172.16.28.6:9000
"Hello, world 172.16.28.6! 1 hits."
$ curl 172.16.28.6:9000
"Hello, world 172.16.28.6! 2 hits."
$ curl 172.16.28.6:9000
"Hello, world 172.16.28.6! 3 hits."

Отлично, это работает!

Ограничение ресурсов с CGroups

rkt позволяет ограничить процессор и память, которые могут использоваться контейнером. Эти ограничения выражены в единицах, смоделированных по модели ресурсов Kubernetes . Ограничения ЦП выражаются в милли-ядрах (1/1000 ядра) и в памяти в МБ / ГБ.

Например, чтобы запустить приведенный выше пример и ограничить использование памяти Redis 512 МБ, а ЦП — половиной ядра, мы могли бы использовать следующую команду run :

1
$ sudo rkt run --cpu=500 --memory=512M quay.io/quay/redis --insecure-options=image --port=http:9000 --set-env REDIS_HOST=localhost demo-api-redis-latest-linux-amd64.aci

В зависимости от того, как настроен swap на вашем хосте, вы можете обнаружить, что контейнеры используют больше памяти, чем вы указали в rkt run --memory . При отключенном свопе это будет жесткое ограничение. Если включен режим подкачки, вы увидите, что процесс использует больше памяти, поскольку система настроена так, чтобы она могла расширять свою память с помощью подкачки.

ркт для строителей платформ

Цели разработки CoreOS для rkt привели к созданию среды выполнения контейнера, которая идеально подходит для построения контейнерных платформ.

Путь Dock’а к олл-ину в построении полной платформы, кульминацией которого является недавний выпуск Docker Datacenter и Universal Control Plane , обеспечивает отличный опыт конечного пользователя; однако построить платформу поверх Docker сложно из-за недостаточной компоновки.

Низкоуровневая природа rkt, его модульная и комбинируемая конструкция делают его отличным выбором для построения контейнерных платформ. Вот где я вижу, что rkt находит свою нишу в контейнерной экосистеме.

Вывод

Для такого молодого проекта, rkt прошел долгий путь. Теперь время выполнения ядра приближается к паритету возможностей Docker. Последний выпуск v1.0 представляет собой выпуск rkt в готовую к работе среду выполнения контейнеров, которая является подлинной альтернативой Docker.

Я показал вам основы построения и запуска контейнеров с помощью acbuild и rkt, и теперь вы должны знать достаточно, чтобы запускать контейнеры с rkt точно так же, как с Docker. Конечно, есть еще кое-что, если мы хотим запустить rkt в производстве, включая многосетевые сети, мониторинг и интеграцию с существующими инструментами контейнеров, такими как Weave, Flocker и Sysdig.

Удачного рктинга!

Ссылка: Начало работы с rkt от нашего партнера по JCG Люка Бонда в блоге Codeship Blog .