Проблемы с Docker Swarm при запуске TeamCity с использованием rexray / ebs для сохранения диска в AWS EBS

Я новичок в Docker, но начал думать о производственных настройках, поэтому мне нужно решить проблему сохранения данных при использовании Docker Swarm. Я решил начать с создания инфраструктуры развертывания (TeamCity для сборок и NuGet плюс «реестр» [https://https://hub.docker.com/_/registry/]] для хранения изображений).

Я начал с TeamCity. Очевидно, что для работы требуется постоянство данных. Я могу запустить TeamCity в контейнере с диском EBS, и все выглядит так, как будто он работает нормально - TeamCity выполняет шаги настройки, и мои диски TeamCity появляются в AWS EBS, но затем рабочий узел TeamCity выделяется для выключается, и процесс установки останавливается.

Вот все шаги, которые я выполняю:

Этап 1 - Настройка машины:

  • Создайте один экземпляр AWS для мастера
  • Создайте два экземпляра AWS для работников
  • Все это 64-битные экземпляры Ubuntu t2.mircro
  • Для удобства создайте три эластичных IP-адреса и назначьте их указанным выше машинам.
  • Установите Docker на все узлы с помощью этого: https://docs.docker.com/install/linux/docker-ce/ubuntu/
  • Установите Docker Machine на все узлы с помощью этого: https://docs.docker.com/machine/install-machine/
  • Установите Docker Compose на все узлы, используя следующее: https://docs.docker.com/compose/install/

Этап 2. Настройка Docker Remote на главном компьютере.

$ sudo docker run -p 2375:2375 --rm -d -v /var/run/docker.sock:/var/run/docker.sock jarkt/docker-remote-api

Этап 3 - установите плагин rexray / ebs на всех компьютерах:

$ sudo docker plugin install --grant-all-permissions rexray/ebs REXRAY_PREEMPT=true EBS_ACCESSKEY=XXX EBS_SECRETKEY=YYY

[Я поднял правильные значения из AWS для XXX и YYY]

  • Я тестирую это, используя:

    $ sudo docker volume create --driver = rexray / ebs --name = delete --opt = size = 2

    $ sudo docker volume rm удалить

  • Все три узла могут без проблем создавать и удалять диски в AWS EBS.

Этап 4 - Настройка роя:

  • Запустите это на мастере:

    $ sudo docker swarm init --advertise-addr eth0: 2377

  • Это дает команду для запуска каждому из рабочих процессов, которая выглядит следующим образом:

    $ sudo docker swarm join --token XXX 1.2.3.4:2377

  • Они отлично работают на рабочих машинах.

Этап 5. Настройка визуализации с помощью Remote Powershell на моем локальном компьютере:

$ $env:DOCKER_HOST="{master IP address}:2375"

$ docker stack deploy --with-registry-auth -c viz.yml viz

viz.yml выглядит так:

version: '3.1'

services:
    viz:
        image: dockersamples/visualizer
        volumes:
            - "/var/run/docker.sock:/var/run/docker.sock"
        ports:
            - "8080:8080"
        deploy:
            placement:
                constraints:
                    - node.role==manager
  • Это прекрасно работает и позволяет мне визуализировать свой рой.

Этап 6. Установка TeamCity с помощью Remote Powershell на моем локальном компьютере:

$ docker stack deploy --with-registry-auth -c docker-compose.yml infra

docker-compose.yml выглядит так:

version: '3'

services:
  teamcity:
    image: jetbrains/teamcity-server:2017.1.2
    volumes:
        - teamcity-server-datadir:/data/teamcity_server/datadir
        - teamcity-server-logs:/opt/teamcity/logs
    ports:
        - "80:8111"

volumes:
  teamcity-server-datadir:
   driver: rexray/ebs
  teamcity-server-logs:
   driver: rexray/ebs
  • [Включение NGINX в качестве прокси - это один из последующих шагов в моем списке дел.]

  • Я вижу, что в AWS EBS появляются как требуемые диски, так и контейнер в моей визуализации роя.

  • Однако через некоторое время после просмотра экрана прогресса в TeamCity рабочий компьютер, содержащий экземпляр TeamCity, отключается, и процесс внезапно завершается.

  • Я не понимаю, что делать дальше. Я даже не знаю, где искать логи.

Любая помощь с благодарностью получена!

Ваше здоровье,

Стив.


person Steve_333    schedule 13.05.2018    source источник
comment
P.S. Я не привержен идее использования rexray / ebs, но это действительно выглядело как самый популярный и простой способ добиться сохранения данных после некоторого расширения Googling. Мне очень нравится идея хранить данные в отдельном томе EBS.   -  person Steve_333    schedule 13.05.2018
comment
Хорошо, я провел небольшое исследование использования EFS для общих дисков в AWS и настроил его между тремя моими серверами. В результате возникла та же ошибка, поэтому я не думаю, что проблема связана с плагином rexray / ebs. Интересно, проблема ли это в TeamCity. Если вы настроили контейнер TeamCity с использованием локального общего ресурса в Docker Swarm, он работает нормально. Может быть, TeamCity не любит использовать общие диски?   -  person Steve_333    schedule 14.05.2018
comment
Обновление: похоже, я ошибался! Похоже, проблема в Docker Swarm. TeamCity даже не работает с использованием локального хранилища (на хосте) в режиме Swarm. Однако он хорошо работает при использовании простого docker-compose. Компонент rexray также хорошо работает с docker-compose. Итак, что я делаю не так с моей конфигурацией Docker Swarm, из-за которой TeamCity останавливается через определенное время?   -  person Steve_333    schedule 14.05.2018
comment
Добро пожаловать в Stack Overflow! Приятно, что вы хотите поделиться своим опытом работы с Docker Swarm, но Stack Overflow - не подходящее место для этого. Возможно, вы предпочтете использовать платформу для публикации, например hackernoon.com или dev.to. Stack Overflow - это платформа для поиска лучших ответов на конкретные вопросы.   -  person anothernode    schedule 15.05.2018
comment
Извинения - я действительно начал с того, что задал вопрос, но после большого количества исследований я смог ответить на свои вопросы, поэтому решил, что должен поделиться тем, что узнал. На самом деле довольно сложно найти хорошую информацию о Docker Swarm. Я подумаю о добавлении сообщения в свой блог: code-smart.org.uk   -  person Steve_333    schedule 17.05.2018
comment
Не надо извиняться. Я искренне думаю, что это здорово, что вы хотите поделиться своим исследованием! Просто это неправильный формат для Stack Overflow. Я уверен, что вы могли бы превратить это в классное сообщение в блоге, и если вы разместите его на dev.to (например) , вы, вероятно, также получите обратную связь.   -  person anothernode    schedule 17.05.2018


Ответы (3)


Я нашел способ получить журналы для моей службы. Сначала сделайте это, чтобы перечислить сервисы, которые создает стек:

$ sudo docker service ls 

Затем сделайте это, чтобы просмотреть журналы службы:

$ sudo docker service logs --details {service name}

Теперь мне просто нужно залезть в логи и посмотреть, что пошло не так ...

person Steve_333    schedule 14.05.2018

Обновить

В логах обнаружил следующую ошибку:

infra_teamcity.1.bhiwz74gnuio@ip-172-31-18-103    |  [2018-05-14 17:38:56,849]  ERROR - r.configs.dsl.DslPluginManager - DSL plugin compilation failed
infra_teamcity.1.bhiwz74gnuio@ip-172-31-18-103    |  exit code: 1
infra_teamcity.1.bhiwz74gnuio@ip-172-31-18-103    |  stdout: #
infra_teamcity.1.bhiwz74gnuio@ip-172-31-18-103    |  # There is insufficient memory for the Java Runtime Environment to continue.
infra_teamcity.1.bhiwz74gnuio@ip-172-31-18-103    |  # Native memory allocation (mmap) failed to map 42012672 bytes for committing reserved memory.
infra_teamcity.1.bhiwz74gnuio@ip-172-31-18-103    |  # An error report file with more information is saved as:
infra_teamcity.1.bhiwz74gnuio@ip-172-31-18-103    |  # /opt/teamcity/bin/hs_err_pid125.log
infra_teamcity.1.bhiwz74gnuio@ip-172-31-18-103    |
infra_teamcity.1.bhiwz74gnuio@ip-172-31-18-103    |  stderr: Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000e2dfe000, 42012672, 0) failed; error='Cannot allocate memory' (errno=12)

Это заставляет меня думать, что это проблема с памятью. Я собираюсь попробовать это еще раз с лучшим экземпляром AWS и посмотреть, как у меня получится.

person Steve_333    schedule 14.05.2018

Обновление 2

Использование более крупного экземпляра AWS решило проблему. :)

Затем я обнаружил, что rexray / ebs не любит, когда контейнер переключается между хостами в моем рое - он дублирует тома EBS, поэтому сохраняет по одному на каждой машине. Мое решение состояло в том, чтобы использовать диск EFS в AWS и подключить его к каждому возможному хосту. Затем я обновил файл fstab, чтобы диск перемонтировался при каждой перезагрузке. Работа сделана. Теперь рассмотрим использование обратного прокси ...

person Steve_333    schedule 14.05.2018