Опубликовано

Встречайте 2-е издание книги: “Программирование инфраструктуры”

Программирование инфраструктуры. 2-е издание

Впервые на русском языке  книга об управлении облачной IT-инфраструктурой. Показаны методы контроля и развития версий инфраструктуры, аналогичные применяемым при работе с исходным кодом. Рассказано  об управлении облачными серверами, их стеками и кластерами через Terraform-подобный инфраструктурный код. Описано, как получать, поддерживать и масштабировать облачные ресурсы, как управлять облачными серверами, их стеками и кластерами, как организовать непрерывное развертывание и масштабирование облачных инфраструктур.

Для системных администраторов, инженеров по облачным сервисам, программистов,  DevOps-специалистов

Практики IaC постепенно развивались от поддержки серверов до управления полнофункциональными стеками. Но за новые возможности приходится расплачиваться усложнением систем. Эта книга позволит вам не только освоить паттерны проектирования облачных систем, но и вывести автоматизацию серверов на новый уровень.
Патрик Дебуа, основатель конференции DevOpsDays

Как создаются адаптивные облачные системы

Ещё несколько лет назад тема программируемой инфраструктуры (Infrastructure as Code – IaC) была в новинку. Но сегодня даже самые консервативные организации, например крупные банки, постепенно переносят инфраструктуру в облака, и становится важно поддерживать её конфигурацию в виде обширных баз кода.

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

В книге рассмотрены:

  • Основы: программирование инфраструктуры как двигатель непрерывных изменений, помогающий поднять планку эксплуатационного качества и освоить инструменты и технологии для создания облачных платформ
  • Работа с инфраструктурными стеками: способы определения, предоставления, тестирования и непрерывной доставки изменений при обслуживании инфраструктурных мощностей
  • Работа с серверами и другими платформами: паттерны выделения и конфигурирования отдельных серверов и их кластеров
  • Работа с большими командами и системами: описание типичных потоков задач и управление ими, а также понятие об архитектурных паттернах, при помощи которых удобно создавать и эксплуатировать инфраструктурные компоненты

Книгу “Программирование инфраструктуры. 2-е издание” можно купить со скидкой в интернет-магазине издательства “БХВ“.

Предисловие…………………………………………………………………………………………… 18

Зачем я написал эту книгу………………………………………………………………………………………………………… 19

Что нового и особенного во втором издании…………………………………………………………………………… 19

Что дальше…………………………………………………………………………………………………………………………………. 21

Чего ожидать и чего не стоит ожидать от этой книги…………………………………………………………….. 21

Исторический контекст программирования инфраструктуры………………………………………………. 22

Для кого эта книга……………………………………………………………………………………………………………………… 22

Принципы, практики, паттерны………………………………………………………………………………………………… 23

Примеры с ShopSpinner……………………………………………………………………………………………………………… 24

Соглашения, используемые в книге………………………………………………………………………………………….. 24

Благодарности…………………………………………………………………………………………………………………………… 25

Часть I. Основы……………………………………………………………………………….. 27

Глава 1. Что такое программирование инфраструктуры………………………… 29

Из железного века в облачный………………………………………………………………………………………………….. 30

Программирование инфраструктуры………………………………………………………………………………………. 31

Достоинства программирования инфраструктуры………………………………………………………………… 32

Программирование инфраструктуры как оптимизация в расчете на изменения…………………. 32

Возражение: «мы не так часто вносим изменения, поэтому их автоматизация не столь нужна»            33

Возражение: «сначала систему нужно построить, а уже потом автоматизировать». 34

Возражение: «приходится выбирать между скоростью и качеством»………………………. 35

Четыре ключевые метрики………………………………………………………………………………………………………… 37

Три ключевые практики для программирования инфраструктуры………………………………………. 37

Ключевая практика: все определяется как код……………………………………………………………. 38

Ключевая практика: вся текущая работа непрерывно тестируется и сдается…………. 38

Ключевая практика: создаются небольшие простые фрагменты, которые поддаются изменениям независимо друг от друга………………………………………………………………………………………………………………………………… 39

Заключение………………………………………………………………………………………………………………………………… 39

Глава 2. Инфраструктурные принципы для облачного века………………….. 40

Принцип: исходим из того, что системы ненадежны……………………………………………………………… 40

Принцип: все нужно делать воспроизводимым………………………………………………………………………. 41

Западня: системы-снежинки……………………………………………………………………………………………………… 42

Принцип: создавайте такие компоненты, которые легко пустить в расход…………………………. 43

Принцип: минимизируем вариативность…………………………………………………………………………………. 44

Конфигурационная энтропия………………………………………………………………………………………… 45

Принцип: убедитесь, что любой процесс сможете повторить……………………………………………….. 47

Заключение………………………………………………………………………………………………………………………………… 48

Глава 3. Инфраструктурные платформы………………………………………………… 49

Из каких частей состоит инфраструктурная система…………………………………………………………….. 49

Инфраструктурные платформы……………………………………………………………………………………………….. 51

