Successfully reported this slideshow.
Your SlideShare is downloading. ×

Движение по хрупкому дну / Сергей Караткевич (servers.ru)

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad

Check these out next

1 of 72 Ad

Движение по хрупкому дну / Сергей Караткевич (servers.ru)

Download to read offline

Сегодня Интернет увлечен микросервисами, контейнерами и immutable-инфраструктурой. Очень сложно не поддаться искушению внедрить что-то подобное в компании, в которой вы работаете сейчас. Я попытаюсь отговорить вас использовать эти технологии во вред приложению, себе и бизнесу компании в целом. Я расскажу о типовом проекте, который был запущен в 20 странах за 4 месяца, проблемах, которые я встретил, и выводах, которые я сделал.

- Почему микросервисы не спасут, а похоронят ваш проект.
Я расскажу на основе собственного опыта, почему не стоит увлекаться микросервисами для небольших проектов, почему благие намерения — упрощение деплоя и увеличение числа деплоев, увеличение доступности и улучшение масштабирования ведут к отсутствию гибкости и критическому уменьшению стабильности системы.

- Почему ваша система слишком сложна для своих задач.
Я расскажу, почему не стоит усложнять систему, почему, скорее всего, ваша система слишком сложна для задач, которые она решает и почему вы не контролируете то, что происходит в системе. Я объясню, почему вы потратите все свое время на отладку сложной системы, вместо того чтобы решать задачи бизнеса.

- Почему Docker используется неправильно.
Будут предоставлены реальные примеры использования Docker для нового проекта и для портированного проекта, я объясню, с какими проблемами сталкиваются операторы при работе с Docker на живых примерах, объясню, почему вы, скорее всего, используете Docker неправильно, и предложу варианты, как этого избежать.

- Почему immutable слишком статичен для вашей компании.
Я расскажу про свой опыт работы с immutable и объясню, почему, на мой взгляд, переход к подобной инфраструкт

Сегодня Интернет увлечен микросервисами, контейнерами и immutable-инфраструктурой. Очень сложно не поддаться искушению внедрить что-то подобное в компании, в которой вы работаете сейчас. Я попытаюсь отговорить вас использовать эти технологии во вред приложению, себе и бизнесу компании в целом. Я расскажу о типовом проекте, который был запущен в 20 странах за 4 месяца, проблемах, которые я встретил, и выводах, которые я сделал.

- Почему микросервисы не спасут, а похоронят ваш проект.
Я расскажу на основе собственного опыта, почему не стоит увлекаться микросервисами для небольших проектов, почему благие намерения — упрощение деплоя и увеличение числа деплоев, увеличение доступности и улучшение масштабирования ведут к отсутствию гибкости и критическому уменьшению стабильности системы.

- Почему ваша система слишком сложна для своих задач.
Я расскажу, почему не стоит усложнять систему, почему, скорее всего, ваша система слишком сложна для задач, которые она решает и почему вы не контролируете то, что происходит в системе. Я объясню, почему вы потратите все свое время на отладку сложной системы, вместо того чтобы решать задачи бизнеса.

- Почему Docker используется неправильно.
Будут предоставлены реальные примеры использования Docker для нового проекта и для портированного проекта, я объясню, с какими проблемами сталкиваются операторы при работе с Docker на живых примерах, объясню, почему вы, скорее всего, используете Docker неправильно, и предложу варианты, как этого избежать.

- Почему immutable слишком статичен для вашей компании.
Я расскажу про свой опыт работы с immutable и объясню, почему, на мой взгляд, переход к подобной инфраструкт

Advertisement
Advertisement

More Related Content

Slideshows for you (20)

Viewers also liked (20)

Advertisement

Similar to Движение по хрупкому дну / Сергей Караткевич (servers.ru) (20)

More from Ontico (20)

Advertisement

Recently uploaded (20)

