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 Slide

  2. View Slide

  3. View Slide

  4. View Slide

  5. Деплой
    Docker
    Ansible
    Vagrant

    View Slide

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

    View Slide

  7. Пример
    - 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 Slide

  8. ~ 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 Slide

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

    View Slide

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

    View Slide

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

    View Slide

  12. Пример
    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 Slide

  13. Пример
    - 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 Slide

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

    View Slide

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

    View Slide

  16. View Slide

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

    View Slide

  18. Swarm VS Swarm Mode

    View Slide

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

    View Slide

  20. Были проблемы с созданием кластера
    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 Slide

  21. Выводы

    View Slide

  22. Stage 4
    Kubernetes
    Core OS
    CI

    View Slide

  23. View Slide