Инфраструктурные ресурсы…………………………………………………………………………………………………….. 53

Вычислительные ресурсы……………………………………………………………………………………………… 54

Ресурсы для хранения данных………………………………………………………………………………………. 55

Сетевые ресурсы…………………………………………………………………………………………………………….. 56

Заключение………………………………………………………………………………………………………………………………… 59

Глава 4. Ключевая практика: все определяется как код………………………… 60

Зачем следует определять инфраструктуру так, чтобы ее можно было программировать.. 60

Что можно определить как код…………………………………………………………………………………………………. 61

Выбирайте инструменты, конфигурация которых вынесена наружу……………………….. 61

Управление вашим кодом в системе контроля версий………………………………………………… 62

Языки для программирования инфраструктуры…………………………………………………………………….. 63

Скрипты для обслуживания инфраструктуры…………………………………………………………….. 64

Декларативные инфраструктурные языки…………………………………………………………………… 66

Программируемые императивные инфраструктурные языки…………………………………….. 68

Сравнение декларативных и императивных языков в контексте инфраструктуры…. 69

Предметно-ориентированные инфраструктурные языки……………………………………………. 69

Языки общего назначения в сравнении с инфраструктурными DSL…………………………. 71

Принципы реализации при определении инфраструктуры, которую планируется программировать              71

Разделяем декларативный и императивный код………………………………………………………….. 72

Обращайтесь с инфраструктурным кодом точно как с «настоящим»……………………….. 72

Заключение………………………………………………………………………………………………………………………………… 73

Часть II. Работа с инфраструктурными стеками………………. 75

Глава 5. Программирование инфраструктурных стеков………………………… 77

Что такое инфраструктурный стек…………………………………………………………………………………………… 77

Код стека…………………………………………………………………………………………………………………………. 78

Инстанс стека………………………………………………………………………………………………………………….. 79

Конфигурирование серверов в стеке…………………………………………………………………………….. 79

Низкоуровневые инфраструктурные языки…………………………………………………………………. 80

Высокоуровневые инфраструктурные языки………………………………………………………………. 81

Паттерны и антипаттерны структурирования стеков……………………………………………………………. 82

Антипаттерн: монолитный стек…………………………………………………………………………………….. 82

Зачем это нужно…………………………………………………………………………………………………….. 82

Применимость…………………………………………………………………………………………………………. 83

Последствия……………………………………………………………………………………………………………. 83

Внедрение……………………………………………………………………………………………………………….. 84

Смежные паттерны………………………………………………………………………………………………… 84

Паттерн: стек группы приложений……………………………………………………………………………….. 84

Зачем это нужно…………………………………………………………………………………………………….. 85

Применимость…………………………………………………………………………………………………………. 85

Последствия……………………………………………………………………………………………………………. 85

Внедрение……………………………………………………………………………………………………………….. 86

Смежные паттерны………………………………………………………………………………………………… 86

Паттерн: сервисный стек……………………………………………………………………………………………….. 86

Зачем это нужно…………………………………………………………………………………………………….. 86

Применимость…………………………………………………………………………………………………………. 87

Последствия……………………………………………………………………………………………………………. 87

Внедрение……………………………………………………………………………………………………………….. 87

Смежные паттерны………………………………………………………………………………………………… 87

Паттерн: микростек………………………………………………………………………………………………………… 87

Зачем это нужно…………………………………………………………………………………………………….. 88

Последствия……………………………………………………………………………………………………………. 88

Внедрение……………………………………………………………………………………………………………….. 88

Смежные паттерны………………………………………………………………………………………………… 88

Заключение………………………………………………………………………………………………………………………………… 88

Глава 6. Создание окружений с помощью стеков…………………………………… 89

Зачем вообще нужны окружения……………………………………………………………………………………………… 89

Окружения для доставки………………………………………………………………………………………………… 89

Множество продакшен-окружений………………………………………………………………………………. 90

Окружения, согласованность и конфигурация…………………………………………………………….. 91

Паттерны построения окружений…………………………………………………………………………………………….. 92

Антипаттерн: один стек на несколько окружений………………………………………………………. 92

Зачем это нужно…………………………………………………………………………………………………….. 92

Последствия……………………………………………………………………………………………………………. 93

Смежные паттерны………………………………………………………………………………………………… 93

Антипаттерн: копирование и вставка окружения……………………………………………………….. 94

Зачем это нужно…………………………………………………………………………………………………….. 94

Применимость…………………………………………………………………………………………………………. 94

Последствия……………………………………………………………………………………………………………. 94

Внедрение……………………………………………………………………………………………………………….. 95

Смежные паттерны………………………………………………………………………………………………… 95

Паттерн: переиспользуемый стек………………………………………………………………………………….. 95

Зачем это нужно…………………………………………………………………………………………………….. 96

Применимость…………………………………………………………………………………………………………. 97

Последствия……………………………………………………………………………………………………………. 97

Внедрение……………………………………………………………………………………………………………….. 97

Смежные паттерны………………………………………………………………………………………………… 97

Построение окружений с использованием множества стеков……………………………………………….. 98

