Архитектурные приложения для Kubernetes

Вступление

Проектирование и запуск приложений с учетом масштабируемости, переносимости и надежности может быть сложной задачей, особенно по мере роста сложности системы. Архитектура приложения или системы существенно влияет на то, как оно должно работать, что оно ожидает от своей среды и насколько тесно оно связано со связанными компонентами. Следование определенным шаблонам на этапе проектирования и соблюдение определенных практических методов может помочь в борьбе с некоторыми из наиболее распространенных проблем, с которыми сталкиваются приложения при работе в сильно распределенных средах.

Хотя шаблоны проектирования программного обеспечения и методологии разработки могут создавать приложения с правильными характеристиками масштабирования, инфраструктура и среда влияют на работу развернутой системы. Такие технологии, какDocker иKubernetes, помогают группам упаковывать программное обеспечение, а затем распространять, развертывать и масштабировать на платформах распределенных компьютеров. Изучение того, как наилучшим образом использовать возможности этих инструментов, поможет вам управлять приложениями с большей гибкостью, контролем и быстротой реагирования.

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

Проектирование для масштабируемости приложений

При создании программного обеспечения многие требования влияют на шаблоны и архитектуру, которые вы выбираете. В Kubernetes одним из наиболее важных факторов является возможностьscale horizontally, регулирующая количество идентичных копий вашего приложения для распределения нагрузки и повышения доступности. Это альтернативаvertical scaling, которая пытается манипулировать теми же факторами, выполняя развертывание на машинах с большим или меньшим количеством ресурсов.

В частности,microservices - это шаблон разработки программного обеспечения, который хорошо работает для масштабируемых развертываний в кластерах. Разработчики создают небольшие составные приложения, которые обмениваются данными по сети через четко определенные API REST вместо больших составных программ, которые обмениваются данными через внутренние механизмы программирования. Разложение монолитных приложений на отдельные компоненты специального назначения позволяет независимо масштабировать каждую функцию. Большая часть сложности и состава, которые обычно существуют на уровне приложений, переносятся в операционную сферу, где им могут управлять такие платформы, как Kubernetes.

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

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

После 12 Философия применения фактора

Одной из популярных методологий, которая может помочь вам сосредоточиться на характеристиках, наиболее важных при создании веб-приложений, готовых к работе в облаке, является философияTwelve-Factor App. Разработанные для того, чтобы помочь разработчикам и рабочим группам понять основные качества, которыми обладают веб-сервисы, предназначенные для работы в облаке, эти принципы очень хорошо применимы к программному обеспечению, которое будет работать в кластерной среде, такой как Kubernetes. Хотя монолитные приложения могут извлечь выгоду из следования этим рекомендациям, архитектуры микросервисов, разработанные на основе этих принципов, работают особенно хорошо.

Краткое изложение двенадцати факторов:

  1. Codebase: Управлять всем кодом в системах контроля версий (например, Git или Mercurial). Кодовая база всесторонне диктует, что развернуто.

  2. Dependencies: Зависимости должны полностью и явно управляться базой кода, будь то поставленная (хранимая вместе с кодом) или версия, закрепленная в формате, из которого может установить менеджер пакетов.

  3. Config: Отделяйте параметры конфигурации от приложения и определяйте их в среде развертывания вместо того, чтобы запекать их в самом приложении.

  4. Backing services: Локальные и удаленные службы абстрагируются как доступные по сети ресурсы с деталями подключения, установленными в конфигурации.

  5. Build, release, run: Этап сборки вашего приложения должен быть полностью отделен от процессов выпуска и эксплуатации вашего приложения. Этап сборки создает артефакт развертывания из исходного кода, этап выпуска объединяет артефакт и конфигурацию, а этап запуска выполняет выпуск.

  6. Processes: Приложения реализованы как процессы, которые не должны полагаться на локальное сохранение состояния. Состояние должно быть выгружено в службу поддержки, как описано в четвертом факторе.

  7. Port binding: Приложения должны изначально привязываться к порту и прослушивать соединения. Маршрутизация и перенаправление запросов должны обрабатываться извне.

  8. Concurrency: Приложения должны полагаться на масштабирование с помощью модели процесса. Одновременный запуск нескольких копий приложения, возможно, на нескольких серверах, позволяет масштабировать без корректировки кода приложения.

  9. Disposability: Процессы должны иметь возможность быстро запускаться и плавно останавливаться без серьезных побочных эффектов.

  10. Dev/prod parity: Ваши тестовые, промежуточные и производственные среды должны точно совпадать и синхронизироваться. Различия между средами - это возможность появления несовместимостей и непроверенных конфигураций.

  11. Logs: Приложения должны передавать журналы на стандартный вывод, чтобы внешние службы могли решить, как лучше с ними обращаться.

  12. Admin processes: Одноразовые процессы администрирования должны запускаться для определенных выпусков и поставляться с основным кодом процесса.

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