Движение по хрупкому дну / Сергей Караткевич (servers.ru)

  1. 1. DevOps движение по хрупкому дну Сергей Караткевич
  2. 2. Про меня: Админю с 2003 Работаю с разработчиками с 2007 Решаю бизнес-задачи с 2010
  3. 3. «Сегодня я расскажу, как сэкономить на базах данных огромные деньги, например, миллион долларов, как это сделали мы.» Аникин Денис (Mail.Ru)
  4. 4. но мы не тратим миллион долларов. даже полмиллиона
  5. 5. О чем я буду рассказывать
  6. 6. О чем я буду рассказывать
  7. 7. О чем я буду рассказывать
  8. 8. Сервера Офисы
  9. 9. Сервера Офисы
  10. 10. Сервера Офисы
  11. 11. Сервера Офисы
  12. 12. Сервера Офисы
  13. 13. Сервера Офисы
  14. 14. Сервера Офисы
  15. 15. Сервера Офисы
  16. 16. все это произошло за 4 месяца — 90 рабочих дней
  17. 17. Почему вы используете Docker неправильно «Иногда мне кажется, что Docker придумали специально, чтобы оградить людей от NodeJS»
  18. 18. FROM php:7-fpm-alpine ENV DEBIAN_FRONTEND=noninteractive RUN echo '@testing http://nl.alpinelinux.org/alpine/edge/testing' >> /etc/apk/repositories && apk update && apk upgrade && apk add git curl zlib-dev libmemcached-dev shadow@testing && git clone --branch php7 https://github.com/php-memcached-dev/php-memcached /usr/src/php/ext/memcached && cd /usr/src/php/ext/memcached && docker-php-ext-configure memcached --disable-memcached-sasl && docker-php-ext-install bcmath zip pdo_mysql memcached pcntl && docker-php-ext-enable opcache && usermod -u 1000 www-data && rm -rf /usr/local/src/* /var/cache/apk/* /tmp/* /var/tmp/* ADD . /var/www/html/ WORKDIR /var/www/html RUN rm -rf ./docker && chown -R www-data.www-data . && curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer && composer config --global github-oauth.github.com osdc47a9835779cb32c0d06dafeb83fkx69331sdw5 && mkdir -p ~/.ssh && echo -e "Host github.comntStrictHostKeyChecking non" >> ~/.ssh/config && composer install --no-dev --no-interaction --no-progress --no-scripts --optimize-autoloader EXPOSE 9000 CMD ["php-fpm"]
  19. 19. docker build .
  20. 20. FROM php:7-fpm-alpine ENV DEBIAN_FRONTEND=noninteractive RUN echo '@testing http://nl.alpinelinux.org/alpine/edge/testing' >> /etc/apk/repositories && apk update && apk upgrade && apk add git curl zlib-dev libmemcached-dev shadow@testing && git clone --branch php7 https://github.com/php-memcached-dev/php-memcached /usr/src/php/ext/memcached && cd /usr/src/php/ext/memcached && docker-php-ext-configure memcached --disable-memcached-sasl && docker-php-ext-install bcmath zip pdo_mysql memcached pcntl && docker-php-ext-enable opcache && usermod -u 1000 www-data && rm -rf /usr/local/src/* /var/cache/apk/* /tmp/* /var/tmp/* ADD . /var/www/html/ WORKDIR /var/www/html RUN rm -rf ./docker && chown -R www-data.www-data . && curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer && composer config --global github-oauth.github.com osdc47a9835779cb32c0d06dafeb83fkx69331sdw5 && mkdir -p ~/.ssh && echo -e "Host github.comntStrictHostKeyChecking non" >> ~/.ssh/config && composer install --no-dev --no-interaction --no-progress --no-scripts --optimize-autoloader EXPOSE 9000 CMD ["php-fpm"] usermod -u 1000 www-data &&
  21. 21. FROM php:7-fpm-alpine ENV DEBIAN_FRONTEND=noninteractive RUN echo '@testing http://nl.alpinelinux.org/alpine/edge/testing' >> /etc/apk/repositories && apk update && apk upgrade && apk add git curl zlib-dev libmemcached-dev shadow@testing && git clone --branch php7 https://github.com/php-memcached-dev/php-memcached /usr/src/php/ext/memcached && cd /usr/src/php/ext/memcached && docker-php-ext-configure memcached --disable-memcached-sasl && docker-php-ext-install bcmath zip pdo_mysql memcached pcntl && docker-php-ext-enable opcache && usermod -u 1000 www-data && rm -rf /usr/local/src/* /var/cache/apk/* /tmp/* /var/tmp/* ADD . /var/www/html/ WORKDIR /var/www/html RUN rm -rf ./docker && chown -R www-data.www-data . && curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer && composer config --global github-oauth.github.com osdc47a9835779cb32c0d06dafeb83fkx69331sdw5 && mkdir -p ~/.ssh && echo -e "Host github.comntStrictHostKeyChecking non" >> ~/.ssh/config && composer install --no-dev --no-interaction --no-progress --no-scripts --optimize-autoloader EXPOSE 9000 CMD ["php-fpm"] ADD . /var/www/html/
  22. 22. FROM php:7-fpm-alpine ENV DEBIAN_FRONTEND=noninteractive RUN echo '@testing http://nl.alpinelinux.org/alpine/edge/testing' >> /etc/apk/repositories && apk update && apk upgrade && apk add git curl zlib-dev libmemcached-dev shadow@testing && git clone --branch php7 https://github.com/php-memcached-dev/php-memcached /usr/src/php/ext/memcached && cd /usr/src/php/ext/memcached && docker-php-ext-configure memcached --disable-memcached-sasl && docker-php-ext-install bcmath zip pdo_mysql memcached pcntl && docker-php-ext-enable opcache && usermod -u 1000 www-data && rm -rf /usr/local/src/* /var/cache/apk/* /tmp/* /var/tmp/* ADD . /var/www/html/ WORKDIR /var/www/html RUN rm -rf ./docker && chown -R www-data.www-data . && curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer && composer config --global github-oauth.github.com osdc47a9835779cb32c0d06dafeb83fkx69331sdw5 && mkdir -p ~/.ssh && echo -e "Host github.comntStrictHostKeyChecking non" >> ~/.ssh/config && composer install --no-dev --no-interaction --no-progress --no-scripts --optimize-autoloader EXPOSE 9000 CMD ["php-fpm"] ADD . /var/www/html/ •Используйте COPY •Помните о контексте
  23. 23. FROM php:7-fpm-alpine ENV DEBIAN_FRONTEND=noninteractive RUN echo '@testing http://nl.alpinelinux.org/alpine/edge/testing' >> /etc/apk/repositories && apk update && apk upgrade && apk add git curl zlib-dev libmemcached-dev shadow@testing && git clone --branch php7 https://github.com/php-memcached-dev/php-memcached /usr/src/php/ext/memcached && cd /usr/src/php/ext/memcached && docker-php-ext-configure memcached --disable-memcached-sasl && docker-php-ext-install bcmath zip pdo_mysql memcached pcntl && docker-php-ext-enable opcache && usermod -u 1000 www-data && rm -rf /usr/local/src/* /var/cache/apk/* /tmp/* /var/tmp/* ADD . /var/www/html/ WORKDIR /var/www/html RUN rm -rf ./docker && chown -R www-data.www-data . && curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer && composer config --global github-oauth.github.com osdc47a9835779cb32c0d06dafeb83fkx69331sdw5 && mkdir -p ~/.ssh && echo -e "Host github.comntStrictHostKeyChecking non" >> ~/.ssh/config && composer install --no-dev --no-interaction --no-progress --no-scripts --optimize-autoloader EXPOSE 9000 CMD ["php-fpm"] ENV DEBIAN_FRONTEND=noninteractive RUN composer config --global github-oauth.github.com osdc47a9835779cb32c0d06dafeb83f kx69331sdw5 &&
  24. 24. Docker очень хорош для тестов docker run -d --name DB_NAME postgres docker run --user jenkins -v $WORKSPACE:$APP_DIR -w $APP_DIR --link DB_NAME:database custom-node:0.10.28 bash -c 'npm install && npm test'
  25. 25. '
  26. 26. Почему immutable вас никуда не приведет
  27. 27. Почему immutable вас никуда не приведет
  28. 28. Почему immutable вас никуда не приведет
  29. 29. Почему immutable вас никуда не приведет • Runtime vs Buildtime (в какой-то момент время билда ПРЕВЫШАЕТ время работы контейнера) • в моей системе время сборки 40минут + время замены через терраформ • у Akamai деплой новой конфигурации порядка 50минут
  30. 30. Почему микросервисы похоронят вашу компанию Мы внедряем микросервисы, чтобы: • позволить распределенным командам разрабатывать части приложений • деплоить части приложений независимо друг от друга • деплоить без остановки приложения • масштабировать части приложения быстро и независимо
  31. 31. Alice Bob Mysql
  32. 32. Alice Bob Mysql Memcached
  33. 33. Alice Bob Mysql Memcached Worker
  34. 34. Alice Bob Mysql Memcached Worker Solr
  35. 35. Alice Balancer Bob Balancer Memcached Mysql Solr Worker AliceAlice BobBob
  36. 36. Alice Balancer Bob Balancer Memcached Mysql Solr Worker AliceAlice BobBob Elasticsearch API
  37. 37. Alice Balancer Bob Balancer Memcached Mysql Solr Worker AliceAlice BobBob Elasticsearch API API API Elasticsearch Elasticsearch
  38. 38. Alice Balancer Bob Balancer Memcached Mysql Solr Worker AliceAlice BobBob Elasticsearch API API API Elasticsearch Elasticsearch Balancer
  39. 39. Alice Balancer Bob Balancer Memcached Mysql Solr Worker AliceAlice BobBob Elasticsearch API API API Elasticsearch Elasticsearch Balancer CDN BI
  40. 40. Alice Balancer Bob Balancer Memcached Mysql Solr Worker AliceAlice BobBob Elasticsearch API API API Elasticsearch Elasticsearch Balancer CDN BI Solr
  41. 41. Почему микросервисы похоронят вашу компанию «В сложных системах поведение агентов приводит к неожиданным результатам для всей системы»* *Про сложность позже
  42. 42. 'cluster.name' => 'escluster', 'cloud.aws.region' => region, 'http.port' => 9200, 'script.inline' => 'on', 'script.indexed' => 'on', 'discovery.type' => 'ec2', 'bootstrap.mlockall' => 'true', 'cloud.aws.access_key' => node["es-cluster"]["aws"]["access_key"], 'cloud.aws.secret_key' => node["es-cluster"]["aws"]["secret_key"], 'discovery.ec2.groups' => sg, 'discovery.zen.ping.multicast.enabled' => 'false', 'discovery.ec2.host_type' => 'private_ip', 'network.publish_host' => '_ec2:privateIpv4_', 'network.host' => '0.0.0.0’, 'cloud.aws.region' => region,
  43. 43. 'cluster.name' => 'escluster', 'cloud.aws.region' => region, 'http.port' => 9200, 'script.inline' => 'on', 'script.indexed' => 'on', 'discovery.type' => 'ec2', 'bootstrap.mlockall' => 'true', 'cloud.aws.access_key' => node["es-cluster"]["aws"]["access_key"], 'cloud.aws.secret_key' => node["es-cluster"]["aws"]["secret_key"], 'discovery.ec2.groups' => sg, 'discovery.zen.ping.multicast.enabled' => 'false', 'discovery.ec2.host_type' => 'private_ip', 'network.publish_host' => '_ec2:privateIpv4_', 'network.host' => '0.0.0.0’, 'cloud.aws.access_key' 'cloud.aws.secret_key'
  44. 44. 'cluster.name' => 'escluster', 'cloud.aws.region' => region, 'http.port' => 9200, 'script.inline' => 'on', 'script.indexed' => 'on', 'discovery.type' => 'ec2', 'bootstrap.mlockall' => 'true', 'cloud.aws.access_key' => node["es-cluster"]["aws"]["access_key"], 'cloud.aws.secret_key' => node["es-cluster"]["aws"]["secret_key"], 'discovery.ec2.groups' => sg, 'discovery.zen.ping.multicast.enabled' => 'false', 'discovery.ec2.host_type' => 'private_ip', 'network.publish_host' => '_ec2:privateIpv4_', 'network.host' => '0.0.0.0’, 'discovery.ec2.groups' => sg
  45. 45. 'cluster.name' => 'escluster', 'cloud.aws.region' => region, 'http.port' => 9200, 'script.inline' => 'on', 'script.indexed' => 'on', 'discovery.type' => 'ec2', 'bootstrap.mlockall' => 'true', 'cloud.aws.access_key' => node["es-cluster"]["aws"]["access_key"], 'cloud.aws.secret_key' => node["es-cluster"]["aws"]["secret_key"], 'discovery.ec2.groups' => sg, 'discovery.zen.ping.multicast.enabled' => 'false', 'discovery.ec2.host_type' => 'private_ip', 'network.publish_host' => '_ec2:privateIpv4_', 'network.host' => '0.0.0.0’, 'discovery.ec2.host_type' 'network.publish_host'
  46. 46. Почему микросервисы похоронят вашу компанию
  47. 47. Почему микросервисы похоронят вашу компанию • 11 дней потребовалось C****F***e, чтобы достать IP-адрес из блеклиста • 41 день потребовался компании A****I, чтобы избавиться от двойного слеша в конце URL • 13дней потребовалось компании A****n, чтобы починить сеть в Сингапуре после выхода из строя кабеля
  48. 48. Почему микросервисы похоронят вашу компанию
  49. 49. Почему ваша система слишком сложна «Понимание происходящего может приходить не сразу, а работать должно было вчера» @bogdar
  50. 50. Alice Balancer Bob Balancer Memcached Mysql Solr Worker AliceAlice BobBob Elasticsearch API API API Elasticsearch Elasticsearch Balancer CDN BI Solr Как микросервисы взаимодействуют между собой
  51. 51. Почему ваша система слишком сложна
  52. 52. Почему ваша система слишком сложна
  53. 53. Почему ваша система слишком сложна
  54. 54. Почему ваша система слишком сложна • bogdar: понимание происходящего может приходить не сразу • bogdar: а работать должно было вчера • Среднее покрытие кода тестами на моих проектах 0.23% Каждый контейнер становится уникальным что вводит элемент неожиданности КАЖДАЯ КОМАНДА СБОРКИ МОЖЕТ ОТКАЗАТЬ ВЫ НИКОГДА НЕ ПРОВЕРЯЛИ ИХ ВСЕ
  55. 55. Agile, CI, CD и ChatOps не заработают
  56. 56. Деплой Но это работает просто отлично если работает
  57. 57. Деплой Новый скрипт максимум 16деплоев в день с 4 апреля по 3 мая 210деплоев на стейджинг И 230деплоев на продакшн! Старый скрипт 32деплоя (за февраль)
  58. 58. Деплой Основные проблемы: Запуск постскриптов Разница между nohup и & Лок-файлы Логгинг
  59. 59. Деплой Логгинг exec 3>&1 4>&2 trap 'exec 2>&4 1>&3' 0 1 2 3 exec 1> /var/log/deploy.log 2>&1
  60. 60. Деплой
  61. 61. Вопросы!