Заключение………………………………………………………………………………………………………………………………… 99

Глава 7. Конфигурирование инстансов стеков…………………………………….. 100

Использование параметров стека для создания уникальных идентификаторов………………. 101

Пример параметров стека……………………………………………………………………………………………………….. 102

Паттерны конфигурирования стеков……………………………………………………………………………………… 103

Антипаттерн: установка параметров стека вручную……………………………………………….. 103

Зачем это нужно…………………………………………………………………………………………………… 103

Последствия………………………………………………………………………………………………………….. 104

Внедрение……………………………………………………………………………………………………………… 104

Смежные паттерны………………………………………………………………………………………………. 104

Паттерн: переменные окружения стека……………………………………………………………………… 105

Зачем это нужно…………………………………………………………………………………………………… 105

Применимость………………………………………………………………………………………………………. 105

Последствия………………………………………………………………………………………………………….. 105

Внедрение……………………………………………………………………………………………………………… 106

Смежные паттерны………………………………………………………………………………………………. 107

Паттерн: скрипты для ввода параметров…………………………………………………………………… 107

Зачем это нужно…………………………………………………………………………………………………… 107

Применимость………………………………………………………………………………………………………. 107

Последствия………………………………………………………………………………………………………….. 108

Внедрение……………………………………………………………………………………………………………… 108

Смежные паттерны………………………………………………………………………………………………. 110

Паттерн: конфигурационные файлы стека………………………………………………………………… 110

Зачем это нужно…………………………………………………………………………………………………… 110

Применимость………………………………………………………………………………………………………. 111

Последствия………………………………………………………………………………………………………….. 111

Внедрение……………………………………………………………………………………………………………… 111

Смежные паттерны………………………………………………………………………………………………. 113

Паттерн: стек-обертка………………………………………………………………………………………………….. 113

Зачем это нужно…………………………………………………………………………………………………… 114

Последствия………………………………………………………………………………………………………….. 114

Внедрение……………………………………………………………………………………………………………… 115

Смежные паттерны………………………………………………………………………………………………. 116

Паттерн: конвейеризация параметров стека……………………………………………………………… 116

Зачем это нужно…………………………………………………………………………………………………… 117

Применимость………………………………………………………………………………………………………. 117

Последствия………………………………………………………………………………………………………….. 117

Внедрение……………………………………………………………………………………………………………… 118

Смежные паттерны………………………………………………………………………………………………. 119

Паттерн: реестр параметров стека……………………………………………………………………………… 119

Зачем это нужно…………………………………………………………………………………………………… 120

Применимость………………………………………………………………………………………………………. 120

Последствия………………………………………………………………………………………………………….. 120

Внедрение……………………………………………………………………………………………………………… 121

Смежные паттерны………………………………………………………………………………………………. 122

Конфигурационный реестр…………………………………………………………………………………………………….. 122

Внедрение конфигурационного реестра…………………………………………………………………….. 123

Реестры инструмента, предназначенного для автоматизации инфраструктуры 123

Продукты, которые могут послужить конфигурационным реестром
общего назначения………………………………………………………………………………………………. 123

Сервисы реестра, предоставляемые на платформе………………………………………….. 124

Конфигурационные реестры «сделай сам»……………………………………………………….. 124

Один или множество конфигурационных реестров…………………………………………………… 125

Обращение с секретами как с параметрами………………………………………………………………………….. 125

Шифрование секретов………………………………………………………………………………………………….. 126

Несекретная авторизация……………………………………………………………………………………………. 126

Инъекция секретов во время выполнения…………………………………………………………………… 127

Одноразовые секреты…………………………………………………………………………………………………… 127

Заключение………………………………………………………………………………………………………………………………. 128

Глава 8. Ключевая практика: непрерывное тестирование и доставка….. 129

Зачем непрерывно тестировать инфраструктурный код……………………………………………………… 130

Что такое непрерывное тестирование………………………………………………………………………… 130

Что следует тестировать на уровне инфраструктуры………………………………………………. 132

Сложности с тестированием инфраструктурного кода……………………………………………………….. 134

Проблема: тесты для декларативного кода обычно не слишком ценны…………………. 135

Тестирование изменчивого декларативного кода…………………………………………….. 136

Тестирование сочетаний декларативного кода………………………………………………… 137

Проблема: тестирование инфраструктурного кода идет медленно………………………… 137

Проблема: зависимости усложняют тестовую инфраструктуру……………………………… 139

Прогрессивное тестирование………………………………………………………………………………………………….. 140

Тестовая пирамида………………………………………………………………………………………………………. 141

Модель тестирования по принципу швейцарского сыра………………………………………….. 143

Конвейеры доставки для работы с инфраструктурой………………………………………………………….. 144

Этапы работы конвейера…………………………………………………………………………………………….. 145

Масштаб компонентов, тестируемых на этапе…………………………………………………………. 146

Масштаб зависимостей, используемых на этапе конвейера……………………………………. 146

Платформенные элементы, требуемые на этапе конвейера…………………………………….. 147

