Впервые на русском языке книга об управлении облачной 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
-
Программирование инфраструктуры. 2-е издание
1250 ₽
887 ₽
Киф Моррис (Kief Morris) – директор по облачной инженерии в компании ThoughtWorks, помогает организациям развивать облачную и внутрикорпоративную IT-инфраструктуру. Более 20 лет занимается проектированием, выстраиванием и эксплуатацией автоматизированной серверной инфраструктуры. На заре карьеры занимался сценариями командной строки и языком Perl, а затем осваивал CFengine, Puppet, Chef, Terraform и многие другие технологии, как только они появлялись.