В феврале 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}/" > |
Атрибуты 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 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 . |