Программы и сервисы для организации конвейера доставки………………………………….. 148

Тестирование в продакшене…………………………………………………………………………………………………… 150

Что невозможно воспроизвести вне продакшена………………………………………………………. 151

Управление рисками тестирования в продакшене……………………………………………………. 152

Заключение………………………………………………………………………………………………………………………………. 153

Глава 9. Тестирование инфраструктурных стеков……………………………….. 154

Пример инфраструктуры………………………………………………………………………………………………………… 154

Пример стека…………………………………………………………………………………………………………………. 155

Пример стека и конвейер для него………………………………………………………………………………. 156

Офлайновые этапы тестирования стеков………………………………………………………………………………. 156

Проверка синтаксиса……………………………………………………………………………………………………. 157

Офлайновый статический анализ кода………………………………………………………………………. 157

Статический анализ кода с применением API…………………………………………………………… 158

Тестирование с применением имитационного API……………………………………………………. 158

Онлайновые этапы тестирования стеков………………………………………………………………………………. 159

Предпросмотр: проверяем, какие изменения могут быть внесены…………………………… 160

Верификация: выдвижение гипотез об инфраструктурных ресурсах……………………… 161

Результаты: убеждаемся, что инфраструктура работает корректно………………………. 162

Использование тестовых контекстов для обращения с зависимостями……………………………… 163

Тестовые двойники для восходящих зависимостей…………………………………………………… 164

Тестовые контексты для нисходящих зависимостей…………………………………………………. 165

Проводим рефакторинг компонентов так, чтобы их легко было изолировать……….. 167

Паттерны жизненного цикла для тестовых инстансов стеков…………………………………………….. 167

Паттерн: персистентный тестовый стек……………………………………………………………………… 168

Зачем это нужно…………………………………………………………………………………………………… 168

Применимость………………………………………………………………………………………………………. 168

Последствия………………………………………………………………………………………………………….. 168

Внедрение……………………………………………………………………………………………………………… 169

Смежные паттерны………………………………………………………………………………………………. 169

Паттерн: эфемерный тестовый стек……………………………………………………………………………. 169

Зачем это нужно…………………………………………………………………………………………………… 170

Применимость………………………………………………………………………………………………………. 170

Последствия………………………………………………………………………………………………………….. 170

Внедрение……………………………………………………………………………………………………………… 170

Смежные паттерны………………………………………………………………………………………………. 170

Антипаттерн: сдвоенные этапы с персистентными и эфемерными стеками…………… 170

Зачем это нужно…………………………………………………………………………………………………… 171

Применимость………………………………………………………………………………………………………. 171

Последствия………………………………………………………………………………………………………….. 171

Внедрение……………………………………………………………………………………………………………… 171

Смежные паттерны………………………………………………………………………………………………. 172

Паттерн: периодическая пересборка стека……………………………………………………………….. 172

Зачем это нужно…………………………………………………………………………………………………… 172

Применимость………………………………………………………………………………………………………. 172

Последствия………………………………………………………………………………………………………….. 172

Внедрение……………………………………………………………………………………………………………… 173

Смежные паттерны………………………………………………………………………………………………. 173

Паттерн: серийный сброс стека………………………………………………………………………………….. 173

Зачем это нужно…………………………………………………………………………………………………… 174

Применимость………………………………………………………………………………………………………. 174

Последствия………………………………………………………………………………………………………….. 174

Внедрение……………………………………………………………………………………………………………… 174

Смежные паттерны………………………………………………………………………………………………. 174

Оркестрация тестов…………………………………………………………………………………………………………………. 175

Поддержка локального тестирования………………………………………………………………………… 175

Избегайте плотного связывания с инструментами конвейера………………………………….. 176

Инструменты оркестрации тестов………………………………………………………………………………. 176

Заключение………………………………………………………………………………………………………………………………. 177

Часть III. Работа с серверами и другими платформами исполнения приложений…………………………………………………………………………………… 179

Глава 10. Среды выполнения приложений…………………………………………… 181

Исходно облачная инфраструктура под потребности приложений…………………………………… 182

Цели для сред исполнения приложений………………………………………………………………………………… 183

Развертываемые части приложения……………………………………………………………………………. 183

Пакеты для развертывания………………………………………………………………………………………….. 184

Развертывание приложений на серверах………………………………………………………………………………. 185

Упаковка приложений в контейнерах………………………………………………………………………… 185

Развертывание приложений в серверных кластерах………………………………………………… 186

Развертывание приложений в кластерах приложений…………………………………………………………. 187

Пакеты для развертывания приложений в кластерах………………………………………………………….. 188

Развертывание серверного приложения по модели FaaS…………………………………………………….. 190

Данные приложений………………………………………………………………………………………………………………… 190

Структуры и схемы данных………………………………………………………………………………………… 191

Исходно облачная инфраструктура для хранения приложений……………………………… 192

Соединяемость приложений…………………………………………………………………………………………………… 192

Обнаружение сервисов……………………………………………………………………………………………………………. 193

