Движение по хрупкому дну / Сергей Караткевич (servers.ru)
-
Upload
ontico -
Category
Engineering
-
view
280 -
download
0
Transcript of Движение по хрупкому дну / Сергей Караткевич (servers.ru)
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 php7https://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.comosdc47a9835779cb32c0d06dafeb83fkx69331sdw5 && \ mkdir -p ~/.ssh && \ echo -e "Host github.com\n\tStrictHostKeyChecking no\n" >>~/.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 php7https://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.comosdc47a9835779cb32c0d06dafeb83fkx69331sdw5 && \ mkdir -p ~/.ssh && \ echo -e "Host github.com\n\tStrictHostKeyChecking no\n" >>~/.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 php7https://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.comosdc47a9835779cb32c0d06dafeb83fkx69331sdw5 && \ mkdir -p ~/.ssh && \ echo -e "Host github.com\n\tStrictHostKeyChecking no\n" >>~/.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 php7https://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.comosdc47a9835779cb32c0d06dafeb83fkx69331sdw5 && \ mkdir -p ~/.ssh && \ echo -e "Host github.com\n\tStrictHostKeyChecking no\n" >>~/.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 php7https://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.comosdc47a9835779cb32c0d06dafeb83fkx69331sdw5 && \ mkdir -p ~/.ssh && \ echo -e "Host github.com\n\tStrictHostKeyChecking no\n" >>~/.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.comosdc47a9835779cb32c0d06dafeb83fkx69331sdw5 &&
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 минут
Почему микросервисы похоронят вашу компанию
Мы внедряем микросервисы, чтобы:
• позволить распределенным командам разрабатывать части приложений• деплоить части приложений независимо друг от друга• деплоить без остановки приложения• масштабировать части приложения быстро и независимо
Почему микросервисы похоронят вашу компанию
«В сложных системах поведение агентов приводит к неожиданным результатам для всей системы»*
*Про сложность позже
'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
Как микросервисы взаимодействуют между собой
Почему ваша система слишком сложна
Почему ваша система слишком сложна
Почему ваша система слишком сложна
Почему ваша система слишком сложна• bogdar: понимание происходящего может приходить не сразу• bogdar: а работать должно было вчера
• Среднее покрытие кода тестами на моих проектах 0.23%
Каждый контейнер становится уникальным что вводит элемент неожиданности КАЖДАЯ КОМАНДА СБОРКИ МОЖЕТ ОТКАЗАТЬ ВЫ НИКОГДА НЕ ПРОВЕРЯЛИ ИХ ВСЕ
Agile, CI, CD и ChatOps не заработают
ДеплойНо это работает просто отлично если работает
ДеплойНовый скрипт
максимум 16 деплоев в день
с 4 апреля по 3 мая 210 деплоев на стейджинг
И 230 деплоев на продакшн!
Старый скрипт
32 деплоя (за февраль)
Деплой
Основные проблемы:
Запуск постскриптовРазница между nohup и &Лок-файлыЛоггинг
Деплой
Логгингexec 3>&1 4>&2trap 'exec 2>&4 1>&3' 0 1 2 3exec 1> /var/log/deploy.log 2>&1
Деплой
Вопросы!