Editor's Notes

  • Я буду рассказывать об обычной небольшой организации, о том что не нужно увлекаться дорогостоящими и сложными решениями, когда достаточно простых и проверенных
  • Я буду рассказывать об обычной небольшой организации
    если спросить любого девопса где на графике нормального распределения находится его компания, он точно укажет место - с правого края
  • Я буду рассказывать об обычной небольшой организации
    если спросить любого девопса где на графике нормального распределения находится его компания, он точно укажет место - с правого края
  • На самом деле мой опыт показывает, что большинство организаций сталкиваются примерно с теми же самыми проблемами и развиваются по одинаковому сценарию. Поэтому цель моего сегодняшнего выступления убедить вас в этом
  • Решили минимизировать задержки, сделав географически разнесенную инсталляцию
  • Потом мы решили что какие-то рынки нам дороже остальных, а на какие-то можно не обращать внимания
  • Ну а потом бизнес решил выделить часть компании в отдельное бизнес-подразделение со своим оперированием
  • На картинке типичный пример использования Docker. На самом деле нужно определиться, вы использует докер как систему управления пакетами или как систему управления виртуальными машинами?
  • Как обычно развиваются события? Прямо перед выкаткой важной фичи, про которую вам забыли рассказать, появляется программист.
  • И показывает вамм докерфайл. Вы радостно делаете
  • И ничего не работает
  • Тут обычно отваливаются желающие использовать дата-контейнры
  • Проблема контекста для команды ADD
  • Хардкоженные ключи в докерфайлах, а также переменные. В данном случае все безобидно, но никто не мешает программистам творчески улучшить, особенно когда процессы CI/CD будут автоматизированны
  • А еще докер очень хорош, чтобы переложить ответственность на программистов.
  • Вот почему
  • Типичный "immutablе" сегодня выглядит так
    вносим изменения в кукбуки
    деплоим кукбуки в шеф-сервер
    запускаем пакер для нужной роли
    деплоим новые инстансы терраформом
    скейлим ап-даун или прибиваем старые инстансы
  • это не работает. sorry to say that.
    софт бажный. терраформ однажды даже удалил продакшн базу (нет, это не компания Gliffy)terraform plan и terraform apply делают разные вещи. я видел rspec для терраформа, но пока все это допишутограничение scope делает не совсем то что ожидалосьпакер не работает в пределах МИНОРНОЙ версии(последний пример - неподгружающиеся ключи шефа в 0.9/0.10.1
  • На самом деле
    микросервисы сложнее
    поэтому микросервисы менее гибки
    микросервисы менее защищены
    и менее стабильны
  • Расскажу немного про типовую архитектуру типового приложения
  • Расскажу немного про типовую архитектуру типового приложения
  • Расскажу немного про типовую архитектуру типового приложения
  • Расскажу немного про типовую архитектуру типового приложения
  • Расскажу немного про типовую архитектуру типового приложения
  • Расскажу немного про типовую архитектуру типового приложения
  • Расскажу немного про типовую архитектуру типового приложения
  • Расскажу немного про типовую архитектуру типового приложения
  • Расскажу немного про типовую архитектуру типового приложения
  • Расскажу немного про типовую архитектуру типового приложения
  • Расскажу немного про типовую архитектуру типового приложения
  • Облако и autodiscovery
    Типичный список проблем с autodiscovery
    Не там: по умолчанию эластик ищет в регионах по своим внутренним убеждениям. Программисты подняли в одном из регионов кластер и к нему начал цепляться эластик при сборке
  • Облако и autodiscovery
    Типичный список проблем с autodiscovery
    Не там: разновидность не там, с которой мы столкнулись при форке компаний – эластик использовал старые ключи, в результате чего в новой компании эластики присоединялись к старому кластеру
  • Облако и autodiscovery
    Правила фильтрации (теги, SG)
    Серьезная проблема с фильтрацией по секьюрити группам, если кластер ищет не там и вы не фильтруете явно, то отладка будет весьма затруднена
  • Облако и autodiscovery
    Типичный список проблем с autodiscovery
    Не там
    Еще одна разновидность не там – изначально архитектурно была выбрана неправильная сеть для дискавери или коммуникации внутри кластера, достаточно часто так и случается. Очень опасно что иногда приходится переделывать вообще все, например если изначально было несколько VPC
  • Пример из жизни, есть какой-то сторонний сервис или сервис, который делает другая команда разработчиков
    Вы обнаруживаете какие-то ограничения, которые плохо ложатся в вашу архитектуру. Например на этот сервис авторы могли внести только 10 ip-адресов в ACL
  • Разновидность этой проблеым – при переходе в облако вы начинаете зависить от компаний, предоставляющих сервис
  • Последняя причина, которую вы можете увидеть на слайде - финансовая
  • Это затраты на инфраструктуру и вы даже не представляете как просто достичь этих цифр
  • Расскажу немного про типовую архитектуру типового приложения
  • проблема #2 в том как мы отлаживаем: трассировка, логи, tcpdump
  • Простой пример что нас ждет, если мы захотим посмотреть а что же все-таки происходит внутри приложения
  • Вы серьезно? Кассандра чтобы посмотреть логи на проекте с 10000 кликами в месяц?
  • Коала сегодня натружена
  • В результате автоматизации бардака получается автоматизированный бардак
  • Разработчики жаловались, что девопсы их тормозят. Оказалось что разработчики деплоят не так и много!
    время первого деплоя на стейджинг в районе 10 часов
    время последнего деплоя в районе 16 часов

×