Заключение………………………………………………………………………………………………………………………………. 195

Глава 11. Сборка серверов в коде…………………………………………………………. 196

Что на сервере………………………………………………………………………………………………………………………….. 197

Откуда что берется………………………………………………………………………………………………………………….. 198

Код для конфигурации сервера………………………………………………………………………………………………. 199

Модули кода для конфигурации сервера…………………………………………………………………… 200

Проектирование модулей для конфигурации серверного кода……………………………….. 201

Версионирование и продвижение серверного кода………………………………………………….. 202

Серверные роли……………………………………………………………………………………………………………. 203

Тестирование серверного кода………………………………………………………………………………………………. 204

Прогрессивное тестирование серверного кода………………………………………………………….. 204

Что тестировать в серверном коде………………………………………………………………………………. 205

Как тестировать серверный код………………………………………………………………………………….. 206

Создание нового серверного инстанса………………………………………………………………………………….. 207

Сборка нового серверного инстанса вручную………………………………………………………….. 208

Создаем сервер с помощью скрипта…………………………………………………………………………… 209

Создание сервера с помощью инструмента управления стеком……………………………… 209

Конфигурирование платформы для автоматического создания серверов……………… 210

Как собрать сервер с помощью сетевого инструмента предоставления ресурсов… 211

Заблаговременная сборка серверов………………………………………………………………………………………. 212

Горячее клонирование сервера…………………………………………………………………………………… 212

Использование серверного снимка……………………………………………………………………………… 213

Создание чистого серверного образа…………………………………………………………………………. 213

Конфигурирование нового серверного инстанса…………………………………………………………………. 214

Зажаривание серверного инстанса…………………………………………………………………………….. 215

Выпекание серверных образов……………………………………………………………………………………. 216

Комбинируем выпекание и зажаривание…………………………………………………………………… 216

Применение серверной конфигурации при создании сервера………………………………….. 217

Заключение………………………………………………………………………………………………………………………………. 218

Глава 12. Управление изменениями, поступающими на серверы…………. 219

Паттерны управления изменениями: когда применять изменения………………………………………. 220

Антипаттерн: применять по факту изменений…………………………………………………………… 220

Зачем это нужно…………………………………………………………………………………………………… 220

Применимость………………………………………………………………………………………………………. 221

Последствия………………………………………………………………………………………………………….. 221

Внедрение……………………………………………………………………………………………………………… 221

Смежные паттерны………………………………………………………………………………………………. 221

Паттерн: непрерывная синхронизация конфигурации……………………………………………… 222

Зачем это нужно…………………………………………………………………………………………………… 222

Применимость………………………………………………………………………………………………………. 223

Последствия………………………………………………………………………………………………………….. 223

Внедрение……………………………………………………………………………………………………………… 223

Смежные паттерны………………………………………………………………………………………………. 223

Паттерн: неизменяемый сервер…………………………………………………………………………………… 224

Зачем это нужно…………………………………………………………………………………………………… 224

Применимость………………………………………………………………………………………………………. 224

Последствия………………………………………………………………………………………………………….. 224

Внедрение……………………………………………………………………………………………………………… 225

Смежные паттерны………………………………………………………………………………………………. 225

Как применять код конфигурации сервера……………………………………………………………………………. 226

Паттерн: конфигурация сервера методом push…………………………………………………………. 226

Зачем это нужно…………………………………………………………………………………………………… 226

Применимость………………………………………………………………………………………………………. 226

Последствия………………………………………………………………………………………………………….. 227

Внедрение……………………………………………………………………………………………………………… 227

Смежные паттерны………………………………………………………………………………………………. 228

Паттерн: конфигурация сервера методом pull…………………………………………………………… 228

Зачем это нужно…………………………………………………………………………………………………… 228

Применимость………………………………………………………………………………………………………. 229

Внедрение……………………………………………………………………………………………………………… 229

Смежные паттерны………………………………………………………………………………………………. 230

Другие события серверного жизненного цикла…………………………………………………………………….. 230

Останов и перезапуск серверного инстанса………………………………………………………………. 231

Замена серверного инстанса……………………………………………………………………………………….. 232

Восстановление отказавшего сервера……………………………………………………………………….. 233

Заключение………………………………………………………………………………………………………………………………. 234

Глава 13. Образы серверов как код……………………………………………………… 235

Сборка серверного образа……………………………………………………………………………………………………… 235

Зачем собирать серверный образ……………………………………………………………………………….. 236

Как собрать серверный образ……………………………………………………………………………………… 237

Инструменты для сборки серверных образов……………………………………………………………. 237

Процесс онлайновой сборки образа…………………………………………………………………………… 238

Инфраструктура для сборочного инстанса………………………………………………………. 239

Конфигурирование сборочного инстанса…………………………………………………………. 239

Процесс офлайновой сборки образа…………………………………………………………………………… 241

Исходное содержимое для серверного образа……………………………………………………………………… 242

Сборка на основе стандартного серверного образа…………………………………………………. 243

Сборка серверного образа с нуля……………………………………………………………………………….. 243

