Главная / Новости / «Крылья, лапы и хвосты» нашего Linux-хостинга, часть 1: как мы автоматизировали развёртывание инфраструктуры

«Крылья, лапы и хвосты» нашего Linux-хостинга, часть 1: как мы автоматизировали развёртывание инфраструктуры

23.12.2015

— Эй, птичка, летим со мной, там столько вкусного!!!
— Столько? [разводя руки]
— у-у [мотая головой и соединяя руки]

Как мы автоматизировали развёртывание инфраструктуры нашего Linux-хостинга

Одна из основных проблем, которая встаёт перед провайдерами shared-хостинга, ‒ это изолирование пользователей. Было бы, конечно, проще и надёжнее создавать для каждого пользователя контейнер, но это съедает лишние ресурсы и здорово уменьшает плотность упаковки сайтов на одну машину (я исхожу из комфортной для клиента упаковки, а не вариант “селёдки в бочке”, который всё ещё встречается на ультрадешёвых хостингах, когда открытие даже статичной страницы сайта клиента заметно тормозит из-за нагрузки на веб-бокс). Скажу больше, нередки ситуации, когда один клиент, случайно или намеренно, занимает слишком много ресурсов, в ущерб всем остальным.

CloudLinux и CageFS

Решить эти задачи, не тратя ресурсы серверов впустую, мы и намеревались при помощи CloudLinux. CloudLinux уже упоминался на Хабре. Это RHEL-совместимый дистрибутив, базирующийся на ядре OpenVZ. При помощи хитрых компонентов (CageFS и LVE) и модифицированного ядра позволяет ограничивать пользователей в ресурсах (процессор память диск) без создания контейнеров.

CageFS ‒ виртуальная файловая система, которая реализует Container-Based Virtualization (Operation System-Level Virtualization). Создаёт файловую структуру домашней директории и ограничивает пространство имён пользователя, изолируя его от других пользователей системы.

Структура домашней директории пользователя по умолчанию находится в /usr/share/cagefs-skeleton. В нашем случае используется своя структура директории home, путь к шаблону (skeleton) которой описывается в /etc/cagefs/cagefs.base.home.dirs.

LVE (Lightweight Virtual Environment) ‒ технология ограничения ресурсов на базе cgroups. Позволяет тонко ограничить ресурсы для конкретного пользователя на уровне ядра, таких как:

  • % мощности одного ядра CPU (может быть больше 100%);
  • физическая память;
  • виртуальная память;
  • число процессов, создаваемых внешними событиями (например новый HTTP-запрос);
  • число процессов внутри LVE;
  • производительность дисковой подсистемы;
  • количество операций ввода/вывода.

Причём применяются ограничения на основании хозяина процесса. Таким образом, сколько бы раз пользователь не зашёл на сервер по SSH, лимиты на ресурсы будут общими.

При полном исчерпании ресурсов активных серверов, мы заводим новый и создаём пользователей там. Конечно, можно всё это делать руками (тем более, что система мониторинга предупреждает об исчерпании ресурсов в текущей инфраструктуре). Но мы-то знаем, что самое дорогое в IT это время специалиста и лучше “день потерять, но потом за пять минут долететь” ‒ автоматизировать рутинные операции.

Для создания и подготовки новых серверов мы используем библиотеку Puppet fabric и Puppet.

Fabric позволит автоматизировать подключение к группам серверов и удалённый запуск команд, а Puppet используется для централизованного управления конфигурацией.

Пример развертывания сервера

Приведу пример развертывания сервера на чистую версию CentOS 6.7 x64, которую мы превратим в CloudLinux. Разворачивать скрипты буду удалённо со своей машины (CentOS) на машину с IP 10.0.0.146. Создание чистых машин с заданной ОС у нас сделано шаблонами и не требует вообще никаких усилий. Настройка IP выполняется тоже автоматически, свободные адреса берутся из специальной системы учёта, которую мы называем “Инвентори”.

Ставлю на свою рабочую машину fabric и puppet:


yum install gcc python-devel python-pip puppet puppet-server
pip install fabric

Скрипт начальной подготовки системы:

install_web.sh

При первом запуске скрипт отключит SELinux, установит необходимые репозитории, активирует репозитории CloudLinux и устанавливает необходимые компоненты CloudLinux, включая ядро:


ssh 10.0.0.146 < install_web.sh

После перезагрузки системы повторный запуск скрипта проинициализирует шаблон домашней директории (cagefs-skeleton), установит UID, с которого начинаются учётные записи пользователей CageFS, равным 2000 и включит CageFS.

Для установки и настройки необходимого ПО воспользуюсь fabric и puppet.

Добавлю наш сервер с IP 10.0.0.146 и hostname web.domain.com в конфигурацию Puppet — манифест web.pp, который описывает наш новый сервер:


node /^web.domain.com/ {
include base_web
}

Класс base_web включает в себя всю настройку нашего сервера. О том, как детально настраивать систему с помощью Puppet, в том числе примеры классов настройки, есть во множестве мест в Интернете, включая замечательный CookBook.

Скрипт конфигурации fabric:

fabfile.py

Наконец, запускаю fabric production, который установит клиент puppet и доплонительное ПО, и система готова:


fab deploy_p

При помощи puppet на сервер будут залиты единые настройки, которые мы используем для всех серверов одного типа.

Вся конфигурация (заливаемая на сервера через puppet) у нас хранится централизованно во внутреннем SVN-репозитории, что очень удобно, когда конфигурированием и поддержкой занимаются несколько человек. Допустим, нужно изменить конфигурацию по-умолчанию для sysctl. Идём в puppet/modules/sysctl/files/default/sysctl.conf и редактируем его по своему усмотрению.

Манифест puppet/modules/sysctl/manifests/init.pp будет выглядеть следующим образом:

init.pp

После чего снова запускаем fabric, который сделает puppet apply на нужных нам серверах:


fab deploy_p

Вот так, благодаря полной автоматизации Linux-хостинга, наши админы не тратят время на рутинные задачи, а решают действительно нестандартные проблемы. Это я вам как админ говорю. :)


Системный администратор

Михаил Дорожкин


Возврат к списку


Вас заинтересовали наши услуги, но есть вопросы? Наши специалисты готовы ответить на них и найти подходящее решение именно для Вас!
CAPTCHA

Нажимая на кнопку "Отправить" Вы подтверждаете свое согласие на обработку персональных данных.
Ваш запрос отправлен!