В феврале 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 bashacbuild beginacbuild set-name helloacbuild copy hello /app/helloacbuild set-working-directory /appacbuild set-exec -- /app/helloacbuild write --overwrite hello-latest-linux-amd64.aci |
Если мы запустим этот скрипт, он создаст наш образ:
|
1
2
3
4
5
6
7
|
$ ./appc-hello.sh Beginning build with an empty ACISetting name of ACI to helloCopying host:hello to aci:/app/helloSetting working directory to /appSetting 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 listID NAME IMPORT TIME LAST USED SIZE LATESTsha512-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.aciimage: using image from local store for image name coreos.com/rkt/stage1-coreos:1.0.0image: using image from file hello-latest-linux-amd64.acinetworking: loading networks from /etc/rkt/net.dnetworking: loading network default with type ptp[296002.703623] hello[4]: Hello, world! |
Как и в Docker, контейнер все еще присутствует после завершения выполнения:
|
1
2
3
|
$ sudo rkt listUUID APP IMAGE NAME STATE CREATED STARTED NETWORKS6e651372 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 listUUID APP IMAGE NAME STATE CREATED STARTED NETWORKS55cb3a96 demo-api lukebond/demo-api running 4 minutes ago 4 minutes ago default:ip4=172.16.28.76e651372 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 listMACHINE CLASS SERVICErkt-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 listMACHINE CLASS SERVICErkt-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}/"> |
Атрибуты content — это шаблонные локаторы, которые можно использовать для получения URL-адреса для загрузки для конкретной ОС и архитектуры. Используя этот метод, можно также получить подписи и открытые ключи для использования rkt при проверке.
Appc image discovery настолько прост и гибок, что вы можете хранить ваши изображения практически в любом месте и в любом месте. Если вы соответствуете схеме метатегов HTTPS + HTML, rkt сможет найти ваши изображения. Реестр не требуется. Вы можете хранить изображения rkt в сервисе CoreOS Quay .
- Для полного ознакомления с тем, как работает обнаружение образа appc, прочитайте спецификацию .
Бобы
«Стручок» — это термин, популяризированный проектом 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 listUUID APP IMAGE NAME STATE CREATED STARTED NETWORKSe16bafd0 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 . |