Контейнерные компоненты приложения

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

Например, контейнеры обеспечивают изоляцию между прикладной средой и внешней хост-системой, поддерживают сетевой, сервис-ориентированный подход к взаимодействию между приложениями, и обычно принимают конфигурацию через переменные среды и предоставляют журналы, записанные со стандартной ошибкой и стандартным выводом. Сами контейнеры поощряют параллелизм на основе процессов и помогают поддерживать паритет разработки и производительности за счет возможности независимого масштабирования и объединения среды выполнения процесса. Эти характеристики позволяют упаковать ваши приложения, чтобы они работали в Kubernetes без проблем.

Руководство по оптимизации контейнеров

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

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

Хороший первый шаг при создании образов контейнера - сделать все возможное, чтобы отделить этапы сборки от окончательного образа, который будет запущен в производство. Сборка программного обеспечения обычно требует дополнительных инструментов, занимает дополнительное время и создает артефакты, которые могут быть несовместимыми от контейнера к контейнеру или ненужными для конечной среды выполнения в зависимости от среды. Один из способов четко отделить процесс сборки от среды выполнения - использоватьDocker multi-stage builds. Многоступенчатые конфигурации сборки позволяют вам указать один базовый образ для использования в процессе сборки и определить другой для использования во время выполнения. Это позволяет создавать программное обеспечение с использованием образа со всеми установленными инструментами сборки и копировать полученные артефакты в тонкое, оптимизированное изображение, которое будет использоваться каждый раз после этого.

При наличии такого типа функциональности обычно рекомендуется создавать производственные образы поверх минимального родительского образа. Если вы хотите полностью избежать раздувания родительских слоев в стиле «дистрибутив», таких какubuntu:16.04 (который включает довольно полную среду Ubuntu 16.04), вы можете создавать свои образы с помощьюscratch - самой минимальной базы Docker. изображение - как родитель. Однако базовый уровеньscratch не обеспечивает доступа ко многим основным инструментам и часто нарушает предположения о среде, в которой работает некоторое программное обеспечение. В качестве альтернативы образAlpine Linuxalpine приобрел популярность благодаря тому, что он представляет собой надежную минимальную базовую среду, которая предоставляет крошечный, но полнофункциональный дистрибутив Linux.

Для интерпретируемых языков, таких как Python или Ruby, парадигма немного меняется, поскольку этап компиляции отсутствует, и интерпретатор должен быть доступен для запуска кода в производстве. Однако, поскольку тонкие образы по-прежнему идеальны, многие оптимизированные образы для конкретных языков, созданные на основе Alpine Linux, доступны наDocker Hub. Преимущества использования меньшего изображения для интерпретируемых языков аналогичны преимуществам для скомпилированных языков: Kubernetes сможет быстро перенести все необходимые изображения контейнера на новые узлы, чтобы начать выполнять значимую работу.

Выбор области для контейнеров и стручков

Хотя ваши приложения должны быть контейнеризованы для запуска в кластере Kubernetes,pods - это наименьшая единица абстракции, которой Kubernetes может управлять напрямую. Стручок - это объект Kubernetes, состоящий из одного или нескольких тесно связанных контейнеров. Контейнеры в капсуле имеют общий жизненный цикл и управляются вместе как единое целое. Например, контейнеры всегда планируются на одном и том же узле, запускаются или останавливаются в унисон и совместно используют ресурсы, такие как файловые системы и пространство IP.

Сначала может быть сложно найти лучший способ разделить ваши приложения на контейнеры и контейнеры. Это делает важным понимание того, как Kubernetes обрабатывает эти компоненты и что каждый уровень абстракции обеспечивает для ваших систем. Несколько соображений могут помочь вам определить некоторые естественные точки инкапсуляции для вашего приложения с каждой из этих абстракций.

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

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

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

Повышение функциональности Pod за счет объединения вспомогательных контейнеров

