Статьи

Интеграция Carina с вашим конвейером непрерывной интеграции

Rackspace недавно объявила о публичном бета-тестировании своего предложения Docker Carina. Это является частью стратегических усилий по созданию конкурентоспособного внутреннего контейнерного решения, которое интегрируется с набором инструментов и услуг Rackspace, особенно с известной «Фанатической поддержкой».

До сих пор вы могли запускать кластеры Docker в инфраструктуре Rackspace, предоставляя виртуальные машины или серверы без поддержки и создавая собственный кластер Docker. С Carina, сложность выполнения этого, а также накладные расходы на инфраструктуру, значительно уменьшаются.

В этом посте я расскажу о Carina, о том, как ее использовать и как интегрировать ее в свой конвейер непрерывного развертывания с помощью Codeship.

Как работает Карина Rackspace?

Поддержка развертывания Carina — это OpenStack Magnum , который обеспечивает оркестровку контейнеров в качестве первоклассного ресурса. Это позволяет развертываниям OpenStack создавать узлы Magnum вместе с традиционными узлами Nova, используя либо Docker Swarm, Kubernetes, либо Apache Mesos в качестве механизма оркестровки.

Конечным результатом является однородный, автоматизированный и масштабируемый кластер Docker, на котором работает ваш любимый механизм оркестровки контейнеров, поверх LXC, работающего на «голых железных» серверах.

Все это доступно через отдельный интерфейс; API Carina позволяет управлять механизмом масштабирования и оркестровки хоста, а доступ к кластеру и создание контейнера обрабатываются с помощью стандартного API Docker. На этой ранней стадии Карина поддерживает только Docker Swarm.

Интегрирование-Carina-с-Your-CI-Pipeline

Карина называет хосты в кластере Docker «сегментами». Отдельный термин используется для различия между операционными системами с установленным Docker Engine, работающими на виртуальных машинах или на серверах (хостах) с открытым исходным кодом, и Docker Engine, работающими непосредственно в контейнере поверх LXC. С помощью этого метода команда контейнеров OpenStack может значительно увеличить скорость.

Учитывая состояние этой бета-версии и тенденцию Rackspace склоняться к простым, удобным для пользователя интерфейсам, которые жертвуют настройкой для удобства использования, трудно сказать, какая часть Carina является неполной и какая намеренно не поддерживается.

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

Используя Карину

Carina поддерживает как веб-интерфейс, так и интерфейс командной строки, поддерживаемый API. Вы можете узнать, как установить CLI в документации по началу работы . Чтобы начать использовать веб-интерфейс, посетите сайт Carina . Оба интерфейса обеспечивают одинаковый уровень контроля над вашим кластером, однако интерфейс командной строки имеет более традиционный вид основного набора инструментов Docker.

Создать аккаунт в Rackspace бесплатно, а бета-версия Carina в настоящее время может свободно экспериментировать до определенного размера. Чтобы использовать CLI, вам нужно установить имя пользователя Rackspace и ключ API в ENV или в командной строке:

1
2
export CARINA_USERNAME=myuse
export CARINA_APIKEY=abcdef1234

Теперь вы можете взаимодействовать с вашими кластерами Carina:

01
02
03
04
05
06
07
08
09
10
11
12
bfosberry~$ carina list
ClusterName         Flavor              Nodes               AutoScale           Status
testcluster         container1-4G       1                   false               active
bfosberry~$ carina grow --nodes=2 testcluster
testcluster         container1-4G       1                   false               growing
bfosberry~$ carina list
ClusterName         Flavor              Nodes               AutoScale           Status
testcluster         container1-4G       3                   false               active
bfosberry~$ carina get testcluster
testcluster         container1-4G       3                   false               active
bfosberry~$ carina delete testcluster
testcluster         container1-4G       3                   false               deleting

Большинство команд поддерживают синхронный режим, в котором при указании флага --wait команда блокируется до завершения удаленного действия.

1
2
bfosberry~$ carina create --nodes=2 --autoscale --wait testcluster2
testcluster2        container1-4G       2                   true                active

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
bfosberry~$ eval `carina env testcluster2`
bfosberry~$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
08:50:38-bfosberry~$ docker info
Containers: 3
Images: 2
Role: primary
Strategy: spread
Filters: health, port, dependency, affinity, constraint
Nodes: 1
 5a00874f-6b1d-4c9e-bd92-411b9cd3a167-n1: 104.130.22.20:42376
  └ Containers: 3
  └ Reserved CPUs: 0 / 12
  └ Reserved Memory: 0 B / 4.2 GiB
  └ Labels: executiondriver=native-0.2, kernelversion=3.18.21-1-rackos, operatingsystem=Debian GNU/Linux 7 (wheezy) (containerized), storagedriver=aufs
CPUs: 12
Total Memory: 4.2 GiB
Name: f78aba1baa5c
bfosberry~$ docker run -it ubuntu
root@1038df1314a7:/# exit
bfosberry~$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                                    NAMES
1038df1314a7        ubuntu              "/bin/bash"              28 seconds ago      Exited (0) 18 seconds ago                                            5a00874f-6b1d-4c9e-bd92-411b9cd3a167-n1/naughty_mestorf
f78aba1baa5c        swarm:1.0.0         "/swarm manage -H=tcp"   5 minutes ago       Up 5 minutes                2375/tcp, 104.130.22.20:2376->2376/tcp   5a00874f-6b1d-4c9e-bd92-411b9cd3a167-n1/swarm-manager
ff87c8a61e49        swarm:1.0.0         "/swarm join --addr=1"   5 minutes ago       Up 5 minutes                2375/tcp                                 5a00874f-6b1d-4c9e-bd92-411b9cd3a167-n1/swarm-agent
cbe07f4d6f56        cirros              "/sbin/init"             5 minutes ago                                                                            5a00874f-6b1d-4c9e-bd92-411b9cd3a167-n1/swarm-data

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

