7.6.1. Создание кластера K8s
ВВЕДЕНИЕ
Managed Kubernetes в DevSpace — это полноценный кластер Kubernetes, который разворачивается в вашем пространстве за несколько минут и обслуживается платформой. В отличие от установки на собственных VM или bare-metal-серверах, вам не нужно готовить операционную систему, устанавливать компоненты кластера, настраивать сеть между узлами и следить за управляющим слоем — всё это берёт на себя DevSpace.
Управляющие компоненты кластера (API-сервер, планировщик и другие) работают внутри платформы и не занимают ваши рабочие узлы. Рабочие узлы — это виртуальные машины, которые создаются и удаляются автоматически в заданных вами пределах. Вы получаете адрес кластера, файл доступа (kubeconfig) и работаете с кластером так же, как с любым другим Kubernetes: через kubectl, GitOps-инструменты или графические клиенты.
ПЕРЕД НАЧАЛОМ
У вас уже должно быть создано пространство в сервисе DevSpace и настроен доступ к его к его приложениям (сервисам). Все действия ниже выполняются внутри вашего пространства.
Также понадобится компьютер с доступом в интернет, на который вы установите утилиту kubectl для управления кластером.
ПОШАГОВОЕ РУКОВОДСТВО
ШАГ 1. ОТКРОЙТЕ КАТАЛОГ ПРИЛОЖЕНИЙ И ВЫБЕРИТЕ KUBERNETES
В дашборде перейдите в раздел управления приложениями. Открыть форму создания кластера можно двумя способами:
-
через Marketplace: выберите карточку Infrastructure, затем Kubernetes;
-
через меню в левом верхнем углу консоли: выберите Kubernetes и нажмите Deploy.
Оба пути ведут к одной и той же форме создания кластера.
ШАГ 2. ЗАДАЙТЕ ИМЯ КЛАСТЕРА
Имя станет частью идентификатора кластера и его DNS-адреса. По умолчанию API кластера получает адрес вида kubernetes-<имя>.<домен-вашего-пространства> — например, кластер demo в пространстве kzf7us4o5d будет доступен по адресу kubernetes-demo.kzf7us4o5d.devspace.cloupard.io. Выбирайте короткое имя из строчных латинских букв и цифр.
По этому адресу API кластера будет доступен из интернета сразу после создания — он публикуется через входной шлюз платформы, а доступ защищён сертификатами из файла kubeconfig: без файла доступа подключиться к кластеру нельзя.
ШАГ 3. ВЫБЕРИТЕ КЛАСС ХРАНЕНИЯ ДЛЯ ДАННЫХ ПРИЛОЖЕНИЙ
Параметр storageClass определяет, в каком классе хранилища платформы будут создаваться постоянные тома (PVC) — диски, которые ваши приложения запрашивают для хранения данных. Такие тома выделяются из хранилища платформы, подключаются к узлам по мере необходимости и переживают пересоздание и подов, и самих узлов.
Доступны два класса:
-
replicated (по умолчанию) — данные каждого тома дублируются хранилищем на нескольких серверах. Надёжный выбор для любых данных: отказ одного сервера хранения не приводит к их потере.
-
local — том без репликации на уровне хранилища: быстрее и экономичнее. Подходит для приложений, которые сами хранят данные в нескольких репликах — кластерных баз данных, брокеров сообщений и т.п.: их данные уже продублированы на уровне приложения, и дублировать их ещё раз средствами хранилища избыточно.
Объём, занятый постоянными томами, тарифицируется в DevSpace по ресурсу «Хранилище».
Важно: класс хранения кластера нельзя изменить после создания. Если сомневаетесь — оставьте replicated.
|
ШАГ 4. НАСТРОЙТЕ ГРУППУ РАБОЧИХ УЗЛОВ
Рабочие узлы объединены в группу (по умолчанию она называется md0). В форме для группы задаются четыре ключевых параметра.
Минимальное и максимальное количество реплик (minReplicas / maxReplicas, по умолчанию от 0 до 10) — границы автоматического масштабирования. Это не просто «сколько узлов создать»: кластер сам добавляет узлы, когда приложениям не хватает ресурсов, и убирает лишние, когда нагрузка спадает, — но никогда не выйдет за заданные вами пределы. Нужен стабильный кластер ровно из 5 узлов — задайте минимум 5 и максимум 5; хотите начать с 2 узлов с возможностью дорасти до 10 — задайте минимум 2 и максимум 10.
Тип инстанса (instanceType, по умолчанию u1.medium) — размер виртуальной машины каждого узла: количество CPU и объём памяти. Все узлы группы одинаковы; если нужны узлы разных размеров, добавьте ещё одну группу. Справочник по доступным instanceType
Размер диска узла (diskSize, по умолчанию 20Gi) — временный (ephemeral) диск самой виртуальной машины: на нём хранятся образы контейнеров, логи и временные данные подов. Диск живёт вместе с узлом — при пересоздании узла (масштабирование, обновление) его содержимое теряется, поэтому данные приложений на нём не хранят: для них предназначены постоянные тома из шага 3. Увеличивайте размер, если приложения используют много крупных образов контейнеров.
Роли (roles) — метки назначения узлов группы. Роль ingress-nginx (проставлена по умолчанию) позволяет узлам группы принимать входящий веб-трафик — она нужна для работы аддона Ingress-NGINX из шага 6. Не убирайте её, если планируете публиковать веб-приложения.
ШАГ 5. ВЫБЕРИТЕ ВЕРСИЮ KUBERNETES
Доступны версии с v1.30 по v1.35; по умолчанию предлагается самая свежая — v1.35. Указывается только основная версия (major.minor), платформа сама разворачивает актуальный патч-релиз: например, v1.35 сейчас означает Kubernetes 1.35.1, а v1.32 — 1.32.12.
Важный момент при выборе:
-
Если вы переносите нагрузки с существующего кластера — выберите ту же версию, что и у него. Между соседними версиями Kubernetes меняются и удаляются API, и при разнице версий часть ваших манифестов придётся переписывать. Совпадающая версия делает переезд предсказуемым.
-
Если начинаете с нуля — берите версию по умолчанию.ШАГ 6. ВКЛЮЧИТЕ НУЖНЫЕ АДДОНЫ
Аддоны — это готовые компоненты, которые платформа устанавливает в кластер вместе с его созданием, избавляя вас от ручной установки и настройки. Всё выключенное на этом шаге можно включить позже, изменив конфигурацию кластера.
Приложения, запущенные в кластере, по умолчанию не доступны из интернета. Способ публикации выбирается под вашу задачу:
-
Публикуете сайты, веб-приложения, HTTP-API — включите аддон Ingress-NGINX: все веб-приложения кластера публикуются через один вход, с маршрутизацией по доменам и автоматическими TLS-сертификатами (в связке с cert-manager). Это рекомендуемый путь для веб-трафика. Если ваши приложения построены на Gateway API — вместо него включите одноимённый аддон.
-
Публикуете не-веб-сервис — базу данных, брокер сообщений, игровой сервер, что угодно с произвольным TCP/UDP-протоколом — аддоны не нужны: создайте для своего приложения сервис типа LoadBalancer внутри кластера. Приложение получит собственный внешний IP-адрес, и трафик пойдёт напрямую в него, без посредников. Каждый такой IP тарифицируется в DevSpace отдельно.
cert-manager + Ingress-NGINX — рекомендуемая связка для публикации веб-приложений. Ingress-NGINX принимает входящий HTTP/HTTPS-трафик и маршрутизирует его к вашим приложениям, а cert-manager автоматически выпускает и продлевает TLS-сертификаты (в том числе бесплатные от Let’s Encrypt). Компоненты интегрированы между собой из коробки: включив оба, вы получаете рабочую схему «домен → сертификат → приложение» без ручной настройки. Для Ingress-NGINX доступны два способа публикации:
-
Proxied(по умолчанию) — трафик приходит через общий входной шлюз платформы, отдельный внешний IP не выделяется. Перечислите в поле hosts полные доменные имена ваших приложений — имена записываются как есть, без автоматического дополнения домена. Пока список пуст, внешний трафик к приложениям в кластер не маршрутизируется; дополнить список можно и позже, изменив конфигурацию кластера. Настройка зависит от того, чей домен вы используете:поддомен вашего пространства (например, app.<домен-пространства>) — уже указывает на шлюз платформы и работает сразу, никаких DNS-настроек не требуется;собственный домен — создайте у своего DNS-провайдера CNAME-запись, указывающую на домен пространства; для корневого домена, где CNAME недопустим, — A-запись на IP-адрес шлюза (узнать его можно, разрешив домен пространства, например командой dig <домен-пространства>).
-
LoadBalancer— контроллер Ingress-NGINX получит выделенный балансировщик с собственным внешним IP-адресом: на него вы направляете DNS-записи своих доменов, и трафик идёт в кластер напрямую, минуя общий шлюз. Список hosts при этом не используется. Это по-прежнему один вход для всех веб-приложений кластера — не путайте с сервисом LoadBalancer для отдельного приложения. Выделенный внешний IP тарифицируется в DevSpace отдельно.
Обратите внимание: при способе Proxied список hosts лишь открывает домену дорогу от шлюза платформы до вашего кластера. Куда направить запрос дальше, внутри кластера, решают обычные Ingress-ресурсы, которые вы создаёте рядом со своими приложениями, — без них запрос дойдёт до кластера и получит ответ 404 от контроллера. То есть каждый домен настраивается в двух местах: в hosts кластера и в Ingress-ресурсе приложения. Минимальный пример такого Ingress-ресурса:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app
spec:
ingressClassName: nginx
rules:
- host: app.<домен-пространства> # то же имя, что указано в hosts кластера
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-app # сервис вашего приложения
port:
number: 80
|
Flux CD — GitOps-доставка манифестов. Позволяет хранить конфигурацию ваших приложений в Git-репозитории (GitHub, GitLab или собственном приватном) — Flux сам скачивает манифесты и применяет их в кластере, поддерживая его состояние в соответствии с репозиторием. Включайте, если планируете GitOps-подход. Если предпочитаете Argo CD или другой инструмент — не включайте Flux, чтобы они не конфликтовали за управление ресурсами.
Velero — резервное копирование объектов кластера. Крайне полезный инструмент: сохраняет объекты Kubernetes в S3-совместимое хранилище и позволяет восстановиться после сбоя или ошибочного удаления. Гибко настраивается фильтрами — можно бэкапить как весь кластер, так и отдельные пространства имён или типы объектов.
Остальные аддоны (Gateway API, агенты мониторинга и другие) описаны в разделе «Параметры» ниже. Для первого кластера их можно оставить выключенными.
ШАГ 7. ПРОВЕРЬТЕ ОСТАЛЬНЫЕ ПОЛЯ И СОЗДАЙТЕ КЛАСТЕР
Остальные параметры формы можно оставить по умолчанию — их полное описание есть в разделе «Параметры» ниже. Нажмите Deploy — кластер начнёт создаваться.
ШАГ 8. ДОЖДИТЕСЬ ГОТОВНОСТИ
Создание кластера занимает несколько минут. За процессом можно наблюдать на странице кластера в дашборде: вкладка Workloads показывает поды служебных компонентов кластера и их состояние, вкладка Events — события, происходящие прямо сейчас. Дождитесь, когда статус кластера сменится на Ready, а поды на вкладке Workloads перейдут в состояние Running.
После этого на вкладке Secrets страницы кластера появится секрет kubernetes-<имя>-admin-kubeconfig с файлами доступа. В нём четыре ключа:
-
admin.conf— тот, что вам нужен: файл kubeconfig с внешним адресом кластера для подключения с вашего компьютера;
-
admin.svc— тот же доступ, но с внутренним адресом кластера — для подключения из сервисов внутри платформы;
-
super-admin.conf/ super-admin.svc — аварийный доступ с максимальными правами в обход обычной модели прав; для повседневной работы не используется.Подсказка: не выделяйте и не копируйте содержимое секрета мышкой из окна просмотра — так легко захватить лишние символы или потерять переносы строк. Используйте кнопку копирования рядом с нужным ключом: она копирует содержимое в точности.ШАГ 9. УСТАНОВИТЕ KUBECTL И ПОДКЛЮЧИТЕСЬ К КЛАСТЕРУkubectl — стандартная консольная утилита для управления Kubernetes. Установите её по официальной инструкции для вашей операционной системы. Желательно ставить версию, соответствующую версии вашего кластера (например, kubectl 1.35 для кластера v1.35) — допустимо отклонение в один минорный релиз.Затем сохраните kubeconfig:mkdir -p ~/.kube# если у вас уже есть файл ~/.kube/config от другого кластера — сначала сохраните его копию:cp ~/.kube/config ~/.kube/config.backup# откройте файл в редакторе и вставьте содержимое ключа admin.conf, скопированное кнопкой копирования:nano ~/.kube/configПосле вставки убедитесь, что форматирование не сломалось: файл должен выглядеть как аккуратный YAML с отступами, без «слипшихся» строк. Проверьте подключение:kubectl get nodesШАГ 10. ДОЖДИТЕСЬ ГОТОВНОСТИ УЗЛОВГотовый кластер — это ещё не готовые к работе узлы и поды в нём. Сразу после создания рабочие узлы могут ещё регистрироваться в кластере, а системные компоненты — запускаться. Порядок такой: сначала стартует сеть кластера (в DevSpace по умолчанию используется Cilium), после неё узлы переходят в состояние Ready, затем поднимаются остальные системные компоненты и включённые аддоны (cert-manager, Ingress-NGINX и другие).Подождите несколько минут и проверьте:kubectl get nodeskubectl get pods -AКогда все узлы в состоянии Ready, а системные поды — Running, кластер готов к работе. Единичные перезапуски системных подов на этапе старта — это нормально: компоненты ждут друг друга.ШАГ 11 (ПО ЖЕЛАНИЮ). УСТАНОВИТЕ FREELENS — ГРАФИЧЕСКИЙ ОБОЗРЕВАТЕЛЬ КЛАСТЕРАFreelens — бесплатное десктопное приложение с открытым исходным кодом, своеобразный «проводник» по Kubernetes. Оно особенно полезно на первых порах: позволяет изучать кластер визуально, не заучивая команды kubectl.Где взять: скачайте установщик для Windows, macOS или Linux с freelens.app или со страницы релизов на GitHub.Как подключить кластер: Freelens работает с теми же kubeconfig-файлами, что и kubectl. Можно добавить файл конфигурации вручную через меню добавления кластера, а можно настроить автоматическое подхватывание конфигов из нужной директории (например, ~/.kube) — тогда кластер появится в списке сам.Что в нём удобно смотреть:
-
Nodes — состояние и ресурсы узлов кластера;
-
Workloads → Pods — запущенные поды; отсюда же можно посмотреть логи пода или удалить его для перезапуска;
-
Namespaces — пространства имён; здесь же создаются новые;
-
Config → Secrets / ConfigMaps — секреты и конфигурации с фильтрацией по пространствам имён;
-
Storage → Storage Classes — доступные классы хранения; пригодятся при написании манифестов с постоянными томами;
-
Network — сервисы, endpoints и ingress-ресурсы.
Функциональность расширяется плагинами: например, плагин для Flux CD показывает состояние GitOps-объектов прямо в интерфейсе.
ПАРАМЕТРЫ
Полный список параметров кластера. Всё, что не задано явно, платформа заполняет значениями по умолчанию из этой таблицы.
Основные
|
Параметр
|
Что делает
|
Значение по умолчанию
|
Когда менять
|
|
version
|
Версия Kubernetes (major.minor): v1.30 – v1.35. Платформа разворачивает последний патч-релиз выбранной версии.
|
v1.35
|
При переносе нагрузок с существующего кластера — выбрать его версию.
|
|
host
|
Внешнее DNS-имя кластера, по которому доступен его API.
|
пусто = kubernetes-<имя>.
<домен-пространства>
|
Если хотите использовать собственный домен.
|
|
storageClass
|
Класс хранения для постоянных томов (PVC) приложений в кластере: replicated — данные тома дублируются хранилищем на нескольких серверах; local — без репликации на уровне хранилища, быстрее. Объём томов тарифицируется по ресурсу «Хранилище». Нельзя изменить после создания.
|
replicated
|
local — для приложений, которые сами реплицируют свои данные (кластерные БД, брокеры сообщений).
|
Управляющий слой (control plane)
Компоненты управляющего слоя работают на стороне платформы. Ресурсы каждого компонента задаются либо именованным пресетом (resourcesPreset), либо явными значениями CPU/памяти (resources) — явные значения имеют приоритет. Справочник по пресетам ресурсов
|
Параметр
|
Что делает
|
Значение по умолчанию
|
Когда менять
|
|
controlPlane.replicas
|
Число реплик управляющего слоя.
|
2
|
1 — для экономии на тестовых кластерах; 2+ — отказоустойчивость для production.
|
|
controlPlane.apiServer.resourcesPreset
|
c1.medium
|
При росте кластера и числа обращений к API.
| |
|
controlPlane.apiServer.resources
|
Явные CPU/память API-сервера (переопределяют пресет).
|
не заданы
|
Когда пресетов недостаточно и нужны точные значения.
|
|
controlPlane.controllerManager.resourcesPreset
|
Пресет ресурсов controller manager.
|
t1.micro
|
Редко; при большом числе объектов в кластере.
|
|
controlPlane.controllerManager.resources
|
Явные CPU/память controller manager.
|
не заданы
|
Аналогично.
|
|
controlPlane.scheduler.resourcesPreset
|
Пресет ресурсов планировщика.
|
t1.micro
|
Редко.
|
|
controlPlane.scheduler.resources
|
Явные CPU/память планировщика.
|
не заданы
|
Редко.
|
|
controlPlane.konnectivity.server.resourcesPreset
|
Пресет ресурсов konnectivity-сервера (туннель между управляющим слоем и узлами).
|
t1.micro
|
Редко.
|
|
controlPlane.konnectivity.server.resources
|
Явные CPU/память konnectivity-сервера.
|
не заданы
|
Редко.
|
Группы рабочих узлов (nodeGroups)
Узлы объединяются в именованные группы; по умолчанию создаётся одна группа md0. Групп может быть несколько — например, отдельная группа более крупных узлов под ресурсоёмкие сервисы. Все параметры ниже задаются для каждой группы.
|
Параметр
|
Что делает
|
Значение по умолчанию
|
Когда менять
|
|
minReplicas
|
Минимальное число узлов в группе — нижняя граница автомасштабирования.
|
0
|
Задайте не меньше числа узлов, которое должно работать всегда.
|
|
maxReplicas
|
Максимальное число узлов — верхняя граница автомасштабирования.
|
10
|
По потолку бюджета и ожидаемой нагрузке.
|
|
instanceType
|
Тип виртуальной машины узла (CPU и память), например u1.medium. Справочник по типам.
|
u1.medium
|
Под требования ваших приложений.
|
|
diskSize
|
Размер временного (ephemeral) диска узла: образы контейнеров, логи, временные данные подов, данные kubelet и containerd. Содержимое теряется при пересоздании узла. Постоянные тома приложений сюда не входят — они выделяются из хранилища платформы (см. storageClass кластера).
|
20Gi
|
Если приложения используют много крупных образов или активно пишут во временные тома.
|
|
storageClass
|
Класс хранения для дисков узлов этой группы.
|
пусто = класс по умолчанию
|
Если для узлов нужен отдельный класс хранения.
|
|
roles
|
Список ролей узлов группы. Роль ingress-nginx требуется хотя бы у одной группы, чтобы работал одноимённый аддон.
|
["ingress-nginx"]
|
Не убирайте роль ingress-nginx, если планируете этот аддон.
|
|
resources
|
Явные CPU/память узла (вместо instanceType).
|
не заданы
|
Когда типовые размеры не подходят.
|
|
gpus
|
Список GPU, подключаемых к узлам группы, — для вычислительных и ML-нагрузок.
|
[]
|
Пока не используется: узлов с GPU в DevSpace нет.
|
|
kubelet.evictionHardMemory
|
Жёсткий порог памяти, при котором узел начинает вытеснять поды (абсолютное значение или процент).
|
7%
|
Тонкая настройка стабильности узлов.
|
|
kubelet.evictionSoftMemory
|
Мягкий порог вытеснения по памяти.
|
10%
|
Аналогично.
|
|
kubelet.systemReservedMemory / kubelet.systemReservedCpu
|
Память/CPU, зарезервированные для ОС узла.
|
пусто = вычисляются из instanceType
|
Обычно не требуется.
|
|
kubelet.kubeReservedMemory / kubelet.kubeReservedCpu
|
Память/CPU, зарезервированные для kubelet и контейнерного рантайма.
|
пусто = вычисляются из instanceType
|
Обычно не требуется.
|
Аддоны (addons)
У каждого аддона есть поле valuesOverride — расширенная настройка компонента для опытных пользователей; по умолчанию оно пустое, и компонент работает с настройками платформы.
|
Параметр
|
Что делает
|
Значение по умолчанию
|
Когда менять
|
|
certManager.enabled
|
Автоматический выпуск и продление TLS-сертификатов (включая Let’s Encrypt).
|
false
|
Включите вместе с Ingress-NGINX для публикации приложений по HTTPS.
|
|
ingressNginx.enabled
|
Контроллер входящего HTTP/HTTPS-трафика. Требует роли ingress-nginx на узлах (есть по умолчанию).
|
false
|
Включите для публикации веб-приложений.
|
|
ingressNginx.exposeMethod
|
Способ публикации контроллера: Proxied — через входной шлюз платформы (без выделенного IP, только домены из hosts), LoadBalancer — через выделенный балансировщик с собственным внешним IP (список hosts не используется, DNS-записи приложений направляются на этот IP; внешний IP тарифицируется отдельно).
|
Proxied
|
LoadBalancer — когда нужен отдельный внешний IP и трафик в обход общего шлюза.
|
|
ingressNginx.hosts
|
Полные доменные имена, трафик которых входной шлюз платформы направляет в этот кластер (при exposeMethod: Proxied). Записываются как есть, без автоматического дополнения. Поддомены домена пространства работают без настройки DNS; для собственных доменов настройте CNAME на домен пространства. Wildcard-имена (*.apps.example.com) допустимы, но HTTPS для них терминируется на шлюзе платформы с его сертификатом — для полноценного TLS с собственными сертификатами перечисляйте имена явно. Список открывает домену путь только до кластера; маршрут до приложения задаёт Ingress-ресурс внутри кластера.
|
[]
|
Обязательно заполните при публикации приложений через Proxied; можно дополнять после создания кластера.
|
|
fluxcd.enabled
|
GitOps-оператор Flux CD: применяет манифесты из Git-репозитория.
|
false
|
Включите для GitOps-подхода; не включайте при использовании Argo CD.
|
|
velero.enabled
|
Резервное копирование и восстановление объектов кластера в S3.
|
false
|
Рекомендуется для любых важных сред.
|
|
gatewayAPI.enabled
|
Поддержка Gateway API — современной альтернативы Ingress для маршрутизации трафика.
|
false
|
Если ваши приложения используют Gateway API.
|
|
gpuOperator.enabled
|
NVIDIA GPU Operator: драйверы и обвязка для работы с GPU на узлах.
|
false
|
Пока не используется: узлов с GPU в DevSpace нет.
|
|
hami.enabled
|
HAMi — виртуализация GPU (разделение одной карты между подами). Требует включённого GPU Operator.
|
false
|
Пока не используется: узлов с GPU в DevSpace нет.
|
|
monitoringAgents.enabled
|
Агенты мониторинга (сбор метрик и логов) с отправкой в систему мониторинга пространства.
|
false
|
Рекомендуется для production.
|
|
ouroboros.enabled
|
Исправление hairpin-NAT для Ingress-NGINX с PROXY-протоколом. Требует включённого ingressNginx; полезен только при настроенном PROXY-протоколе.
|
false
|
Узкий случай; включайте по рекомендации поддержки.
|
|
cilium.valuesOverride
|
Тонкая настройка сети кластера (Cilium — сеть по умолчанию, отключить её нельзя).
|
{}
|
Только для опытных пользователей.
|
|
coredns.valuesOverride
|
Тонкая настройка DNS кластера (CoreDNS устанавливается всегда).
|
{}
|
Только для опытных пользователей.
|
|
verticalPodAutoscaler.valuesOverride
|
Тонкая настройка Vertical Pod Autoscaler.
|
{}
|
Только для опытных пользователей.
|
Служебные
|
Параметр
|
Что делает
|
Значение по умолчанию
|
Когда менять
|
|
images.waitForKubeconfig
|
Переопределение служебного образа ожидания kubeconfig — для изолированных сред и реестров с лимитами.
|
пусто
|
Практически никогда; по указанию поддержки.
|
Пример конфигурации
Итоговая конфигурация, соответствующая шагам из руководства: кластер из пяти узлов с фиксированным размером, связка cert-manager + Ingress-NGINX, Flux CD и Velero.
apiVersion: apps.cozystack.io/v1alpha1
kind: Kubernetes
metadata:
name: demo # имя кластера; адрес API будет kubernetes-demo.<домен-пространства>
spec:
version: v1.35 # свежая версия; при переезде — версия исходного кластера
host: "" # пусто = адрес по умолчанию
storageClass: replicated # класс хранения PVC приложений; неизменяемый после создания!
controlPlane:
replicas: 2 # 2 реплики управляющего слоя — отказоустойчивость
apiServer:
resources: {}
resourcesPreset: c1.medium
controllerManager:
resources: {}
resourcesPreset: t1.micro
scheduler:
resources: {}
resourcesPreset: t1.micro
konnectivity:
server:
resources: {}
resourcesPreset: t1.micro
nodeGroups:
md0:
minReplicas: 5 # ровно пять узлов:
maxReplicas: 5 # min = max отключает автомасштабирование
instanceType: u1.medium
diskSize: 20Gi # временный диск узла: образы, логи, временные данные
storageClass: ""
roles:
- ingress-nginx # роль нужна для аддона Ingress-NGINX
resources: {}
gpus: []
kubelet: {}
addons:
certManager:
enabled: true # автоматические TLS-сертификаты
valuesOverride: {}
ingressNginx:
enabled: true # приём входящего HTTP/HTTPS-трафика
exposeMethod: Proxied
hosts: []
valuesOverride: {}
fluxcd:
enabled: true # GitOps-доставка манифестов
valuesOverride: {}
velero:
enabled: true # резервное копирование объектов кластера
valuesOverride: {}
cilium:
valuesOverride: {}
coredns:
valuesOverride: {}
gatewayAPI:
enabled: false
gpuOperator:
enabled: false
valuesOverride: {}
hami:
enabled: false
valuesOverride: {}
monitoringAgents:
enabled: false
valuesOverride: {}
ouroboros:
enabled: false
valuesOverride: {}
verticalPodAutoscaler:
valuesOverride: {}
|
ПРОВЕРКА
1. В дашборде: статус кластера — Ready, поды на вкладке Workloads — в состоянии Running, на вкладке Secrets доступен kubeconfig. На вкладке Ingresses должна появиться запись kubernetes-<имя>, адрес которой совпадает с адресом кластера в kubeconfig — это публикация API вашего кластера через входной шлюз платформы; она создаётся вместе с управляющим слоем, и её наличие подтверждает, что он развёрнут и опубликован. Ingress-ресурсы ваших приложений появятся на этой вкладке позже, когда вы начнёте их публиковать.
2. Узлы зарегистрированы и готовы:
kubectl get nodes
|
Ожидаемый результат — все узлы в состоянии Ready (первые минуты после создания они могут быть NotReady, пока поднимается сеть). Имена узлов складываются из имени кластера, имени группы и случайных суффиксов, а колонка ROLES показывает роли группы:
NAME STATUS ROLES AGE VERSION
kubernetes-demo-md0-stxhx-4k6hh Ready ingress-nginx 5m v1.35.1
kubernetes-demo-md0-stxhx-7zq2m Ready ingress-nginx 5m v1.35.1
...
|
3.Системные компоненты запущены:
kubectl get pods -A
|
Все поды в состоянии Running или Completed. Если включали аддоны — в списке будут поды cert-manager, ingress-nginx, flux и velero.
ЧАСТЫЕ ОШИБКИ
Аддон Ingress-NGINX включён, всё в состоянии Running, но приложения снаружи недоступны — при этом нигде нет ни одной ошибки. Причина: способ публикации Proxied с пустым списком hosts. Входному шлюзу платформы некуда маршрутизировать трафик — маршрут для ваших доменов просто не создаётся, и это не считается ошибкой. Что делать: добавьте полные доменные имена приложений в ingressNginx.hosts и сохраните конфигурацию кластера.
Приложения перестали открываться, шлюз отвечает ошибкой 503. Причина: ни в одной группе узлов не осталось роли ingress-nginx — контроллеру входящего трафика негде работать, и запросы упираются в пустоту. Что делать: верните роль ingress-nginx хотя бы одной группе узлов.
Сразу после создания кластера узлы в состоянии NotReady. Причина: сеть кластера ещё запускается, а узлы становятся готовыми только после её старта — это нормальный порядок запуска, а не сбой. Что делать: подождите несколько минут. Если состояние не меняется 10–15 минут — посмотрите вкладку Events на странице кластера.
kubectl не подключается: ошибки соединения или сертификатов. Причина: повреждён kubeconfig — скопирован не тот ключ секрета или при вставке сломалось форматирование YAML. Что делать: скопируйте содержимое ключа admin.conf кнопкой копирования и вставьте заново, проверив отступы.
Не удаётся изменить storageClass кластера. Причина: этот параметр неизменяем после создания кластера. Что делать: создайте новый кластер с нужным классом хранения и перенесите нагрузки.
Кластер в статусе Ready, но поды приложений висят в Pending. Причина: автомасштабирование упёрлось в maxReplicas, либо запросы ресурсов приложений не помещаются на узлы выбранного размера. Что делать: увеличьте maxReplicas группы узлов или выберите более крупный instanceType.
После переключения exposeMethod с Proxied на LoadBalancer приложения перестали открываться по прежним адресам. Причина: при LoadBalancer маршрут через общий шлюз платформы удаляется, а DNS-имена приложений всё ещё указывают на шлюз — тот отвечает 404. Что делать: направьте DNS-записи приложений на внешний IP выделенного балансировщика (виден на вкладке Services страницы кластера).
ЧТО ДАЛЬШЕ
Публикация приложений — настройка Ingress-ресурсов, доменов и сертификатов Let’s Encrypt для доступа к вашим приложениям из интернета.
Справочник по instanceType и resourcesPreset — какие типы инстансов и пресеты ресурсов доступны и как выбрать подходящий.