Происхождение серверного образа и его содержимое……………………………………………… 243

Изменение серверного образа………………………………………………………………………………………………… 244

Разогреть или испечь свежий?…………………………………………………………………………………….. 244

Версионирование серверного образа…………………………………………………………………………. 245

Обновление серверных инстансов при изменении образа……………………………………….. 247

Предоставление серверного образа для совместного использования несколькими командами              248

Как работать с крупными изменениями, вносимыми в образ…………………………………… 249

Использование конвейера для тестирования и доставки серверного образа…………………….. 250

Стадия сборки серверного образа………………………………………………………………………………. 250

Стадия тестирования серверного образа…………………………………………………………………… 252

Стадии доставки серверного образа………………………………………………………………………….. 253

Использование множества серверных образов…………………………………………………………………….. 253

Серверные образы для разных инфраструктурных платформ………………………………… 254

Серверные образы для разных операционных систем……………………………………………… 254

Серверные образы для разных аппаратных архитектур…………………………………………. 254

Серверные образы для разных ролей…………………………………………………………………………. 255

Многослойное расположение серверных образов……………………………………………………. 255

Совместное использование кода в разных серверных образах……………………………….. 256

Заключение………………………………………………………………………………………………………………………………. 257

Глава 14. Сборка кластеров в коде………………………………………………………. 258

Решения с кластерами приложений……………………………………………………………………………………….. 259

Кластер как услуга………………………………………………………………………………………………………. 259

Распространение кластеров в упакованном виде……………………………………………………… 260

Топологии стеков для кластеров приложений………………………………………………………………………. 261

Монолитный стек, использующий кластер как услугу…………………………………………….. 262

Монолитный стек для упакованного кластерного решения…………………………………….. 263

Конвейер для стека, в котором реализован монолитный кластер приложений……… 264

Пример: множество стеков в одном кластере…………………………………………………………….. 267

Стратегии совместного использования кластеров приложений…………………………………………. 269

Один большой кластер на все случаи жизни……………………………………………………………… 270

Отдельные кластеры для стадий доставки………………………………………………………………… 271

Кластеры для управления……………………………………………………………………………………………. 272

Кластеры для команд…………………………………………………………………………………………………… 273

Сервисная сеть……………………………………………………………………………………………………………… 273

Инфраструктура для бессерверных FaaS-сервисов……………………………………………………………… 275

Заключение………………………………………………………………………………………………………………………………. 277

Часть IV. Проектирование инфраструктуры……………………… 279

Глава 15. Ключевая практика: небольшие простые фрагменты…………… 281

Модульное проектирование…………………………………………………………………………………………………… 281

Характеристики хорошо спроектированных компонентов……………………………………… 282

Правила проектирования компонентов……………………………………………………………………… 283

Избегайте дублирования……………………………………………………………………………………… 283

Правило композиции……………………………………………………………………………………………. 284

Принцип единственной ответственности…………………………………………………………… 284

Проектируйте компоненты на основе концепций предметной области,
а не на основе технических концепций………………………………………………………………. 284

Закон Деметры……………………………………………………………………………………………………… 285

Никаких циклических зависимостей………………………………………………………………….. 285

Используйте тестирование для принятия проектных решений………………………………… 286

Модульная инфраструктура…………………………………………………………………………………………………… 286

Компоненты стека по сравнению со стеками в качестве компонентов…………………… 286

Использование сервера в стеке……………………………………………………………………………………. 288

Проведение границ между компонентами…………………………………………………………………………….. 291

Устанавливайте границы по паттернам естественных изменений………………………….. 292

Устанавливайте границы по жизненным циклам компонентов……………………………….. 292

Устанавливайте границы по организационным структурам…………………………………… 294

Создавайте границы, поддерживающие устойчивость…………………………………………….. 295

Создавайте границы, поддерживающие масштабирование…………………………………….. 295

Устанавливайте границы по проблемам безопасности и управления……………………. 298

Заключение………………………………………………………………………………………………………………………………. 299

Глава 16. Построение стеков из компонентов………………………………………. 300

Языки инфраструктуры для компонентов стека…………………………………………………………………… 301

Повторное использование декларативного кода с модулями………………………………….. 301

Динамическое создание элементов стека с применением библиотек……………………… 302

Паттерны для компонентов стека…………………………………………………………………………………………… 303

Паттерн: фасадный модуль…………………………………………………………………………………………. 303

Зачем это нужно…………………………………………………………………………………………………… 304

Применимость………………………………………………………………………………………………………. 304

Последствия………………………………………………………………………………………………………….. 304

Внедрение……………………………………………………………………………………………………………… 305

Смежные паттерны………………………………………………………………………………………………. 305

Антипаттерн: модуль обфускации……………………………………………………………………………… 305

Зачем это нужно…………………………………………………………………………………………………… 306

Применимость………………………………………………………………………………………………………. 306

Последствия………………………………………………………………………………………………………….. 306

Внедрение……………………………………………………………………………………………………………… 306

Смежные паттерны………………………………………………………………………………………………. 306

