Terraform: инфраструктура на уровне кода — страница 10 из 65


Инициализация ресурсов плюс шаблонизация серверов плюс оркестрация

Пример: Terraform, Packer, Docker и Kubernetes. Packer используется для создания образов ВМ с установленными Docker и Kubernetes. Затем Terraform развертывает: а) серверы с помощью этих образов; б) всю остальную инфраструктуру, включая топологию сети (VPC, подсети, таблицы маршрутизации), хранилища данных (MySQL, Redis) и балансировщики нагрузки. Когда серверы загрузятся, они сформируют кластер Kubernetes, которым вы будете запускать и администрировать свои приложения в виде контейнеров Docker (рис. 1.11).

Рис. 1.11. Совместное использование Terraform, Packer, Docker и Kubernetes

Преимущество этого подхода в том, что образы Docker собираются довольно быстро, поэтому их можно запускать и тестировать на локальном компьютере. Вы также можете использовать богатые возможности Kubernetes, включая различные стратегии развертывания, автовосстановление, автомасштабирование и т. д. Недостатки связаны с повышением сложности — как с точки зрения инфраструктуры (развертывание кластеров Kubernetes является сложным и дорогим, хотя большинство основных облачных провайдеров теперь предоставляют управляемые сервисы Kubernetes, на которые можно возложить часть этой работы), так и в смысле дополнительных слоев абстракции (Kubernetes, Docker, Packer), которые необходимо изучать, обслуживать и отлаживать.


Резюме

Ниже показана сводная таблица самых популярных средств IaC (табл. 1.4). Заметьте, что здесь приводятся стандартные и самые распространенные способы их применения. Как уже упоминалось ранее, данные инструменты достаточно гибкие, чтобы их можно было применять и в других конфигурациях (например, Chef можно запускать без центрального сервера, а Salt поддерживает неизменяемую инфраструктуру).


Таблица 1.4. Сравнение наиболее распространенных способов использования самых популярных средств IaC

Инструмент

Код

Об­ла­ка

Тип

Инфра­структура

Язык

Агент

Вед. cер­вер

Сообщество

Зрелость

Chef

Откр.

Все

Упр. конф.

Изменя­емая

Проце­дур­ный

Есть

Есть

Большое

Высокая

Puppet

Откр.

Все

Упр. конф.

Изменя­емая

Декларативный

Есть

Есть

Большое

Высокая

Ansible

Откр.

Все

Упр. конф.

Изменя­емая

Проце­дур­ный

Нет

Нет

Огромное

Средняя

SaltStack

Откр.

Все

Упр. конф.

Изменя­емая

Декларативный

Есть

Есть

Большое

Средняя

CloudFor­mation

Закр.

AWS

Иниц. рес.

Неизменяемая

Декларативный

Нет

Нет

Маленькое

Средняя

Heat

Откр.

Все

Иниц. рес.

Неизменяемая

Декларативный

Нет

Нет

Маленькое

Низкая

Terraform

Откр.

Все

Иниц. рес.

Неизменяемая

Декларативный

Нет

Нет

Огромное

Низкая

В компании Gruntwork нам нужно было открытое, не привязанное к конкретному облаку средство инициализации ресурсов, которое поддерживает неизменяемую инфраструктуру, декларативный язык, архитектуру, не требующую наличия центральных серверов и агентов, и имеет большое сообщество и зрелую кодовую базу. Как показывает табл. 1.4, проект Terraform хоть и неидеальный, но именно он больше всего удовлетворяет нашим критериям.

Подходит ли он под ваши критерии? Если да, то переходите к главе 2, в которой вы научитесь его использовать.

3 Источник: KimG., HumbleJ., DeboisP., WillisJ. TheDevOpsHandbook: HowtoCreateWorld-ClassAgility, Reliability & SecurityinTechnologyOrganizations. — ITRevolutionPress, 2016.

4 Идемпотентность — свойство объекта или операции при повторном применении операции к объекту давать тот же результат, что и при первом.

5 В современных операционных системах код выполняется в одном из двух «пространств»: в пространстве ядра и пространстве пользователя. Код, который работает в пространстве ядра, имеет прямой и неограниченный доступ ко всему оборудованию. На него не распространяются ограничения безопасности: вы можете выполнять любые процессорные инструкции, обращаться к любому участку жесткого диска, записывать в любой адрес памяти. При этом сбой в пространстве ядра обычно приводит к сбою всего компьютера. В связи с этим оно обычно отводится для самых низкоуровневых и доверенных функций ОС (которые называют ядром). Код в пользовательском пространстве не имеет непосредственного доступа к аппаратному обеспечению и вместо этого должен использовать API, предоставляемые ядром ОС. Эти интерфейсы могут накладывать ограничения безопасности (скажем, права доступа) и локализовать сбои в пользовательских приложениях, поэтому весь прикладной код работает в пользовательском пространстве.

