Upgrade to Pro — share decks privately, control downloads, hide ads and more …

История одного деплоя - Станислав Мехоношин

История одного деплоя - Станислав Мехоношин

Deep Refactoring

December 27, 2016
Tweet

More Decks by Deep Refactoring

Other Decks in Programming

Transcript

  1. История одного деплоя
    Stanislav Mekhonoshin

    View full-size slide

  2. Деплой
    Docker
    Ansible
    Vagrant

    View full-size slide

  3. Stage 1
    Dockerfile per app
    Кастомные скрипты для сборки Docker-image
    Ansible плейбук для развертывания инфраструктуры
    Ansible docker module

    View full-size slide

  4. Пример
    - name: vk container
    docker:
    name: vk
    image: dockerhub_user/collector-vk:latest
    pull: always
    state: reloaded
    links: rabbitmq:rabbitmq,postgres:postgres
    detach: true
    publish_all_ports: true
    volumes:
    - "{{ ansible_env.HOME }}/config.yaml.template:/app/config.yaml.template"
    command: /bin/bash -c "envsubst < /app/config.yaml.template > /app/config.yaml && make run"

    View full-size slide

  5. ~ cd collector
    ~ vagrant up
    ~ bin/deploy web vk scheduler
    Вот тут происходит:
    docker build -t user/appname .
    docker push user/appname
    ansible-playbook -i production playbooks/myapp.yml
    Пример

    View full-size slide

  6. Выигрыш от Stage 1
    Модно
    Сервисы изолированы
    Деплой гетерогенного приложения в одну команду

    View full-size slide

  7. Проблемы Stage 1
    Нужен вагрант для деплоя
    Слишком много conventions
    Конфигурация в ansible и vagrant
    Сложно линковать контейнеры(Docker legacy links)
    При апдейте контейнера - надо перезапускать все зависимости

    View full-size slide

  8. Stage 2
    Docker Compose
    Docker for Mac
    Ansible 2.2
    docker_service module

    View full-size slide

  9. Пример
    version: '2'
    services:
    postgres:
    container_name: postgres
    image: postgres:9.5
    volumes:
    - ${DATA_MOUNTPOINT}/pg_data:/pg_data
    ports:
    - "127.0.0.1:5432:5432"
    environment:
    - PGDATA=/pg_data
    redis:
    container_name: redis
    image: redis:latest
    command: redis-server --appendonly yes
    ports:
    - "127.0.0.1:6379:6379"

    View full-size slide

  10. Пример
    - name: run all containers
    docker_service:
    project_name: "{{ project_name }}"
    project_src: "/{{ project_name }}"
    files:
    - docker-compose.yml
    - docker-compose.apps.yml
    environment:
    DATA_MOUNTPOINT: "{{ data_mountpoint }}"

    View full-size slide

  11. Выигрыш от Stage 2
    Упрощение и унификация локального и production запуска
    Простая связь между контейнерами
    Регламентированный порядок запуска сервисов
    Vagrant больше не нужен(ну почти)

    View full-size slide

  12. Проблемы Stage 2
    Хочется кластер
    Говорят, что compose не для продакшена
    Почему-то на python
    https://github.com/docker/for-mac/issues/881

    View full-size slide

  13. Stage 3
    Docker Swarm
    AWS EC2
    3 плейбука:
    - AWS
    - Swarm
    - Apps

    View full-size slide

  14. Swarm VS Swarm Mode

    View full-size slide

  15. Выигрыш от Stage 3
    Изи масштабирование
    Балансировка нагрузки

    View full-size slide

  16. Были проблемы с созданием кластера
    Docker Compose и Docker Swarm Mode не работают вместе
    https://github.com/ddrozdov/docker-compose-swarm-mode
    https://github.com/docker/docker/tree/master/experimental
    Ansible не умеет Docker Swarm Mode => много ручной работы
    https://github.com/ansible/ansible-modules-core/pull/5547
    Проблемы Stage 3

    View full-size slide

  17. Выводы

    View full-size slide

  18. Stage 4
    Kubernetes
    Core OS
    CI

    View full-size slide