Вложенные кластеры TenantCluster#
Описание#
TenantCluster (вложенный кластер, виртуальный кластер) — это инструмент для создания виртуальных кластеров DropApp (virtual clusters) внутри существующих физических или логических кластеров, реализующий парадигму kube-in-kube.
Виртуальный кластер предоставляет изолированное окружение, которое функционирует как полноценный Kubernetes-кластер, но использует ресурсы родительского кластера (host cluster). Это клиентский кластер, он «живет» на ресурсах родительского кластера, имеет ограниченную версию Dapp-operator, которая позволяет пользователям разворачивать компоненты для работы с пользовательскими приложениями, не влияя на функционирование и не переопределяя системные компоненты родительского кластера.
Инструмент разработан на базе VCluster.
Контекст использования#
TenantCluster разворачивает минимальный набор компонентов Kubernetes API, таких как API Server, Scheduler и Controller Manager, внутри отдельного пространства имен родительского кластера. Также внутри вложенного кластера разворачивается Dapp-operator, который позволяет устанавливать компоненты и инструменты, доступные для таких вложенных клиентских кластеров, - Auth, Ui, GitOps, DevOps, AiOps.
Это позволяет пользователям взаимодействовать с виртуальным кластером с помощью стандартных инструментов Kubernetes - Kubectl, Helm и операторы. Это значительно оптимизирует использование вычислительных мощностей и повышает общую утилизацию рабочих узлов, поскольку вложенный кластер функционирует на узлах родительского кластера. Все networkpolicy и securitypolicy наследуются от родительского кластера, что позволяет использовать единый стандарт политик для всех кластеров в инфраструктуре. Таким образом, каждый родительский кластер функционирует как микро-приватное облако и платформа для создания кластеров DropApp.
Сравнительный анализ пространства имен, TenantCluster и отдельного кластера:
Критерий |
Пространство имен на одного тенанта |
TenantCluster на одного тенанта |
Физический кластер на одного тенанта |
|---|---|---|---|
Уровень изоляции |
Минимальный: изоляция на уровне API, без изоляции процессов, сетей или ресурсов |
Высокий: изолированный control plane, отдельные объекты API, сетевые политики и CNI |
Максимальный: полная изоляция control plane, данных, сети и узлов |
Права доступа тенанта |
Ограниченные: доступ только к объектам в пространстве имен (через RBAC), без доступа к control plane |
Полные права администратора TenantCluster: управление ресурсами, CRD, admission-контролями и сетевыми политиками |
Полные права администратора кластера: root-доступ ко всем компонентам control plane и рабочим узлам |
Стоимость развертывания |
Очень низкая: не требует дополнительных control plane узлов или ресурсов |
Низкая: виртуализация control plane с общим ядром, минимальные накладные расходы |
Высокая: выделенные серверы, нагрузка на инфраструктуру, сложное управление |
Общие ресурсы (CPU, память, узлы) |
Да: ресурсы разделяются между тенантами, возможны проблемы «noisy neighbour» |
Частично: compute-узлы могут быть общими, но control plane изолирован |
Нет: все ресурсы выделены исключительно одному тенанту |
Операционные накладные расходы |
Очень низкие: простота управления, масштабирования и мониторинга |
Низкие: централизованное управление несколькими TenantCluster через host-кластер |
Высокие: необходимость отдельного управления сертификатами, обновлениями, резервными копиями и безопасностью |
Контекст для использования подхода kube-in-kube#
Основной контекст для использования подхода kube-in-kube:
Изоляция сред и тенантов:
Вложенные кластеры позволяют создавать строго изолированные окружения для разных команд, проектов или пользователей. Это особенно важно в мульти-тенантных платформах, где необходимо избежать пересечения ресурсов и обеспечить безопасность.
Упрощенное тестирование и CI/CD:
Можно легко разворачивать временные кластеры для тестирования новых версий приложений, обновлений самого DropApp или инфраструктурных компонентов. Это ускоряет процессы CI/CD и снижает риски при внедрении изменений.
Поддержка GitOps и управления через API:
Kube-in-kube отлично сочетается с GitOps-подходом. Можно декларативно управлять дочерними кластерами через CRD, Helm-релизы и другие инструменты, что делает инфраструктуру более управляемой и воспроизводимой.
Масштабируемость и модульность:
С ростом инфраструктуры можно масштабировать управление, выделяя отдельные кластеры под конкретные задачи: dev, staging, production, edge-кластеры и т.д., сохраняя при этом централизованное управление через родительский кластер.
Обучение и демонстрации:
Для образовательных целей или демонстраций новых решений вложенные кластеры позволяют быстро поднимать «песочницы», не затрагивая основную инфраструктуру.
Архитектура#
Основные компоненты:
Родительский кластер DropApp:
Физический или логический Kubernetes-кластер, предоставляющий ресурсы для работы виртуальных кластеров.
Содержит Etcd, Kube-apiserver, Kube-scheduler и другие компоненты control plane.
Содержит оператор DropApp (Dapp-operator) с контроллером TenantCluster.
TenantCluster:
Создается внутри пространства имен родительского кластера с помощью CRD
TenantCluster.Использует собственный Syncer для синхронизации объектов между виртуальным и родительским кластерами.
Включает упрощенную версию control plane для обработки запросов.
Содержит Dapp-operator и базовые компоненты Auth и Ui.
Syncer:
Компонент, который синхронизирует объекты между виртуальным и родительским кластерами.
Отвечает за преобразование объектов (например,
Pods,Services,ConfigMaps) из вложенного кластера в формат, понятный родительскому кластеру.
Namespace Isolation:
Все ресурсы вложенного кластера размещаются в пределах одного пространства имен родительского кластера.
Обеспечивает изоляцию на уровне RBAC, network-политик и других механизмов безопасности.
Создание TenantCluster#
Для развертывания TenantCluster необходимо создать в родительском кластере CR TenantCluster. Имя этого ресурса будет именем самого вложенного кластера, а также пространства имен родительского кластера, где будут расположены все ресурсы (Pods, Secrets, Services, ConfigMaps, Ingress и др.) вложенного кластера.
Подготовка окружения#
Поскольку адрес control plane, а также адреса компонентов Console и Auth выставляются в качестве Ingress-контролеров, то в DNS должна быть запись для создаваемого кластера, указывающего на адрес Metallb.
Маска доменного имени для адресов вложенного кластера будет: *.team-x.my-cluster,dapp.test, где:
team-x- имя вложенного кластера;my-cluster- имя родительского кластера;dapp.test- имяpublicDomain.
Создание TenantCluster с помощью Kubectl#
Для создания TenantCluster с помощью Kubectl выполните следующие команды:
Создайте файл
tc.yaml:tc.yaml
apiVersion: cluster.dropapp.ru/v1alpha1 kind: TenantCluster metadata: name: team-xПримените файл:
kubectl apply -f tc.yaml
Создание TenantCluster с помощью инструмента Console#
Для создания TenantCluster с помощью инструмента Console выполните следующие шаги:
Перейдите в консоль на страницу
https://<console-address>/k8s/cluster/cluster.dropapp.ru~v1alpha1~TenantCluster, где<console-address>- адрес консоли из примераhttps://console.da-cluster.domain.ru.Нажмите
Create TenantClusterи вставьте манифест в появившееся поле:Create TenantCluster
apiVersion: cluster.dropapp.ru/v1alpha1 kind: TenantCluster metadata: name: team-x
Нажмите
Create.
Конфигурация TenantCluster#
В конфигурации TenantCluster можно настроить необходимые значения в секции spec.values:
apiVersion: cluster.dropapp.ru/v1alpha1
kind: TenantCluster
metadata:
name: team-x
spec:
values:
...
Пример высокодоступного вложенного кластера#
Пример высокодоступного вложенного кластера с настройкой storage и повышенным количеством реплик для Etcd и control plane:
Пример
apiVersion: cluster.dropapp.ru/v1alpha1
kind: TenantCluster
metadata:
name: team-x
spec:
values:
controlPlane:
backingStore:
etcd:
deploy:
statefulSet:
highAvailability:
replicas: 2
statefulSet:
highAvailability:
replicas: 2
persistence:
volumeClaim:
storageClass: nfs-csi # Значение для примера, если установлен инструмент Csi-driver-nfs
enabled: true
Полная конфигурация values#
Полная конфигурация параметров TenantCluster представлена в разделе «Полная конфигурация values TenantCluster».
Получение конфигурации KubeConfig к TenantCluster#
KubeConfig для подключения к кластеру можно получить:
с помощью Kubectl;
в Console на вкладке
Details, в разделеTenantCluster.
Получение конфигурации с помощью Kubectl#
Извлеките содержимое поля config из секрета и сохраните декодированные данные в файл конфигурации KubeConfig, выполнив команду:
kubectl get secret -n team-x vc-team-x -o jsonpath='{.data.config}' | base64 -d > team-x-kubeconfig
Получение конфигурации с помощью инструмента Console#
Для получения KubeConfig, используя инструмент Console, выполните следующие шаги:
Перейдите в Console родительского кластера.
Раскройте раздел
Cluster Management.В раскрывшемся списке перейдите в
TenantClusters.Выберите необходимый
TenantCluster.Перейдите на вкладку
Details.Для скачивания и копирования
KubeConfigнажмите соответствующую кнопку в секцииKubeconfig:
Работа с TenantCluster#
Подключиться к вложенному кластеру можно, используя:
Kubectl.
отдельную Console, которая создается для вложенного кластера.
Работа с TenantCluster с помощью Kubectl#
Для подключения к вложенному кластеру, используя Kubectl, выполните команду:
kubectl get pods -A --kubeconfig ./team-x-kubeconfig
Работа с TenantCluster с помощью инструмента Console#
Получить адрес DropApp Console, логин и пароль можно во вкладке Details для вложенного кластера:
