DevOps
движение по хрупкому
дну
Сергей Караткевич
Про меня:
Админю с 2003
Работаю с разработчиками с 2007
Решаю бизнес-задачи с 2010
«Сегодня я расскажу, как сэкономить
на базах данных огромные деньги,
например, миллион долларов, как
это сделали мы.»
Аникин Денис (Mail.Ru)
но мы не тратим миллион
долларов. даже полмиллиона
О чем я буду рассказывать
О чем я буду рассказывать
О чем я буду рассказывать
Сервера
Офисы
Сервера
Офисы
Сервера
Офисы
Сервера
Офисы
Сервера
Офисы
Сервера
Офисы
Сервера
Офисы
Сервера
Офисы
все это произошло за 4 месяца — 90 рабочих дней
Почему вы используете Docker
неправильно
«Иногда мне кажется, что Docker придумали специально, чтобы
оградить людей от NodeJS»
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"]
docker build .
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 &&
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/
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
•Помните о контексте
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 &&
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'
'
Почему immutable вас никуда не приведет
Почему immutable вас никуда не приведет
Почему immutable вас никуда не приведет
Почему immutable вас никуда не приведет
• Runtime vs Buildtime (в какой-то момент время билда ПРЕВЫШАЕТ
время работы контейнера)
• в моей системе время сборки 40минут + время замены через
терраформ
• у Akamai деплой новой конфигурации порядка 50минут
Почему микросервисы похоронят вашу компанию
Мы внедряем микросервисы, чтобы:
• позволить распределенным командам разрабатывать части
приложений
• деплоить части приложений независимо друг от друга
• деплоить без остановки приложения
• масштабировать части приложения быстро и независимо
Alice
Bob
Mysql
Alice
Bob
Mysql
Memcached
Alice
Bob
Mysql
Memcached
Worker
Alice
Bob
Mysql
Memcached
Worker
Solr
Alice
Balancer
Bob
Balancer
Memcached
Mysql
Solr
Worker
AliceAlice
BobBob
Alice
Balancer
Bob
Balancer
Memcached
Mysql
Solr
Worker
AliceAlice
BobBob
Elasticsearch
API
Alice
Balancer
Bob
Balancer
Memcached
Mysql
Solr
Worker
AliceAlice
BobBob
Elasticsearch
API
API
API
Elasticsearch
Elasticsearch
Alice
Balancer
Bob
Balancer
Memcached
Mysql
Solr
Worker
AliceAlice
BobBob
Elasticsearch
API
API
API
Elasticsearch
Elasticsearch
Balancer
Alice
Balancer
Bob
Balancer
Memcached
Mysql
Solr
Worker
AliceAlice
BobBob
Elasticsearch
API
API
API
Elasticsearch
Elasticsearch
Balancer
CDN
BI
Alice
Balancer
Bob
Balancer
Memcached
Mysql
Solr
Worker
AliceAlice
BobBob
Elasticsearch
API
API
API
Elasticsearch
Elasticsearch
Balancer
CDN
BI
Solr
Почему микросервисы похоронят вашу компанию
«В сложных системах поведение агентов приводит к
неожиданным результатам для всей системы»*
*Про сложность позже
'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,
'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'
'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
'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'
Почему микросервисы похоронят вашу компанию
Почему микросервисы похоронят вашу компанию
• 11 дней потребовалось C****F***e,
чтобы достать IP-адрес из блеклиста
• 41 день потребовался компании
A****I, чтобы избавиться от двойного слеша в
конце URL
• 13дней потребовалось компании
A****n, чтобы починить сеть в Сингапуре после
выхода из строя кабеля
Почему микросервисы похоронят вашу компанию
Почему ваша система слишком сложна
«Понимание происходящего может
приходить не сразу, а работать должно
было вчера»
@bogdar
Alice
Balancer
Bob
Balancer
Memcached
Mysql
Solr
Worker
AliceAlice
BobBob
Elasticsearch
API
API
API
Elasticsearch
Elasticsearch
Balancer
CDN
BI
Solr
Как микросервисы взаимодействуют между собой
Почему ваша система слишком сложна
Почему ваша система слишком сложна
Почему ваша система слишком сложна
Почему ваша система слишком сложна
• bogdar: понимание происходящего может приходить не сразу
• bogdar: а работать должно было вчера
• Среднее покрытие кода тестами на моих проектах 0.23%
Каждый контейнер становится уникальным
что вводит элемент неожиданности
КАЖДАЯ КОМАНДА СБОРКИ МОЖЕТ ОТКАЗАТЬ
ВЫ НИКОГДА НЕ ПРОВЕРЯЛИ ИХ ВСЕ
Agile, CI, CD и ChatOps не заработают
Деплой
Но это работает просто отлично
если работает
Деплой
Новый скрипт
максимум 16деплоев в день
с 4 апреля по 3 мая 210деплоев на стейджинг
И 230деплоев на продакшн!
Старый скрипт
32деплоя (за февраль)
Деплой
Основные проблемы:
Запуск постскриптов
Разница между nohup и &
Лок-файлы
Логгинг
Деплой
Логгинг
exec 3>&1 4>&2
trap 'exec 2>&4 1>&3' 0 1 2 3
exec 1> /var/log/deploy.log 2>&1
Деплой
Вопросы!
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)

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

  • 1.
  • 2.
    Про меня: Админю с2003 Работаю с разработчиками с 2007 Решаю бизнес-задачи с 2010
  • 3.
    «Сегодня я расскажу,как сэкономить на базах данных огромные деньги, например, миллион долларов, как это сделали мы.» Аникин Денис (Mail.Ru)
  • 4.
    но мы нетратим миллион долларов. даже полмиллиона
  • 5.
    О чем ябуду рассказывать
  • 6.
    О чем ябуду рассказывать
  • 7.
    О чем ябуду рассказывать
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
    все это произошлоза 4 месяца — 90 рабочих дней
  • 17.
    Почему вы используетеDocker неправильно «Иногда мне кажется, что Docker придумали специально, чтобы оградить людей от NodeJS»
  • 20.
    FROM php:7-fpm-alpine ENV DEBIAN_FRONTEND=noninteractive RUNecho '@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"]
  • 21.
  • 23.
    FROM php:7-fpm-alpine ENV DEBIAN_FRONTEND=noninteractive RUNecho '@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 &&
  • 24.
    FROM php:7-fpm-alpine ENV DEBIAN_FRONTEND=noninteractive RUNecho '@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/
  • 25.
    FROM php:7-fpm-alpine ENV DEBIAN_FRONTEND=noninteractive RUNecho '@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 •Помните о контексте
  • 26.
    FROM php:7-fpm-alpine ENV DEBIAN_FRONTEND=noninteractive RUNecho '@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 &&
  • 27.
    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'
  • 28.
  • 29.
    Почему immutable васникуда не приведет
  • 31.
    Почему immutable васникуда не приведет
  • 32.
    Почему immutable васникуда не приведет
  • 33.
    Почему immutable васникуда не приведет • Runtime vs Buildtime (в какой-то момент время билда ПРЕВЫШАЕТ время работы контейнера) • в моей системе время сборки 40минут + время замены через терраформ • у Akamai деплой новой конфигурации порядка 50минут
  • 34.
    Почему микросервисы похоронятвашу компанию Мы внедряем микросервисы, чтобы: • позволить распределенным командам разрабатывать части приложений • деплоить части приложений независимо друг от друга • деплоить без остановки приложения • масштабировать части приложения быстро и независимо
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
    Почему микросервисы похоронятвашу компанию «В сложных системах поведение агентов приводит к неожиданным результатам для всей системы»* *Про сложность позже
  • 48.
    '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,
  • 49.
    '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'
  • 50.
    '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
  • 51.
    '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'
  • 52.
  • 53.
    Почему микросервисы похоронятвашу компанию • 11 дней потребовалось C****F***e, чтобы достать IP-адрес из блеклиста • 41 день потребовался компании A****I, чтобы избавиться от двойного слеша в конце URL • 13дней потребовалось компании A****n, чтобы починить сеть в Сингапуре после выхода из строя кабеля
  • 55.
  • 56.
    Почему ваша системаслишком сложна «Понимание происходящего может приходить не сразу, а работать должно было вчера» @bogdar
  • 57.
  • 58.
    Почему ваша системаслишком сложна
  • 59.
    Почему ваша системаслишком сложна
  • 60.
    Почему ваша системаслишком сложна
  • 62.
    Почему ваша системаслишком сложна • bogdar: понимание происходящего может приходить не сразу • bogdar: а работать должно было вчера • Среднее покрытие кода тестами на моих проектах 0.23% Каждый контейнер становится уникальным что вводит элемент неожиданности КАЖДАЯ КОМАНДА СБОРКИ МОЖЕТ ОТКАЗАТЬ ВЫ НИКОГДА НЕ ПРОВЕРЯЛИ ИХ ВСЕ
  • 63.
    Agile, CI, CDи ChatOps не заработают
  • 65.
    Деплой Но это работаетпросто отлично если работает
  • 66.
    Деплой Новый скрипт максимум 16деплоевв день с 4 апреля по 3 мая 210деплоев на стейджинг И 230деплоев на продакшн! Старый скрипт 32деплоя (за февраль)
  • 67.
  • 68.
    Деплой Логгинг exec 3>&1 4>&2 trap'exec 2>&4 1>&3' 0 1 2 3 exec 1> /var/log/deploy.log 2>&1
  • 69.
  • 70.

