Инфраструктура — Diving Deep (5 серии деталей)
Этот блог является частью серии о Kubernetes и его экосистеме, где мы погрузимся глубоко в инфраструктуру по одному
Есть 4 основных шага, как правило, для решения любой проблемы в мире.
- Понимание или выявление проблемы
- Исследование или размышление о возможных способах решения проблемы
- Работа над фактическим решением
- Опубликуйте или выпустите свое решение для вашей целевой аудитории для обратной связи
И итерация на весь этот цикл непрерывно. И это, как правило, рабочий процесс, которым мы склонны следовать любой проблеме независимо от области.
Теперь, если вы заметите это в контексте с инфраструктурой, OPS и разработкой программного обеспечения, сама инфраструктура нанесла огромное влияние на процесс, создавая много трения в рабочем процессе, в то время как она должна быть просто фасилитатором для решения основной проблемы Под рукой (если проблема, которую вы пытаетесь решить, не связана с самой инфраструктурой).
Но сегодня все занимается позитивным направлением с появлением различных стандартов, платформ и инструментов сегодня с Kubernetes, Docker, Terraform и различными другими инструментами, ведущими по обмену пути к позитивному будущему.
Пока я нахожусь в пути к строительству TimeCampus Я исследул стандарт, чтобы принять что -то вроде Двенадцать факторное приложение Для приложений SaaS, Agile Manifesto Для Agile Development, Принципиальный график Для архитектуры графа данных с GraphQL и т. Д., Но для инфраструктуры и, к моему удивлению, заметили, что я не мог найти.
Итак, прежде чем я начну решать проблемы, которые Kubernetes и его экосистема решают (или потенциально могут решить в будущем) для инфраструктуры в этой серии, я чувствую, что очень важно установить первые принципы, вокруг которых мы должны визуализировать инфраструктуру и что Это то, что мы собираемся обсудить в этом сообщении.
ПРИМЕЧАНИЕ: Эти принципы взяты из моего собственного опыта, а также знания, которые я собрал, проходя много тематических исследований с течением времени. Так что не стесняйтесь интерпретировать это по -своему или отклоните что -либо из этого, если это не подходит для вашего варианта использования.
Стандарты, абстракции и инкапсуляция
В действительности, инфраструктура состоит из различных компонентов, каждый из которых выполняет определенную ответственность в рамках полной стека с обязанностями, начиная от сети, вычислений, хранения и большего с течением времени с множеством периферийных устройств, которые теперь доступны для использования. Хотя определенно здорово иметь свободу выбора и конкуренции, очень важно отметить, что это не должно быть представлено как вызов, но рассматриваться как способность к расширению прав и возможностей для пользователей.
И это может произойти только в том случае, если существуют разумные стандарты и абстракции вокруг всех этих разрозненных компонентов, тем самым абстрагируя всю сложность от конечных пользователей, но в то же время позволяя им изменять его везде, где это необходимо.
Инфраструктура должна рассматриваться как только «черный ящик », который разлагается в несколько разных черных ящиков по мере необходимости, когда каждый черный ящик выполняет отдельную ответственность.
Автоматизируйте все
Как обсуждалось ранее, инфраструктура должна выступать в качестве активатора, а не узкого места с вашим ценным временем, лучше потраченным на работу над реальной проблемой, а не на саму инфраструктуру. Имея это в виду, каждая операция с инфраструктурой должна быть автоматизирована в максимально возможной степени.
И это может быть все, что является частью процесса, включая исцеление, восстановление, отказоустойчивость, развертывания, миграции, обновления, перевозку журналов и многое другое. Если вы обнаружите, что делаете что -то неоднократно, подумайте о автоматизации, так как это может сэкономить бесчисленные часы времени в будущем, а также может предотвратить возможные человеческие ошибки в выполнении дел вручную.
Расширяемость
Несмотря на то, что важно абстрагировать и инкапсулировать различные компоненты инфраструктуры, это также должно быть расширено всеми по мере необходимости через что -то вроде API, что позволяет пользователям строить на этих компонентах как конкретные для их использования.
Это важно, потому что не каждый вариант использования в мире может быть направлен на изначально, и добавление их всех в ядро чаще всего казалось бы бессмысленным. Имея это в виду, подход, управляемый плагинами, часто расширяет возможности для всей экосистемы в целом.
Экологическая последовательность
В то время как инфраструктура, как правило, может различаться между различными средами, будь то развитие, постановка или производство, в разных развертываниях, если она локально, частные и общественные облака или даже различные облачные или локальные поставщики, опыт пользователя должен быть последовательным во всех Эти разные среды абстрагируют различные различия между ними, как правило, в качестве адаптеров.
Таким образом, в то время как пользователи взаимодействуют с одними и теми же API одинаково последовательно в разных средах, то, как API обрабатываются в разных средах, должны жить как адаптеры или песочницы, выступая в качестве уровня совместимости поверх, возможно, различных API инфраструктуры.
Упаковка и выпуск
Консистенция окружающей среды также требует постоянного способа, которым вы обычно упаковываете и выпускаете свое приложение или саму инфраструктуру. Постоянный механизм упаковки и выпуска не создаст сюрпризов при работе в разных средах, а также поможет воспроизвести любые несоответствия или события неудач, которые могут возникнуть в другой среде без каких -либо проблем. Это также помогает правильно управлять версией различных выпусков с течением времени и позволяет пользователям постепенно обновлять или обновлять части инфраструктуры, поскольку они считают нужным после соответствующего обзора изменений, не навязывая их.
Это требует необходимости для всех компонентов в инфраструктуре для поддержания собственного механизма упаковки и выпуска версий, позволяющих постоянному и четкому пути обновления для каждого компонента.
Модульность, единая ответственность и инкрементная масштабируемость
Каждая часть инфраструктуры, которая обсуждалась ранее, должна быть черным ящиком само по себе и, таким образом, модульный с собственным набором API, каждый выполняющий единственную ответственность, которая затем организуется вместе для выполнения полного использования. Это не только уменьшает возможность появления ошибок с каждым модулем, обрабатывающим свой собственный цикл выпуска, но также учитывает такие вещи, как постепенное внедрение и масштабируемость от небольших до крупных проектов, просто используя модули, которые им действительно необходимы для удовлетворения своего варианта использования.
Это также обеспечивает масштабируемость на уровне модуля в зависимости от вашего использования.
Администрация
В то время как инфраструктура работает в качестве свободно связанных модулей, их следует легко администрировать для конечных пользователей, где это необходимо. Он в идеале визуализируется как сота, когда каждая ячейка работает над выполнением собственной ответственности.
Пользователи должны быть в состоянии легко контролировать и управлять любыми из этих компонентов по мере необходимости, необязательно абстрагируя сложность того, что происходит под предложением, предлагая способ быстро реагировать на возникновение проблем, которые обычно могут возникнуть в любой части инфраструктуры, а также разрешить использование Случаи, такие как оптимизация затрат, где инфраструктура может быть эффективно использовать там, где это возможно, и безопасность, где путь связи между всеми компонентами лучше видим для администратора, чтобы они могли обеспечить его должным образом по мере необходимости.
Декларативная и самозащитная инфраструктура в качестве кода
Как мы обсуждали выше, инфраструктура сделана из множества компонентов, и одна вещь, которая распространена со временем, — это «Изменение ». Мы должны попытаться архитектуры за изменения, и именно здесь инфраструктура в качестве кода действительно помогает нам хорошо документировать и организовать все различные состояния инфраструктуры с течением времени, заявляющему, контролировать их и делать все так, что есть также путь Чтобы вернуться в предыдущее состояние, где это необходимо.
Это также прокладывает путь для сотрудничества, обзоров, автоматизации и тестирования, где изменения между двумя разными состояниями могут быть хорошо протестированы в разных средах, а затем последовательно развернуты в нескольких средах по мере необходимости.
Разумное управление государством
Проблема не в штате, а в управлении ею должным образом. Избегать состояния часто затруднено, особенно с учетом динамического характера приложений сегодня.
Неправильное поддержание государства может вызвать множество проблем в масштабировании ваших приложений и инфраструктуры, которая с ним идет. Таким образом, вместо того, чтобы распространять состояние повсюду, часто разумно управлять государством должным образом и в изоляции, чтобы остальная часть приложения могла работать и масштабировать независимо от государственных услуг, в то время как государственные службы могут следовать своему собственному пути к масштабируемости. миры друг от друга.
Быстрая внутренняя петля и ловкость
Несмотря на то, что вы можете поддерживать сложную инфраструктуру и процесс развертывания для вашего варианта использования, та же сложность не должна подвергаться воздействию на этапе разработки. Скорее опыт разработки должен быть таким способом, чтобы инфраструктура полностью исчезала за кулисами, и разработчики просто сосредоточены на том, чтобы получить быструю обратную связь для всех изменений, которые они вносят.
Это может включать в себя множество методов, таких как использование синхронизации вместо восстановления, что позволяет гибридной разработке, что позволяет разработчикам просто размещать часть инфраструктуры, которую они работают, оставляя остальные в целевой среде, настраиваемое сетевое прокси, лучшее интеграция IDE и больше всего Чтобы ускорить внутреннюю петлю Dev и ловкость развития.
Нет единой точки отказа
Чтобы инфраструктура была надежной, обычно не должно быть единой точки отказа, в противном случае называемых высокодоступными системами. Это требует децентрализации обязанностей, а также для того, чтобы иметь такие вещи, как избыточность и отказа, где это необходимо. Но также важно учитывать, что время безотказной работы на 99,99% может не быть призывом для каждого случая использования, и, следовательно, различные варианты использования требуют различных уровней избыточных средств и механизмов отказа, делая это решение полностью зависимым от этого случая.
Сказав это, всегда лучше разрабатывать простые системы в начальных и постепенно масштабируемых системах с течением времени по мере возникновения необходимости. Таким образом, создание высоко масштабируемых систем — это путешествие, а не место назначения само по себе, поскольку большая децентрализация создает большую сложность.
Поддержка бесшовного сотрудничества
Продукты часто создаются с усилиями нескольких членов команды, и то же самое касается инфраструктуры и приложений, работающих на ней.
Имея это в виду, важно поддерживать беспроблемные способы сотрудничества, работая над инфраструктурой, облегчая параллельные изменения от нескольких людей, что позволяет исследовать и экспериментировать с любой частью инфраструктуры в изолированном контексте или песочнице, не влияя на другие и другие Кроме того, способность делиться или пакетными частями инфраструктуры по мере необходимости облегчить беспрепятственное сотрудничество между различными участниками, и это должно быть сделано для того, чтобы считать безопасность, позволяя только уполномоченному персоналу вносить изменения по мере необходимости, но делайте это в некотором смысле, не создавая трения среди пользователей.
Нулевое доверие безопасности
Как справедливо говорят эксперты, безопасность не должна быть запоздалой мыслью, но должна начинаться как основные принципы при строительстве или работе с инфраструктурой. Часто наивно сказать, что « это не может быть скомпрометировано », поскольку мы все знаем, что происходит. Скорее мышление должно быть в соответствии с « Если это будет скомпрометировано, это то, что произойдет, и именно так я отвечу «И именно здесь нулевая безопасность доверия действительно играет важную роль, когда вы никогда не доверяете ниченному или кому -либо в любое время (в то время как в реальной жизни вы должны).
Это дает первый взгляд на все способы, которыми ваша инфраструктура может быть скомпрометирована, и поможет вам принять профилактические меры и быть готовым ко всему, прежде чем на самом деле произойдет плохое. Это может включать что -либо от рассмотрения политик доступа, просмотра сетевых путей, шифрования данных или других PII, разделения данных на нескольких арендаторов, сканирования изображений, просматривая основную инфраструктуру для проблем безопасности, разделение границы атак, либо что -то подобное, которое может либо предотвратить или уменьшить влияние атаки.
Инфраструктура должна быть тупой
Хотя это может показаться безумным, истинный факт заключается в том, что чем более глупая инфраструктура, как лучше для стабильности и обслуживания. Как мы упоминали выше, каждый модуль должен нести единственную ответственность, и это должно быть таким образом, что всегда есть причина для изменения инфраструктуры.
Например, если ваша инфраструктура должна автоматически масштабировать, часто лучше сделать это, не вводя слишком большую сложность в инфраструктуру или ее контроллеры. Скорее, постарайтесь как можно больше опустить его и использовать некоторые разумные критерии либо из опыта, либо из исторических данных, чтобы принимать решения в масштабе вручную или автоматически в зависимости от того, как часто такие изменения необходимы. Попросить вашу инфраструктуру сделать слишком много для вас, просто поднимет сложность. Или, если вы действительно хотите создать интеллектуальную инфраструктурную систему, постарайтесь распространять сложность, а не держать ее в единый компонент.
Обнаружение
Как мы обсуждали, в инфраструктуре существуют различные компоненты. Учитывая это, очень важно иметь в виду обнаружение при разработке этих систем, поскольку им часто потребуется работать вместе, чтобы выполнить определенную задачу, которая может произойти, только если они обнаружены по мере необходимости.
Хотя сам механизм обнаружения сводится к вашему варианту использования, единственное, что нужно иметь в виду, это то, что лучше распределять обнаружение, поскольку мы не хотим ни одной точки отказа, а также тот факт, что это должно быть легко понять Различные вызовы и сетевой трафик хорошо, не вводя слишком много сложности, даже если со временем увеличивается количество компонентов и услуг.
Возможная последовательность
Распределенные системы и инфраструктура всегда в конечном итоге согласованы, учитывая различные факторы, такие как задержка сети, пропускная способность, пропускная способность, скорость ввода -вывода и так далее. Таким образом, вместо того, чтобы избежать этого факта, разработка системы для поддержки возможной последовательности всегда лучше, поскольку она поможет вам лучше обрабатывать сбои или задержки данных, когда это происходит.
Хотя существуют такие механизмы, как распределенные транзакции для решения этой проблемы, даже такие решения являются не чем иным, как возможной согласованностью с абстракциями сверху. Имея это в виду, инфраструктура и приложения лучше разработаны для таких сценариев, а не ожидать, что все будет последовательным каждый раз.
Тестируемость
Тестируемость становится действительно важной частью, особенно если вы хотите высокой степени стабильности и автоматизации с постоянным притоком изменений, которые вы могли бы иметь в будущем. Каждая часть инфраструктуры должна быть проверена в изоляции, а также в качестве группы, чтобы обеспечить большую степень уверенности, которую пользователи будут обладать в основной инфраструктуре.
Это может быть что угодно, от тестирования различных точек интеграции между инфраструктурой до тестирования логики в рамках полной картины того, что пошло или может пойти не так.
Разумные значения по умолчанию
Хотя мы обсуждаем все эти принципы, необходимо также приложить усилия, чтобы обеспечить разумные знания по умолчанию, где это возможно, позволяя пользователям постепенно принимать, изменять или масштабировать по мере необходимости. Ощутные значения по умолчанию включают в себя обеспечение каждые части инфраструктуры защищены по умолчанию, позволяют базовым функциональным возможностям, таким как мониторинг, ведение журнала, резервное копирование, отказоустойчивость и т. Д. Без необходимости вручную настраивать его на работу.
Это может предотвратить множество проблем, которые возникают из -за отсутствия знаний, которые пользователи могут иметь, работая над частью инфраструктуры, опустите его для новых COMER конфигурации, чтобы начать работать над чем -то.
Бесплатные обновления, обновления, обслуживание и отказа
Хотя облачные провайдеры предлагают SLA для развертывания при оплате, это должно быть не функция, а скорее по умолчанию. Обновления, обновления, отказа и технического обслуживания должны происходить плавно, не затрагивая рабочие нагрузки, работающие на инфраструктуре. И даже в случае неудач должен быть способ по -прежнему обслуживать разумный трафик для клиентов, поскольку необходимо избегать возможного простоя.
Все это может произойти только в том случае, если возможный сбой обнаружен как можно раньше, и предпринимаются усилия, чтобы переключиться на здоровый трафик и развертывание везде. К тому же эффекту должны быть осуществлены надлежащие проверки здоровья, чтобы идентифицировать и обрабатывать сбои, если таковые имеются в какой -либо части инфраструктуры, и даже плавно обрабатывает модернизацию по мере их возникновения.
Потерпите неудачу быстро и отвечайте разумно
Практически невозможно иметь 100% безотказной работы для каждой части вашей инфраструктуры. Скорее, компоненты должны быстро терпеть неудачу, когда возникают проблемы, и отвечать разумно, когда это возможно. Часто лучше позволить неудачам происходить, а не подавлять их, что может создать катастрофу в будущем.
И это, по моему мнению, являются наиболее важными принципами, которые следует учитывать, особенно при работе с масштабируемой инфраструктурой.
Дайте нам знать, если мы пропустили что -то важное здесь, так как я хотел бы рассматривать это как живое документ, обновляя его, поскольку необходимость возникает на основе отзывов сообщества.
Надеюсь, что это пролило некоторый свет в различные вещи, которые нужно помнить, работая с инфраструктурой. Но как бы это ни звучало (и они действительно сложны), сегодня в сообществе много инструментов и огромная экосистема, которая может помочь нам сделать все это (по крайней мере, по большей части).
Когда я писал этот пост в блоге, я получил небольшую идею создания первых принципов во всех доменах, доступных для всех в одном месте. В этой цели я хотел бы объявить о запуске нового сайта, чтобы сделать именно этот https://thefirstprinciples.dev
Из следующего блога в этой серии мы начнем изучать, как различные инструменты в экосистеме соответствуют, чтобы решить эти различные принципы и решить сложные проблемы, лежащие впереди перед нами.
Любые вопросы? Ищете помощь? Не стесняйтесь обращаться ко мне @techahoy Анкет И если это поможет, поделитесь этим со своими друзьями, держитесь вокруг и следуйте за нами, как это, как это каждую неделю. Увидимся скоро.
Инфраструктура — Diving Deep (5 серии деталей)
Оригинал: «https://dev.to/timecampus/infrastructure-engineering-the-first-principles-o70»