Имея это в виду, какие типы контейнеров должны быть объединены в один контейнер? Как правило, основной контейнер отвечает за выполнение основных функций модуля, но могут быть определены дополнительные контейнеры, которые изменяют или расширяют основной контейнер или помогают ему подключаться к уникальной среде развертывания.

Например, в модуле веб-сервера контейнер Nginx может прослушивать запросы и обслуживать контент, в то время как связанный контейнер обновляет статические файлы при изменении репозитория. Может быть заманчиво упаковывать оба этих компонента в один контейнер, но есть значительные преимущества для их реализации в виде отдельных контейнеров. Как контейнер веб-сервера, так и хранилище хранилища могут использоваться независимо в разных контекстах. Они могут обслуживаться разными командами и каждая из них может быть разработана для обобщения их поведения для работы с различными контейнерами-компаньонами.

Брендан Бернс и Дэвид Оппенгеймер определили три основных шаблона для объединения вспомогательных контейнеров в своей статье наdesign patterns for container-based distributed systems. Они представляют некоторые из наиболее распространенных вариантов использования для упаковки контейнеров в капсулу:

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

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

  • Adaptor: Шаблон адаптера используется для преобразования данных, протоколов или интерфейсов первичного контейнера в соответствие со стандартами, ожидаемыми внешними сторонами. Контейнеры-адаптеры обеспечивают равномерный доступ к централизованным службам, даже если обслуживаемые ими приложения могут изначально поддерживать несовместимые интерфейсы.

Извлечение конфигурации в ConfigMaps и секреты

Хотя конфигурация приложенияcanдолжна быть встроена в образы контейнеров, лучше всего сделать ваши компоненты настраиваемыми во время выполнения для поддержки развертывания в нескольких контекстах и ​​обеспечения более гибкого администрирования. Для управления параметрами конфигурации среды выполнения Kubernetes предлагает два объекта с именамиConfigMaps иSecrets.

ConfigMaps - это механизм, используемый для хранения данных, которые могут быть открыты для модулей и других объектов во время выполнения. Данные, хранящиеся в ConfigMaps, могут быть представлены в виде переменных среды или смонтированы в виде файлов в модуле. Создавая приложения для чтения из этих мест, вы можете внедрить конфигурацию во время выполнения, используя ConfigMaps, и изменить поведение компонентов без необходимости перестраивать образ контейнера.

Секреты - это похожий тип объектов Kubernetes, используемый для безопасного хранения конфиденциальных данных и выборочного предоставления доступа к модулям и другим компонентам при необходимости. Секреты - это удобный способ передачи чувствительных материалов приложениям без сохранения их в виде простого текста в легко доступных местах в вашей обычной конфигурации. Функционально они работают почти так же, как ConfigMaps, поэтому приложения могут использовать данные из ConfigMaps и Secrets, используя те же механизмы.

ConfigMaps и Secrets помогают избежать размещения конфигурации непосредственно в определениях объектов Kubernetes. Вы можете сопоставить ключ конфигурации вместо значения, что позволит вам обновить конфигурацию на лету, изменив ConfigMap или Secret. Это дает вам возможность изменять активное поведение во время выполнения модулей и других объектов Kubernetes без изменения определений ресурсов Kubernetes.

Реализация зондов готовности и живости

Kubernetes включает в себя множество готовых функций для управления жизненными циклами компонентов и обеспечения того, чтобы ваши приложения всегда работали и были доступны. Однако, чтобы воспользоваться этими функциями, Kubernetes должен понять, как он должен отслеживать и интерпретировать состояние вашего приложения. Для этого Kubernetes позволяет вам определять зондыliveness иreadiness.

Датчики живучести позволяют Kubernetes определять, является ли приложение в контейнере живым и активно запущенным. Kubernetes может периодически запускать команды в контейнере для проверки основного поведения приложения или может отправлять сетевые запросы HTTP или TCP в указанное место, чтобы определить, доступен ли процесс и может ли он ответить, как ожидалось. В случае сбоя проверки жизнеспособности Kubernetes перезапускает контейнер, чтобы попытаться восстановить функциональность в модуле.

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

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

Использование развертываний для управления масштабом и доступностью

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

