Цель примера: Показать возможности по управлению процессом развертывания систем в инструменте управления архитектурой DocHub.
В компании есть несколько видов кластеров. Под кластерами мы понимаем кластера k8s (kubernetes), virtual (VMware или Hyper-v) и phisycal (физическая машина или группа машин, на которых располагаются компоненты системы). При этом кластера могут делиться по целям, например, prod-кластер, stage-кластер, dev-кластер.
Есть порядка 300 систем (уровень L1) каждая из которых состоит из своих run-time компонент (уровень L2). Для того чтобы запустить систему в работу необходимо разместить в соответствующем кластере каждую run-time компоненту этой системы. При этом в зависимости от целей требования к ресурсам работы каждой компоненты могут отличаться.
Стоит задача начать управлять всем этим хозяйством, т.е. мы хотим:
- Понять, где у нас размещается конкретная система, а это значит, что мы должны знать где располагается каждый её компонент. Например, для всех микросервисов БД живут отдельно от основных компонент системы и располагаются на отдельных кластерах.
- На этапе планирования разработки новой или расширения текущей системы мы хотим посчитать сколько системе понадобится ресурсов и сколько они будут стоить.
- Понять сколько у нас осталось свободных ресурсов на конкретном кластере с учетом заложенных лимитов.
Для того чтобы достичь целей, описанных выше, нам нужно каждый компонент системы, разложить на соответствующие единицы развертывания и к каждой из этих единиц развертывания указать требования к ресурсам. Эти единицы развертывания мы назвали deployment units (DU).
Общая схема описана ниже (схему нужно читать справа налево):
Для реализации был выбран вариант создания нового entity, который называется "clusters". Физически "clusters" был реализован через 2 файла:
- clusters/clusters_model.yaml - в этом файле была описана сама модель кластеров, реализован вывод в меню и несколько вариантов визуализации, например дерево кластеров и отчет "Карточка развертывания системы".
entities:
# Типы кластеров
clusters:
title: Типы кластеров развертывания систем
description:
> # Описание сущности текст или ссылка на документ. Необязательно.
Типы кластеров развертывания систем ГК Болото
menu: >
presentations:
tree: # Выводим дерево кластеров
# Выводим диаграмму развертывания систем. Вывод может происходить сразу группы кластеров.
# Например, можно вывести все сервера prod.
cluster_deployment_diagram:
# Выводим диаграмму развертывания конкретной системы.
# Если разшифровка делается из конкретного кластера, то выведутся все DU расположенные на этом кластере
# Если разшифровка делается для системы целиком, то выведутся все кластера со всеми DU этой системы
system_deployment_diagram:
# Для того, чтобы сотруднику DevOps понять все ли компоненты он распределил делаем ему табличку где выбираем все DU из компонент
# и смотрим привязал ли он их к кластеру
system_deployment_table:
# Лист проверки привязки deployment_units к кластеру для системы
deployment_card:- clusters/clusters.yaml - в этом файле хранятся значения "clusters"
clusters:
prod:
title: 01. Продуктовые кластера
description: Диаграммы развертывания для Продуктовых кластеров
prod.k8s:
title: Kubernetes - prod
description: Диаграмма развертывания для Продуктового кластера Kubernetes
resource_type: k8s #k8s/vm/phisycal
prod.physical_db:
title: Физический кластер БД - prod
description: Диаграмма развертывания для Продуктового физического кластера баз данных
resource_type: phisycal #k8s/vm/phisycal
prod.virtual_db:
title: Виртуальный кластер БД - prod
description: Диаграмма развертывания для Продуктового виртуального кластера баз данных
resource_type: vm #k8s/vm/phisycal
stage:
title: 02. Стейдж-кластера
description: Диаграммы развертывания для Стейдж-кластеров
stage.k8s:
title: Kubernetes - stage
description: Диаграмма развертывания для стейдж-кластера Kubernetes
resource_type: k8s #k8s/vm/phisycal
stage.physical_db:
title: Физический кластер БД - stage
description: Диаграмма развертывания для Физического стейдж-кластера баз данных
resource_type: phisycal #k8s/vm/phisycal
stage.virtual_db:
title: Виртуальный кластер БД - stage
description: Диаграмма развертывания для Виртуального стейдж-кластера баз данных
resource_type: vm #k8s/vm/phisycal
dev:
title: 03. Кластера разработки
description: Диаграммы развертывания для Кластеров разработки
dev.k8s:
title: Kubernetes - dev
description: Диаграмма развертывания для Кластера разработки Kubernetes
resource_type: k8s #k8s/vm/phisycal
dev.physical_db:
title: Физический кластер БД - dev
description: Диаграмма развертывания для Физического кластера разработки баз данных
resource_type: phisycal #k8s/vm/phisycal
dev.virtual_db:
title: Виртуальный кластер БД - dev
description: Диаграмма развертывания для Виртуального кластера разработки баз данных
resource_type: vm #k8s/vm/phisycal
Для реализации привязки DU в run-time компонентах системы необходимо добавлять массив используемых DU в раздел "deployment_units". В качестве идентификатора DU было решено использовать доменную структуру вида <имя группы кластеров>.<имя DU>:
components:
swamp.crocodile.srole.app:
title: Основное приложение
entity: component
technologies:
- Python
- Django
- Django REST Framework
- Faust
links:
- id: swamp.crocodile.srole.db_postgresql
direction: -->
- id: swamp.crocodile.srole.redis_master
direction: -->
- id: swamp.crocodile.srole.celery
direction: -->
deployment_units:
prod.main: #<prod/stage/dev>.<имя du>
resource_type: k8s #k8s/virtual/phisycal
cpu_type: highend #highend/standart/lowend
cpu: 1 #float - количество ядер
ram: 1 #float - количество памяти в Gb
storage_type: standart #highend/standart/lowend/extralowend
storage_size: 0.1 #Gb
stage.main:
resource_type: k8s #k8s/virtual/phisycal
cpu_type: highend #highend/standart/lowend
cpu: 2 #float - количество ядер
ram: 8 #float - количество памяти в Gb
storage_type: standart #highend/standart/lowend/extralowend
storage_size: 0.1 #Gb
Бывает так, что одна компонента требует разных ресурсов, в этом случае для этой компоненты нужно делать DU под каждые требования. Например, БД SQL может требовать разных дисков для TEMP DB, логов и данных, в этом случае для этой компоненты нужно создать три разных DU каждый со своими требованиями.
- clusters/deployment_card.md — это карточка развертывания конкретной системы. Предполагается, что на этой карточке можно увидеть общую схему развертывания для всех кластеров, а также в ней будет 2 отчета:
- Таблица проверки привязки DU к кластерам - основная цель отчета удостовериться сотруднику команды DevOps, что он привязал все компоненты системы к нужным кластерам. Логика работы отчета следующая: для конкретной системы выбираются все DU и проверяется, что у каждого DU есть связь в кластере, если связи нет, то выводится пустая ячейка. Реализация запроса сделана в модели кластера "system_deployment_table".
- Таблица проверки наличия DU у каждой компоненты системы - основная цель отчета дать возможность сотруднику команды разработки, отвечающему за внесение DU проверить, что для каждой компоненты есть DU. На момент написания инструкции отчет еще не реализован, но предполагается следующая логика: для конкретной системы будут выбраны все компоненты, а затем для каждой компоненты будет осуществлен поиск DU, если DU нет, то ответственный сотрудник должен обратить на это внимание.
- clusters/template — в этой папке лежат шаблоны для визуализации (дерево кластеров и диаграмма развертывания).
- artefacts — в этой папке лежат контексты систем и компонентов
- datasets — в этой папке лежат общие запросы, реализованные через механизм datasets
- systems — в этой папке лежат системы.
- systems/components — в этой папке лежат компоненты конкретных систем. Например, пример разбиения компоненты на DU можно посмотреть в файле sid_components.yaml.
В меню плагина DocHub выберите пункт Документы. В меню вы увидите ссылки на "01. Список систем" и "02. Технологическая архитектура".
1. Если вы хотите посмотреть диаграммы развертывания для кластеров - выберите пункт ""02. Технологическая архитектура"":
Нажмите на ссылку "Кластера ГК Болото", откроется дерево кластеров:
Например, мы хотим посмотреть какие системы находятся на всех продуктовых кластерах. Для этого нужно нажать на кубик "01. Продуктовые кластера":
Появится диаграмма развертывания для продуктовых кластеров:
На каждой системе будет выводиться количество общих ресурсов, которые занимают её компоненты на этом кластере:
Для того чтобы посмотреть из каких компонент состоит система на этом кластере, на картинке нужно кликнуть на эту систему, после этого вы увидите диаграмму развертывания компонент выбранной системы:
Выбор нужного кластера или группы кластеров можно делать не только из дерева кластеров, но и из меню. Просто ткните нужный пункт в меню и будет счастье:
2. Если вы хотите посмотреть диаграмму развертывания для конкретной системы - выберите пункт ""1. Список систем"":
Появится список систем. Для системы S.ID в колонке "Карточка развертывания" нажмите "Ссылка":
После перехода по ссылке появится "Карточка развертывания системы “S.ID”". В начале карточки вы увидите общую схему развертывания системы “S.ID” на всех кластерах:
Прокрутив ниже, можно будет увидеть "Таблица проверки привязки deployment units к кластерам":
- Разберитесь со структурой примера;
- В таблице "Таблица проверки привязки deployment units к кластерам" найдите не привязанные DU и привяжите их к соответствующим кластерам;
- Проверьте, что привязанные системы и их DU начали отображаться на диаграммах развертывания;
- Проверьте, что таблица проверки, теперь отображает имена указанных вами кластеров;
- Если все хорошо, празднуйте успех :-).