6 Той изоляции, которую предоставляют контейнеры, как правило, достаточно для выполнения собственного кода. Но если нужно выполнять сторонний код (например, если вы хотите создать свое публичное облако), который может намеренно предпринять вредоносные действия, вам пригодятся повышенные гарантии изоляции ВМ.

7 В качестве альтернативы bash для настройки образов в Packer можно использовать средства управления конфигурацией, такие как Ansible и Chef.

8 В качестве примера можно взять библиотеку IaC от компании Gruntwork по адресу bit.ly/2H3Y7yT.

9 Docker, Packer и Kubernetes не участвуют в сравнении, так как их можно использовать в сочетании с любыми средствами управления конфигурацией или инициализации ресурсов.

10 На сегодня различие между управлением конфигурацией и инициализацией ресурсов еще менее очевидно, поскольку ряд популярных средств, входящих в первую категорию, таких как Chef Provisioning (https://github.com/chef-boneyard/chef-provisioning) и Puppet AWS Module (bit.ly/2YIQIuN), постепенно улучшил поддержку инициализации ресурсов.

11   Большая часть этих данных, включая количество участников, звезд, изменений и заявок, была взята из репозиториев открытого исходного кода и систем отслеживания ошибок (в основном в GitHub) каждого отдельного инструмента. Поскольку проект CloudFormation имеет закрытый исходный код, некоторые из этих сведений для него недоступны.

12   Это количество руководств в Chef Supermarket (bit.ly/2MNXWuS).

13   Чтобы избежать ложных срабатываний для chef, я искал по chef devops.

14   На основе учетной записи Puppet Labs в JIRA (bit.ly/2ZN3ppq).

15   Это количество модулей в Puppet Forge (forge.puppet.com).

16   Чтобы избежать ложных срабатываний для puppet, я искал по puppet devops.

17   Это количество универсальных ролей в Ansible Galaxy (galaxy.ansible.com).

18   Это количество формул в учетной записи Salt Stack Formulas в GitHub (github.com/saltstack-formulas).

19   Это количество шаблонов в учетной записи awslabs в GitHub (github.com/awslabs).

20 На основе системы отслеживания ошибок OpenStack (bit.ly/31jeDCH).

21 Мне не удалось найти ни одной коллекции шаблонов Heat, подготовленной сообществом.

22 Чтобы избежать ложных срабатываний для heat, я искал по openstack.

23 Это количество модулей в реестре Terraform (registry.terraform.io).

24 Снижение количества фиксаций кода и заявок у Terraform вызвано лишь тем фактом, что я измеряю только основной репозиторий проекта, тогда как в 2017 году код всех провайдеров был распределен по отдельным репозиториям. Поэтому здесь не учитывается огромная доля активности в репозиториях более чем 100 провайдеров.

2. Приступаем к работе с Terraform

В этой главе вы научитесь основам применения Terraform. Этот инструмент прост в изучении, поэтому за следующие 40 страниц вы пройдете путь от выполнения ваших первых команд до развертывания кластера серверов с балансировщиком нагрузки, который распределяет между ними трафик. Такая инфраструктура будет хорошей отправной точкой для запуска масштабируемых высокодоступных веб-сервисов. В следующих главах мы продолжим улучшать этот пример.

Terraform умеет инициализировать инфраструктуру как в публичных облаках, вроде Amazon Web Services (AWS), Azure, Google Cloud и DigitalOcean, так и в частных облачных платформах и системах виртуализации вроде OpenStack и VMWare. Практически во всех примерах кода в книге будет использоваться AWS. Это хороший выбор для изучения Terraform по следующим причинам.

• AWS, вне всяких сомнений, является самым популярным провайдером облачной инфраструктуры. Его доля на рынке облачных решений составляет 45 %, что больше, чем у трех ближайших конкурентов (Microsoft, Google и IBM), вместе взятых (http://bit.ly/2kWCuCm).

• AWS предоставляет широчайший спектр надежных и масштабируемых сервисов с облачным размещением, включая Amazon Elastic Compute Cloud (Amazon EC2), который можно использовать для развертывания виртуальных серверов, Auto Scaling Groups (ASGs), упрощающий управление кластером виртуальных серверов, и Elastic Load Balancers (ELBs), с помощью которого можно распределять трафик между виртуальными серверами кластера25.

• В первый год использования AWS предлагает щедрый бесплатный тариф (https://aws.amazon.com/free/), который позволяет выполнить все эти примеры без денежных затрат. Если вы уже исчерпали свои бесплатные кредиты, работа с примерами из этой книги будет стоить не дороже нескольких долларов.

Не нужно волноваться, если вы прежде не использовали AWS или Terraform. Этот учебник подойдет для новичков в обеих технологиях. Я проведу вас через такие этапы, как:

• подготовка вашей учетной записи в AWS;

• установка Terraform;

• развертывание одного сервера;

• развертывание одного веб-сервера;

• развертывание конфигурируемого веб-сервера;