Рубрики
Uncategorized

Использование Ansible для оркестровки контейнеров

Существует почти столько же способов развертывания приложений, сколько существует приложения. В сообщении мы … с меткой Docker, DevOps, WebDev.

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

Ansible это платформа для управления серверами и того, что работает на них. В Ansible вы используете один или несколько так называемых Playbook для выполнения изменений на одном или нескольких серверах одновременно. У игровой книги есть настройка, с которыми я должен бегать, и что он должен делать, так называемые задачи. Задача может состоять в том, чтобы установить пакет или убедиться, что контейнер работает.

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

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

Для оркестровки контейнеров есть много способов справиться с ними. Общее решение — Kubernetes Это делает оркестровку легкой. Одним из недостатков является то, что он добавляет сложность, особенно при запуске в меньших условиях. Эта сложность иногда слишком велика, чтобы справиться с небольшими проектами, особенно если приложение не требует всех мощных особенностей других оркестров.

Я буду проходить более легкую альтернативу, которая является Ansible. Описание и пример основаны на проекте Real World, работающем в AWS, а приложение представляет собой небольшое веб -приложение с бэкэндом Flask/Python. Описанные концепции применимы к любому веб -приложению, работающему в Docker, независимо от использования структуры/языка. Приложению требовала базы данных, LoadBalancer и несколько серверов приложений. Этот пост будет сосредоточен на серверах приложений. Все серверы приложений запускают одну и ту же кодовую базу с той же конфигурацией.

Серверы и услуги по выпуску настроены на Terraform И затем Ansible используется для их установки и настройки их. После создания сервера с использованием Terraform требуются следующие шаги:

  1. Запустите Ansible Playbook для установки Docker
  2. Запустите Ansible Playbook, чтобы запустить приложение и добавить контейнеры в LoadBalancer

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

---
- name: Prepare deployment
  hosts: appplication_servers

  tasks:
    - name: Run database migrations
      run_once: yes
      docker_container:
        name: app-migrations
        pull: yes
        image: "application:{{ version }}"
        command: "db upgrade"

- name: Deploy to one server at the time
  hosts: application_servers
  serial: 1

  tasks:
    - name: Remove from load balancer
      delegate_to: localhost
      elb_target:
        state: absent

    - name: Start new docker container
      docker_container:
        name: app
        pull: yes
        image: "application:{{ version }}"
        ports:
          - 8080:8080

    - name: Add to load balancer
      delegate_to: localhost
      elb_target:
        state: present

Прогулка по пейзаже мы сначала запускаем миграции схемы базы данных (в данном случае с Flask-Migrate ), тогда для каждого сервера выполняется три шага: выполняется:

  1. Удаление сервера из LoadBalancer, ожидая, пока он не будет.
  2. Перезагрузка контейнера с новой версией
  3. Добавление сервера обратно в LoadBalancer

Это сделано для одного сервера в то время, поэтому пользователи ничего не заметят во время развертывания. Развертывание запускается с помощью следующей команды: ansible-playbook-extra-vars version = deploy.yaml Анкет Это может быть сделано вручную или системой CI.

Docker-Images создаются для каждого толчка к GIT системой CI и выдвигаются в реестр контейнеров Docker, где каждый сервер может загрузить изображение.

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

  • Трудно добавить новые услуги/другие типы контейнеров
  • Трудно выполнять периодические задачи
  • Среда не может быть легко масштабирована автоматически
  • Приложение не может автоматически перемещать контейнеры с сломанных серверов

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

Почти полный и бегущий пример этого можно найти в GitHub: https://github.com/mattiaslundberg/ansible-orchestration

Оригинал: «https://dev.to/mattiaslundberg/using-ansible-for-container-orchestration-3051»