Развертывания - это составные объекты, основанные на других приматах Kubernetes для добавления дополнительных возможностей. Они добавляют возможности управления жизненным циклом к ​​промежуточным объектам, называемымreplicasets, например, возможность выполнять скользящие обновления, откат к более ранним версиям и переход между состояниями. Эти репликационные наборы позволяют задавать шаблоны модулей для ускорения и управлять несколькими копиями одного проекта модуля. Это поможет вам легко масштабировать инфраструктуру, управлять требованиями к доступности и автоматически перезагружать модули в случае сбоя.

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

Создание сервисов и правил входа для управления доступом к уровням приложений

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

В Kubernetes сервисы - это особые механизмы, которые контролируют, как трафик направляется на наборы модулей. Будь то пересылка трафика от внешних клиентов или управление соединениями между несколькими внутренними компонентами, службы позволяют вам контролировать поток трафика. Затем Kubernetes обновит и сохранит всю информацию, необходимую для перенаправления соединений на соответствующие модули, даже если меняется среда и меняется сетевая среда.

Доступ к услугам внутри

Чтобы эффективно использовать сервисы, сначала необходимо определить предполагаемых потребителей для каждой группы контейнеров. Если ваш сервис будет использоваться только другими приложениями, развернутыми в вашем кластере Kubernetes, тип сервисаclusterIP позволяет вам подключаться к набору модулей, используя стабильный IP-адрес, который маршрутизируется только изнутри кластера. Любой объект, развернутый в кластере, может взаимодействовать с группой реплицированных модулей, отправляя трафик непосредственно на IP-адрес службы. Это самый простой тип сервиса, который хорошо работает для внутренних прикладных уровней.

Дополнительный DNS-аддон позволяет Kubernetes предоставлять DNS-имена для сервисов. Это позволяет модулям и другим объектам связываться со службами по имени, а не по IP-адресу. Этот механизм существенно не меняет использование сервиса, но идентификаторы на основе имен могут упростить подключение компонентов или определение взаимодействий, не зная заранее IP-адрес сервиса.

Предоставление услуг для общественного потребления

Если интерфейс должен быть общедоступным, лучшим вариантом обычно является тип службыload balancer. При этом используется API вашего конкретного облачного провайдера для обеспечения балансировщика нагрузки, который направляет трафик к сервисным модулям через открытый IP-адрес. Это позволяет вам направлять внешние запросы на модули вашего сервиса, предлагая управляемый сетевой канал для вашей внутренней кластерной сети.

Поскольку тип службы балансировки нагрузки создает балансировщик нагрузки для каждой службы, потенциально возможно дорого обнародовать службы Kubernetes с использованием этого метода. Чтобы облегчить это, можно использовать объекты Kubernetesingress для описания того, как маршрутизировать различные типы запросов к различным службам на основе заранее определенного набора правил. Например, запросы на «example.com» могут отправляться на службу A, а запросы на «sammytheshark.com» могут направляться на службу B. Входящие объекты предоставляют способ описания логической маршрутизации смешанного потока запросов к их целевым сервисам на основе предопределенных шаблонов.

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

Использование декларативного синтаксиса для управления состоянием Kubernetes

Kubernetes предлагает довольно большую гибкость в определении и управлении ресурсами, развернутыми в вашем кластере. Используя такие инструменты, какkubectl, вы можете в обязательном порядке определять специальные объекты для немедленного развертывания в вашем кластере. Хотя это может быть полезно для быстрого развертывания ресурсов при изучении Kubernetes, у этого подхода есть недостатки, которые делают его нежелательным для долгосрочного управления производством.

Одна из основных проблем с обязательным управлением заключается в том, что оно не оставляет записей об изменениях, которые вы развернули в своем кластере. Это затрудняет или делает невозможным восстановление в случае сбоев или отслеживание изменений в работе, когда они применяются к вашим системам.

К счастью, Kubernetes предоставляет альтернативный декларативный синтаксис, который позволяет полностью определять ресурсы в текстовых файлах, а затем использоватьkubectl для применения конфигурации или изменения. Хранение этих файлов конфигурации в репозитории контроля версий - это простой способ отслеживать изменения и интегрироваться с процессами проверки, используемыми в других частях вашей организации. Управление на основе файлов также упрощает адаптацию существующих шаблонов к новым ресурсам путем копирования и редактирования существующих определений. Хранение определений объектов Kubernetes в версионных каталогах позволяет вам сохранять моментальный снимок желаемого состояния кластера в каждый момент времени. Это может иметь неоценимое значение во время операций восстановления, миграции или при поиске основной причины непреднамеренных изменений, внесенных в вашу систему.

Заключение

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

Related