Антипаттерн: неразделяемый модуль………………………………………………………………………… 306

Зачем это нужно…………………………………………………………………………………………………… 307

Применимость………………………………………………………………………………………………………. 307

Последствия………………………………………………………………………………………………………….. 307

Внедрение……………………………………………………………………………………………………………… 307

Смежные паттерны………………………………………………………………………………………………. 307

Паттерн: модуль бандла……………………………………………………………………………………………… 308

Зачем это нужно…………………………………………………………………………………………………… 309

Применимость………………………………………………………………………………………………………. 309

Последствия………………………………………………………………………………………………………….. 309

Внедрение……………………………………………………………………………………………………………… 309

Смежные паттерны………………………………………………………………………………………………. 309

Антипаттерн: спагетти-модуль…………………………………………………………………………………… 309

Зачем это нужно…………………………………………………………………………………………………… 311

Последствия………………………………………………………………………………………………………….. 311

Внедрение……………………………………………………………………………………………………………… 311

Смежные паттерны………………………………………………………………………………………………. 312

Паттерн: сущность домена инфраструктуры…………………………………………………………….. 312

Зачем это нужно…………………………………………………………………………………………………… 313

Применимость………………………………………………………………………………………………………. 313

Внедрение……………………………………………………………………………………………………………… 313

Смежные паттерны………………………………………………………………………………………………. 313

Построение уровня абстрагирования……………………………………………………………………………………. 314

Заключение………………………………………………………………………………………………………………………………. 315

Глава 17. Использование стеков в качестве компонентов……………………. 316

Обнаружение зависимостей между стеками…………………………………………………………………………. 316

Паттерн: сопоставление ресурсов………………………………………………………………………………. 317

Зачем это нужно…………………………………………………………………………………………………… 318

Применимость………………………………………………………………………………………………………. 318

Последствия………………………………………………………………………………………………………….. 318

Внедрение……………………………………………………………………………………………………………… 319

Смежные паттерны………………………………………………………………………………………………. 319

Паттерн: поиск данных в стеке……………………………………………………………………………………. 320

Зачем это нужно…………………………………………………………………………………………………… 320

Применимость………………………………………………………………………………………………………. 320

Последствия………………………………………………………………………………………………………….. 321

Внедрение……………………………………………………………………………………………………………… 321

Смежные паттерны………………………………………………………………………………………………. 322

Паттерн: поиск по реестру интеграции………………………………………………………………………. 322

Зачем это нужно…………………………………………………………………………………………………… 323

Применимость………………………………………………………………………………………………………. 324

Последствия………………………………………………………………………………………………………….. 324

Внедрение……………………………………………………………………………………………………………… 324

Смежные паттерны………………………………………………………………………………………………. 325

Внедрение зависимости……………………………………………………………………………………………….. 325

Проблемы со смешиванием зависимости и кода определения………………………… 326

Отделение зависимостей от их обнаружения……………………………………………………. 326

Заключение………………………………………………………………………………………………………………………………. 328

Часть V. Доставка инфраструктуры……………………………………… 329

Глава 18. Организация кода инфраструктуры……………………………………… 331

Организация проектов и репозиториев………………………………………………………………………………….. 331

Один репозиторий или много?…………………………………………………………………………………….. 332

Один репозиторий для всего………………………………………………………………………………………… 332

Один репозиторий, несколько сборок………………………………………………………………… 333

Отдельный репозиторий для каждого проекта (микрорепозиторий)………………………. 334

Несколько репозиториев с несколькими проектами………………………………………………….. 335

Организация различных типов кода………………………………………………………………………………………. 336

Файлы поддержки проекта………………………………………………………………………………………….. 336

Межпроектные тесты…………………………………………………………………………………………………… 337

Хранение интеграционных тестов в проекте…………………………………………………….. 338

Отдельные проекты интеграционных тестов…………………………………………………………….. 338

Организация кода по концепции предметной области……………………………………………… 339

Организация файлов конфигурационных значений………………………………………………….. 340

Управление инфраструктурным кодом и кодом приложения……………………………………………… 341

Доставка инфраструктуры и приложений…………………………………………………………………. 341

Тестирование приложений с инфраструктурой………………………………………………………… 342

Тестирование инфраструктуры перед интеграцией………………………………………………….. 343

Использование инфраструктурного кода для развертывания приложений……………. 344

Заключение………………………………………………………………………………………………………………………………. 346

Глава 19. Доставка инфраструктурного кода……………………………………….. 347

Доставка инфраструктурного кода……………………………………………………………………………………….. 347

Сборка инфраструктурного проекта………………………………………………………………………….. 348

Инфраструктурный код упаковки как артефакт………………………………………………………… 349

Использование репозитория для доставки инфраструктурного кода……………………… 349

Специализированный репозиторий артефактов……………………………………………….. 350

Репозиторий инструмента…………………………………………………………………………………… 350

Общий репозиторий для хранения файлов………………………………………………………… 351

Доставка кода из репозитория исходного кода………………………………………………… 351