Как только продукт выйдет из бета-версии, он должен стать более заметным и доступным. В целом, служба поддержки Rackspace очень отзывчива, а команда Carina активна в своем IRC-канале, поэтому обязательно обратитесь за поддержкой.

Интеграция с вашим CD-конвейером

Поскольку Carina предоставляет стандартную конечную точку Docker, получить доступ и внедрить изменения довольно просто. Я приведу краткий пример того, как получить и поделиться доступом к вашему кластеру Docker в конвейере CD с помощью Carina; однако имейте в виду, что этот рабочий процесс не применяется, если какой-либо контейнер PAAS, например Rancher или Deis, выполняется поверх кластера Docker.

В этом сценарии вы можете просто развернуться в соответствующем PAAS, не взаимодействуя напрямую с Carina. В этом примере я буду использовать платформу Codeship Docker для своего конвейера CD.

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

Настройка доступа Карины

Давайте начнем с сохранения наших учетных данных Carina и их шифрования с использованием нашего ключа AES проекта.

1
2
3
# carina.env
CARINA_USERNAME=myuser
CARINA_APIKEY=abcdef12345
1
2
$ jet encrypt carina.env carina_env.encrypted
$ git add carina_env.encrypted

Если вы не планируете удалять carina.env , возможно, стоит добавить это в наш .gitignore чтобы мы не случайно зафиксировали его в нашем репо.

1
2
3
# .gitignore
carina.env
*.aes

Теперь мы можем ссылаться на эти зашифрованные данные среды на нашем этапе развертывания, добавив их в соответствующую службу. При этом все шаги, выполняемые в службе развертывания, будут иметь учетные данные, которые мы зашифровали как часть среды.

1
2
3
4
# codeship-services.yml
carina_deploy:
  build: ./
  encrypted_env_file: carina_env.encrypted

Нам также нужно будет создать образ Docker с двоичным carina который позволит нам проверять учетные данные кластера Docker. Используя этот образ, мы можем внести изменения в наш кластер Docker, используя стандартные команды Docker.

01
02
03
04
05
06
07
08
09
10
11
12
13
FROM debian:jessie
 
# install deps
RUN apt-get update && apt-get install -y apt-transport-https wget
 
# install Docker
RUN echo 'deb https://apt.dockerproject.org/repo debian-jessie main' > /etc/apt/sources.list.d/docker.list
RUN apt-get update && apt-get install -y --force-yes docker-engine
 
# install carina
RUN wget -O /usr/bin/carina
https://github.com/getcarina/carina/releases/download/v0.9.1/carina-linux-amd64
RUN chmod +x /usr/bin/carina
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
$ root@952340f468c5:/# carina credentials --path="/tmp/carain" mycluster
$ root@952340f468c5:/# source '/tmp/carina/docker.env'
$ root@952340f468c5:/# docker info
Containers: 5
Images: 3
Role: primary
Strategy: spread
Filters: health, port, dependency, affinity, constraint
Nodes: 1
 5a00874f-6b1d-4c9e-bd92-411b9cd3a167-n1: 104.130.22.20:42376
  └ Containers: 5
  └ Reserved CPUs: 0 / 12
  └ Reserved Memory: 0 B / 4.2 GiB
  └ Labels: executiondriver=native-0.2, kernelversion=3.18.21-1-rackos, operatingsystem=Debian GNU/Linux 7 (wheezy) (containerized), storagedriver=aufs
CPUs: 12
Total Memory: 4.2 GiB
Name: f78aba1baa5c

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

1
2
3
# codeship-steps.yml
- service: carina_deploy
  command: deploy_myapp

Наконец, это развертывание может быть выполнено с использованием jet steps . Используя простой скрипт и двоичный файл Carina, ваш конвейер непрерывного развертывания может обновлять кластер Docker, останавливая и запуская контейнеры и вытягивая обновленные образы.

Будущее Карины

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

Большая часть возможностей Carina будет реализована через пользователей, работающих под управлением таких платформ, как Rancher и Deis, а также Rackspace, постепенно интегрирующих другие свои сервисы. Это обеспечит очень однородную платформу для запуска приложений, а не только контейнеров.

По своим возможностям Carina отстает от других платформ Docker, поэтому по мере развития продукта будет интересно посмотреть, как они планируют поддерживать экосистему плагинов и новые функции, такие как CRIU. Планируется обеспечить поддержку реестра, поэтому, если Rackspace сможет создать мощную базу талантов поддержки Docker и предоставить поддерживаемую платформу Docker, это может стать реальным конкурентом для будущего продукта Tutum GA.

Как платформа, Карина имеет много обещаний. При правильном направлении продукт может стать конкурентоспособным как среди провайдеров производительности, так и для удобных для пользователей контейнерных хостингов.

Ссылка: Интеграция Carina с вашим конвейером непрерывной интеграции от нашего партнера JCG Брендана Фосберри в блоге Codeship Blog .