$30 off During Our Annual Pro Sale. View Details »

Vers des applications twelve-factor

ubermuda
October 24, 2014

Vers des applications twelve-factor

La méthodologie "12 factor" (http://12factor.net/) promet des applications SaaS (Software-as-a-Service) plus maintenables et scalables.

Comment ? Pourquoi ? Voyons ensemble quelles sont les préconisations de cette méthodologie développée par des ingénieurs d'Heroku, et comment les appliquer dans des applications basées sur le framework Symfony2, avec l'aide de la technologie la plus prometteuse du moment : Docker.

ubermuda

October 24, 2014
Tweet

More Decks by ubermuda

Other Decks in Technology

Transcript

  1. Vers des applications
    twelve-factor
    Avec Symfony et Docker
    Geoffrey Bachelet
    geoffrey.io / @ubermuda

    View Slide

  2. 12factor.net

    View Slide

  3. View Slide

  4. Use declarative formats for setup automation
    Clean contract with the underlying operating system
    Suitable for deployment on modern cloud platforms
    Minimize divergence between development and production
    Can scale up without significant changes

    View Slide

  5. Codebase
    Dependencies
    Config
    Backing services
    Build, release, run
    Processes
    Port binding
    Concurrency
    Disposability
    Dev/prod parity
    Logs
    Admin processes

    View Slide

  6. Codebase

    View Slide

  7. Codebase
    Question de vocabulaire

    View Slide

  8. Codebase
    une app = une base de code
    ("codebase")

    View Slide

  9. Codebase
    = un repo git/hg/svn

    View Slide

  10. Codebase
    2 codebases =! un app

    View Slide

  11. Codebase
    = un système distribué
    ("distributed system")

    View Slide

  12. Distributed System
    Web WS Worker

    View Slide

  13. Codebase
    1 codebase -> plusieurs déploiements
    ("deploy")

    View Slide

  14. Codebase
    Prod
    Pré-prod
    Dev
    C.I.

    View Slide

  15. Codebase
    one app = one codebase
    multiple codebases = a distributed system
    one codebase -> many deploys

    View Slide

  16. Dependencies

    View Slide

  17. System-wide
    vs
    Project-wide

    View Slide

  18. View Slide

  19. Dependencies Declaration
    composer.json
    bower.json
    packages.json
    ...

    View Slide

  20. Dependencies Isolation
    bin/
    autoload
    ...

    View Slide

  21. Outils système ?
    curl, imagemagick, ...

    View Slide

  22. Pas de "shell out" !
    si obligatoire, inclure le binaire dans les dépendances

    View Slide

  23. Config

    View Slide

  24. Resource handles to the database, Memcached
    Credentials to external services such as Amazon S3 or Twitter
    Per-deploy values such as the canonical hostname for the deploy

    View Slide

  25. Séparation stricte de la config et du code.

    View Slide

  26. app/config/parameters.yml

    View Slide

  27. Il est possible de créer d'autres fichiers !
    app/config/apis.yml

    View Slide

  28. 12 factor recommande
    les variables d'environnement

    View Slide

  29. Incenteev/ParameterHandler
    env-map

    View Slide

  30. docker run -e FOO=bar -e TOTO
    Docker

    View Slide

  31. web:
    image: debian:wheezy
    environnement:
    - FOO=bar
    - TOTO
    Fig

    View Slide

  32. Backing services

    View Slide

  33. A backing service is any service the app consumes over the
    network as part of its normal operation.

    View Slide

  34. Datastore (MySQL, PgSQL, Redis, ...)
    SMTP (Postfix, Mandril, ...)
    Message Queue (RabbitMQ, ZeroMQ, ...)
    API tierce (Twitter, Facebook, etc)

    View Slide

  35. App
    Ambassador
    MySQL
    Redis
    MySQL
    Ambassador
    Ambassador
    Ambassador

    View Slide

  36. App
    Ambassador
    Ambassador Facebook
    Twitter
    Health check, Cache, etc.

    View Slide

  37. Build, release, run

    View Slide

  38. The twelve-factor app uses strict separation between the build,
    release, and run stages.

    View Slide

  39. Téléchargement des dépendances
    Construction des assets
    Build

    View Slide

  40. Build
    docker build

    View Slide

  41. composer install
    ...et la méchante "GitHub API Rate"

    View Slide

  42. FROM debian:wheezy
    Dockerfile

    View Slide

  43. - FROM debian:wheezy
    + FROM acme/base
    Dockerfile

    View Slide

  44. FROM debian:wheezy
    RUN composer config -g \
    github-oauth.github.com \
    a1b2c3d4e5...
    acme/base
    Attention à la sécurité !

    View Slide

  45. Release
    docker push
    Possiblement sur un registry privé

    View Slide

  46. RUN
    docker run / fig up

    View Slide

  47. Processes

    View Slide

  48. Twelve-factor processes are stateless and share-nothing.

    View Slide

  49. App App
    Volumes
    Cache, Sessions, etc.

    View Slide

  50. App App
    Volumes
    Cache, Sessions, etc.
    NOPE

    View Slide

  51. App
    Volumes
    App
    Volumes
    Redis
    Ambassador

    View Slide

  52. App
    Volumes
    App
    Volumes
    Redis
    Ambassador
    Sessions
    Cache

    View Slide

  53. Assets ?!
    uploads, avatars, etc.

    View Slide

  54. Amazon S3
    ou autre

    View Slide

  55. Port binding

    View Slide

  56. The twelve-factor app is completely self-contained

    View Slide

  57. Self-contained?!

    View Slide

  58. That's my fetish.

    View Slide

  59. Docker
    docker run -P

    View Slide

  60. Chaque application peut devenir un "backing service".

    View Slide

  61. Concurrency

    View Slide

  62. stateless + share-nothing = scalable

    View Slide

  63. Web
    Reverse
    Proxy
    App
    App Ambassador MySQL

    View Slide

  64. Reverse
    Proxy
    App
    App
    App Ambassador MySQL
    Let's rock.

    View Slide

  65. Background jobs
    AMQP
    App
    Worker
    Worker
    Worker

    View Slide

  66. Disposability

    View Slide

  67. Web
    Reverse
    Proxy
    App
    App
    App Ambassador MySQL

    View Slide

  68. Reverse
    Proxy
    App
    App
    App Ambassador MySQL
    J'ai piscine

    View Slide

  69. ChaosMonkey
    https://github.com/Netflix/SimianArmy/wiki/Chaos-Monkey

    View Slide

  70. App
    Ambassador
    MySQL
    Redis
    MySQL
    Ambassador
    Ambassador
    Ambassador

    View Slide

  71. App
    Ambassador
    MySQL
    Redis
    MySQL
    Ambassador
    Ambassador
    Ambassador
    PG M'A TUER

    View Slide

  72. App
    Ambassador
    MySQL
    Redis
    MySQL
    Ambassador
    Ambassador
    Ambassador
    LOL

    View Slide

  73. App
    Ambassador
    MySQL
    Redis
    MySQL
    Ambassador
    Ambassador
    Ambassador
    MySQuoi ?

    View Slide

  74. Dev/prod parity

    View Slide

  75. Objectifs
    Réduire la friction entre le dev et la prod
    Réduire le "time-to-first-deploy"
    Faciliter l'intégration continue

    View Slide

  76. Docker
    Permet d'avoir des environnements de dev
    très proches de la production.

    View Slide

  77. Fig
    Facilite l'orchestration.

    View Slide

  78. web:
    image: mytepee/web
    ports: [80]
    links: [db:db]
    volumes_from: [cache, config, data]
    environment: [...]
    db:
    image: orchardup/mysql
    environment: [...]
    cache:
    image: busybox
    command: /bin/true
    volumes: [/root/.composer/cache, /root/.cache/bower]
    config:
    image: busybox
    command: /bin/true
    volumes: [/app/config]
    data:
    image: busybox
    command: /bin/true
    volumes: [/app/web/uploads, /app/web/media, ..., /app/app/cache, /app/app/logs]
    fig.yml
    Attention à la sécurité !

    View Slide

  79. Fig
    Pas (encore) d'orchestration "remote".
    Outils tierce (Flocker, Panamax, etc.)

    View Slide

  80. Logs

    View Slide

  81. A twelve-factor app never concerns
    itself with routing or storage of its output stream.

    View Slide

  82. ...each running process writes its event stream,
    unbuffered, to stdout

    View Slide

  83. Difficile d'être twelve-factor avec Symfony.

    View Slide

  84. ELK
    Elasticsearch + Logstash + Kibana

    View Slide

  85. David Pilato
    @dadoonet
    Atelier : Hands on Elasticsearch & Kibana

    View Slide

  86. David Pilato
    @dadoonet
    Atelier : Hands on Elasticsearch & Kibana
    HIER

    View Slide

  87. Olivier Dolbeau
    @odolbeau
    Talk : Laisse pas trainer ton log !

    View Slide

  88. Olivier Dolbeau
    @odolbeau
    Talk : Laisse pas trainer ton log !
    HIER

    View Slide

  89. Olivier Dolbeau
    @odolbeau
    http://odolbeau.fr/blog/when-monolog-meet-elk.html
    When Monolog meet ELK

    View Slide

  90. Admin processes

    View Slide

  91. One-off admin processes should be run in an identical
    environment as the regular long-running processes of the app.

    View Slide

  92. Container spécialisé ?
    docker run acme/cli ...

    View Slide

  93. docker exec
    docker exec acme_web ...
    1.3

    View Slide

  94. Fig
    fig run

    View Slide

  95. Run a one-off command on a service.
    For example:
    $ fig run web python manage.py shell
    By default, linked services will be started,
    unless they are already
    running. If you do not want to start linked
    services, use
    `fig run --no-deps SERVICE COMMAND [ARGS...]`.
    fig.yml

    View Slide

  96. Ce qu'il faut retenir.

    View Slide

  97. Twelve-factor
    =
    Recommandations

    View Slide

  98. stateless / share-nothing

    View Slide

  99. ELK
    http://odolbeau.fr/blog/when-monolog-meet-elk.html

    View Slide

  100. Fig
    http://www.fig.sh/

    View Slide

  101. Ambassador pattern
    https://docs.docker.com/articles/ambassador_pattern_linking/

    View Slide

  102. Questions ?
    geoffrey.io / @ubermuda
    geoffrey.io/books/discovering-docker.html
    Merci !

    View Slide