Editor's Notes

  • #5 Я буду рассказывать об обычной небольшой организации, о том что не нужно увлекаться дорогостоящими и сложными решениями, когда достаточно простых и проверенных
  • #6 Я буду рассказывать об обычной небольшой организации если спросить любого девопса где на графике нормального распределения находится его компания, он точно укажет место - с правого края
  • #7 Я буду рассказывать об обычной небольшой организации если спросить любого девопса где на графике нормального распределения находится его компания, он точно укажет место - с правого края
  • #8 На самом деле мой опыт показывает, что большинство организаций сталкиваются примерно с теми же самыми проблемами и развиваются по одинаковому сценарию. Поэтому цель моего сегодняшнего выступления убедить вас в этом
  • #14 Решили минимизировать задержки, сделав географически разнесенную инсталляцию
  • #15 Потом мы решили что какие-то рынки нам дороже остальных, а на какие-то можно не обращать внимания
  • #16 Ну а потом бизнес решил выделить часть компании в отдельное бизнес-подразделение со своим оперированием
  • #19 На картинке типичный пример использования Docker. На самом деле нужно определиться, вы использует докер как систему управления пакетами или как систему управления виртуальными машинами?
  • #20 Как обычно развиваются события? Прямо перед выкаткой важной фичи, про которую вам забыли рассказать, появляется программист.
  • #21 И показывает вамм докерфайл. Вы радостно делаете
  • #23 И ничего не работает
  • #24 Тут обычно отваливаются желающие использовать дата-контейнры
  • #25 Проблема контекста для команды ADD
  • #27 Хардкоженные ключи в докерфайлах, а также переменные. В данном случае все безобидно, но никто не мешает программистам творчески улучшить, особенно когда процессы CI/CD будут автоматизированны
  • #29 А еще докер очень хорош, чтобы переложить ответственность на программистов.
  • #31 Вот почему
  • #32 Типичный "immutablе" сегодня выглядит так вносим изменения в кукбуки деплоим кукбуки в шеф-сервер запускаем пакер для нужной роли деплоим новые инстансы терраформом скейлим ап-даун или прибиваем старые инстансы
  • #33 это не работает. sorry to say that. софт бажный. терраформ однажды даже удалил продакшн базу (нет, это не компания Gliffy)terraform plan и terraform apply делают разные вещи. я видел rspec для терраформа, но пока все это допишутограничение scope делает не совсем то что ожидалосьпакер не работает в пределах МИНОРНОЙ версии(последний пример - неподгружающиеся ключи шефа в 0.9/0.10.1
  • #36 На самом деле микросервисы сложнее поэтому микросервисы менее гибки микросервисы менее защищены и менее стабильны
  • #37 Расскажу немного про типовую архитектуру типового приложения
  • #38 Расскажу немного про типовую архитектуру типового приложения
  • #39 Расскажу немного про типовую архитектуру типового приложения
  • #40 Расскажу немного про типовую архитектуру типового приложения
  • #41 Расскажу немного про типовую архитектуру типового приложения
  • #42 Расскажу немного про типовую архитектуру типового приложения
  • #43 Расскажу немного про типовую архитектуру типового приложения
  • #44 Расскажу немного про типовую архитектуру типового приложения
  • #45 Расскажу немного про типовую архитектуру типового приложения
  • #46 Расскажу немного про типовую архитектуру типового приложения
  • #47 Расскажу немного про типовую архитектуру типового приложения
  • #49 Облако и autodiscovery Типичный список проблем с autodiscovery Не там: по умолчанию эластик ищет в регионах по своим внутренним убеждениям. Программисты подняли в одном из регионов кластер и к нему начал цепляться эластик при сборке
  • #50 Облако и autodiscovery Типичный список проблем с autodiscovery Не там: разновидность не там, с которой мы столкнулись при форке компаний – эластик использовал старые ключи, в результате чего в новой компании эластики присоединялись к старому кластеру
  • #51 Облако и autodiscovery Правила фильтрации (теги, SG) Серьезная проблема с фильтрацией по секьюрити группам, если кластер ищет не там и вы не фильтруете явно, то отладка будет весьма затруднена
  • #52 Облако и autodiscovery Типичный список проблем с autodiscovery Не там Еще одна разновидность не там – изначально архитектурно была выбрана неправильная сеть для дискавери или коммуникации внутри кластера, достаточно часто так и случается. Очень опасно что иногда приходится переделывать вообще все, например если изначально было несколько VPC
  • #53 Пример из жизни, есть какой-то сторонний сервис или сервис, который делает другая команда разработчиков Вы обнаруживаете какие-то ограничения, которые плохо ложатся в вашу архитектуру. Например на этот сервис авторы могли внести только 10 ip-адресов в ACL
  • #54 Разновидность этой проблеым – при переходе в облако вы начинаете зависить от компаний, предоставляющих сервис
  • #55 Последняя причина, которую вы можете увидеть на слайде - финансовая
  • #56 Это затраты на инфраструктуру и вы даже не представляете как просто достичь этих цифр
  • #58 Расскажу немного про типовую архитектуру типового приложения
  • #59 проблема #2 в том как мы отлаживаем: трассировка, логи, tcpdump
  • #60 Простой пример что нас ждет, если мы захотим посмотреть а что же все-таки происходит внутри приложения
  • #61 Вы серьезно? Кассандра чтобы посмотреть логи на проекте с 10000 кликами в месяц?
  • #62 Коала сегодня натружена
  • #65 В результате автоматизации бардака получается автоматизированный бардак
  • #70 Разработчики жаловались, что девопсы их тормозят. Оказалось что разработчики деплоят не так и много! время первого деплоя на стейджинг в районе 10 часов время последнего деплоя в районе 16 часов