Интеграция проектов……………………………………………………………………………………………………………….. 351

Паттерн: интеграция проекта во время сборки………………………………………………………….. 353

Зачем это нужно…………………………………………………………………………………………………… 353

Применимость………………………………………………………………………………………………………. 354

Последствия………………………………………………………………………………………………………….. 354

Внедрение……………………………………………………………………………………………………………… 354

Смежные паттерны………………………………………………………………………………………………. 355

Паттерн: интеграция проекта во время доставки………………………………………………………. 355

Зачем это нужно…………………………………………………………………………………………………… 356

Применимость………………………………………………………………………………………………………. 357

Последствия………………………………………………………………………………………………………….. 357

Внедрение……………………………………………………………………………………………………………… 357

Смежные паттерны………………………………………………………………………………………………. 358

Паттерн: интеграция проекта во время применения…………………………………………………. 358

Зачем это нужно…………………………………………………………………………………………………… 359

Применимость………………………………………………………………………………………………………. 359

Последствия………………………………………………………………………………………………………….. 359

Внедрение……………………………………………………………………………………………………………… 359

Смежные паттерны………………………………………………………………………………………………. 360

Использование скриптов для обертывания инструментов инфраструктуры…………………….. 361

Сборка значений конфигурации…………………………………………………………………………………. 361

Упрощение скриптов-оболочек…………………………………………………………………………………… 362

Заключение………………………………………………………………………………………………………………………………. 363

Глава 20. Командные рабочие процессы………………………………………………. 364

Люди…………………………………………………………………………………………………………………………………………. 365

Кто пишет инфраструктурный код?………………………………………………………………………………………. 367

Применение кода к инфраструктуре………………………………………………………………………………………. 369

Применение кода с вашей локальной рабочей станции…………………………………………… 369

Применение кода из централизованной службы……………………………………………………….. 370

Персональные инфраструктурные инстансы…………………………………………………………….. 371

Ветви исходного кода в рабочих процессах……………………………………………………………… 373

Предотвращение конфигурационной энтропии……………………………………………………………………. 374

Сведите к минимуму задержку автоматизации…………………………………………………………. 374

Избегайте непродуманного применения изменений………………………………………………….. 375

Применяйте код непрерывно……………………………………………………………………………………….. 375

Неизменяемая инфраструктура…………………………………………………………………………………… 375

Управление в конвейерно-ориентированном потоке задач…………………………………………………. 376

Перетасовка обязанностей………………………………………………………………………………………….. 377

Сдвиг влево……………………………………………………………………………………………………………………. 378

Пример процесса для инфраструктуры как кода с управлением…………………………….. 378

Заключение………………………………………………………………………………………………………………………………. 379

Глава 21. Безопасное изменение инфраструктуры……………………………….. 380

Уменьшите объем изменений………………………………………………………………………………………………….. 380

Небольшие изменения………………………………………………………………………………………………….. 382

Пример рефакторинга………………………………………………………………………………………………….. 384

Отправка неполных изменений в продакшен………………………………………………………………………… 385

Параллельные инстансы……………………………………………………………………………………………… 386

Обратно совместимые преобразования……………………………………………………………………… 389

Переключатели функций……………………………………………………………………………………………… 390

Изменение действующей инфраструктуры……………………………………………………………………………. 392

Инфраструктурная хирургия………………………………………………………………………………………. 394

Расширение и сжатие…………………………………………………………………………………………………… 396

Изменения нулевого времени простоя………………………………………………………………………… 399

Сине-зеленые изменения……………………………………………………………………………………… 400

Преемственность……………………………………………………………………………………………………………………… 400

Преемственность за счет предотвращения ошибок…………………………………………………… 401

Непрерывность за счет быстрого восстановления……………………………………………………. 402

Непрерывное аварийное восстановление………………………………………………………………….. 403

Хаос-инжиниринг…………………………………………………………………………………………………………. 404

Планирование неудач………………………………………………………………………………………………….. 404

Непрерывность данных в меняющейся системе……………………………………………………………………. 406

Блокировка……………………………………………………………………………………………………………………. 407

Разделение…………………………………………………………………………………………………………………….. 407

Репликация……………………………………………………………………………………………………………………. 407

Перезагрузка…………………………………………………………………………………………………………………. 407

Смешение подходов к обеспечению непрерывности данных………………………………….. 408

Заключение………………………………………………………………………………………………………………………………. 408

Предметный указатель…………………………………………………………………………. 410

Об авторе……………………………………………………………………………………………… 416

Kief Morris

Киф Моррис (Kief Morris) – директор по облачной инженерии в компании ThoughtWorks, помогает организациям развивать облачную и внутрикорпоративную IT-инфраструктуру. Более 20 лет занимается проектированием, выстраиванием и эксплуатацией автоматизированной серверной инфраструктуры. На заре карьеры занимался сценариями командной строки и языком Perl, а затем осваивал CFengine, Puppet, Chef, Terraform и многие другие технологии, как только они появлялись.

Summary
Aggregate Rating
3 based on 1 votes
Добавить комментарий