Эта инструкция подходит для ситуации, когда Kubernetes-кластер на базе Talos Linux уже создан и работает: control plane запущен, worker-узлы присоединены, CNI установлен, а Kubernetes API доступен через d8 k.

Deckhouse Platform (DP) устанавливается поверх готового Kubernetes-кластера в режиме установки в существующий кластер. В примере используется Deckhouse Platform Open, канал обновлений EarlyAccess и набор модулей Managed.

В этой схеме:

  • Talos продолжает управлять ОС, MachineConfig, kubelet, containerd, etcd, control plane, Kubernetes PKI и обновлением Kubernetes;
  • существующий CNI продолжает отвечать за сеть подов;
  • внешний инфраструктурный провайдер или пользователь продолжает создавать и удалять машины;
  • DP устанавливает и обновляет платформенные модули, но не управляет Talos и жизненным циклом узлов.

Значение bundle выбирается во время установки и впоследствии не изменяется. Нельзя установить Managed, а затем обычным изменением конфигурации переключить его на Minimal или Default.

Предварительные требования

На компьютере, с которого запускается установка, нужны:

  • Docker;
  • Deckhouse CLI;
  • yq для проверки YAML;
  • административный kubeconfig Talos-кластера;
  • доступ к Kubernetes API;
  • HTTPS-доступ к registry.deckhouse.ru с компьютера и узлов кластера;
  • talosctl и talosconfig, если административный kubeconfig ещё не получен.

SSH к Talos-узлам не нужен: установщик работает через Kubernetes API.

Перед установкой рекомендуется сделать снимок etcd средствами Talos и сохранить исходные talosconfig и kubeconfig.

Настройка рабочих путей

Создайте отдельный каталог для файлов установки и перейдите в него:

mkdir -p "$PWD/talos-deckhouse-install"
cd "$PWD/talos-deckhouse-install"

Все дальнейшие команды предполагают, что текущим остаётся этот каталог. Задайте пути один раз:

TALOSCONFIG="$PWD/talosconfig"
ADMIN_KUBECONFIG="$PWD/kubeconfig-admin"
INSTALLER_KUBECONFIG="$PWD/kubeconfig-installer"
CONFIG_FILE="$PWD/config.yml"

Назначение файлов:

Переменная Назначение
TALOSCONFIG Конфигурация talosctl для доступа к Talos API
ADMIN_KUBECONFIG Административный kubeconfig для команд d8 k на компьютере
INSTALLER_KUBECONFIG Переносимая копия административного kubeconfig для Docker-контейнера
CONFIG_FILE Конфигурация установки Deckhouse Platform

Если вы открыли новый терминал, снова перейдите в рабочий каталог и задайте четыре переменные из блока выше.

Подготовка административного kubeconfig

Дальнейшие действия зависят от того, есть ли у вас административный kubeconfig.

Если kubeconfig уже есть

Скопируйте его в рабочий каталог:

cp <ADMIN_KUBECONFIG_PATH> "$ADMIN_KUBECONFIG"
chmod 600 "$ADMIN_KUBECONFIG"

Имеется в виду kubeconfig для d8 k, а не talosconfig для talosctl.

Если kubeconfig нужно получить через Talos

Сначала поместите существующий talosconfig в рабочий каталог:

cp <TALOSCONFIG_PATH> "$TALOSCONFIG"
chmod 600 "$TALOSCONFIG"

Укажите адрес control-plane-узла:

CONTROL_PLANE_ADDRESS=<CONTROL_PLANE_IP_OR_DNS>

Получите административный kubeconfig:

talosctl kubeconfig "$ADMIN_KUBECONFIG" --talosconfig="$TALOSCONFIG" --nodes="$CONTROL_PLANE_ADDRESS" --merge=false
chmod 600 "$ADMIN_KUBECONFIG"

По умолчанию talosctl возьмёт эндпоинты Talos API из текущего контекста talosconfig. Если нужен другой эндпоинт, добавьте:

--endpoints=<TALOS_API_ENDPOINT>

Параметр --force используйте только при осознанной перезаписи существующего файла.

Проверка прав

Проверьте, как Kubernetes определяет пользователя:

d8 k --kubeconfig="$ADMIN_KUBECONFIG" auth whoami

Для установки нужен стабильный административный доступ. Административный kubeconfig Talos обычно использует группу system:masters. Пользовательский OIDC kubeconfig для установки нежелателен: после включения модуля DP user-authz права такого пользователя в системных неймспейсах могут измениться.

Проверьте основные разрешения:

d8 k --kubeconfig="$ADMIN_KUBECONFIG" auth can-i '*' '*' --all-namespaces
d8 k --kubeconfig="$ADMIN_KUBECONFIG" auth can-i create customresourcedefinitions.apiextensions.k8s.io
d8 k --kubeconfig="$ADMIN_KUBECONFIG" auth can-i create clusterroles.rbac.authorization.k8s.io

Все три команды должны вывести yes.

Проверка исходного кластера

Проверьте узлы:

d8 k --kubeconfig="$ADMIN_KUBECONFIG" get nodes -o wide

Все узлы должны быть в состоянии Ready.

Проверьте Kubernetes API:

d8 k --kubeconfig="$ADMIN_KUBECONFIG" get --raw='/readyz?verbose'

В конце ответа должно быть readyz check passed.

Проверьте системные поды:

d8 k --kubeconfig="$ADMIN_KUBECONFIG" -n kube-system get pods -o wide

До установки DP уже должны работать:

  • CNI;
  • CoreDNS;
  • kube-proxy, если он используется выбранной сетевой схемой;
  • компоненты control plane.

Также убедитесь, что версия Kubernetes поддерживается выбранной версией DP.

Проверка границ ответственности

DP не должна одновременно с Talos или внешним инфраструктурным провайдером управлять одними и теми же компонентами.

В таблице приведён список компонентов и их владельцев после установки:

Компонент Владелец после установки
Talos OS и MachineConfig Talos
etcd и Kubernetes control plane Talos
Kubernetes PKI Talos
kubelet и containerd Talos
CNI Уже установленный внешний CNI
CoreDNS и kube-proxy, если используется Существующий кластер
Создание и удаление машин Внешний инфраструктурный провайдер или пользователь
Платформенные модули DP

Следующие модули DP должны оставаться выключенными:

  • control-plane-manager;
  • node-manager;
  • terraform-manager;
  • cni-cilium;
  • kube-dns;
  • kube-proxy;
  • модули облачных провайдеров (cloud-provider-*);
  • registry-packages-proxy.

Если в Talos-кластере уже установлен Cilium, включать модуль DP cni-cilium нельзя: два оператора не должны одновременно управлять одним CNI.

Набор модулей Managed включает ingress-nginx, cert-manager, local-path-provisioner, VPA, мониторинг и модуль user-authz. До установки проверьте, нет ли в кластере их внешних аналогов:

d8 k --kubeconfig="$ADMIN_KUBECONFIG" get storageclass
d8 k --kubeconfig="$ADMIN_KUBECONFIG" get ingressclass
d8 k --kubeconfig="$ADMIN_KUBECONFIG" get deployments -A
d8 k --kubeconfig="$ADMIN_KUBECONFIG" get crd

Если компонент уже установлен, заранее определите единственного владельца. Не запускайте одновременно два Ingress-контроллера, два cert-manager или два VPA. Если управление компонентом остаётся за внешним решением, явно отключите соответствующий модуль DP через ModuleConfig с spec.enabled: false. Если компонентом должна управлять DP, перед установкой отключите или удалите его внешний аналог.

Подготовка kubeconfig для контейнера установщика

Установщик запускается внутри Docker. Ему нужна переносимая копия kubeconfig, которая не ссылается на файлы сертификатов и ключей, доступные только на компьютере пользователя.

Создайте такую копию:

d8 k --kubeconfig="$ADMIN_KUBECONFIG" config view --raw --flatten --minify > "$INSTALLER_KUBECONFIG"
chmod 600 "$INSTALLER_KUBECONFIG"

Команда не создаёт новые сертификаты. Параметр --flatten читает CA, клиентский сертификат и ключ по путям из исходного kubeconfig и встраивает их в новый файл.

Проверьте копию:

d8 k --kubeconfig="$INSTALLER_KUBECONFIG" auth whoami
d8 k --kubeconfig="$INSTALLER_KUBECONFIG" auth can-i '*' '*' --all-namespaces

Вторая команда должна вывести yes.

Посмотрите адрес Kubernetes API:

d8 k --kubeconfig="$INSTALLER_KUBECONFIG" config view --minify -o jsonpath='{.clusters[0].cluster.server}{"\n"}'

Этот адрес должен быть доступен из Docker-контейнера. Предпочтительный вариант — доступный по сети адрес Kubernetes API, VPN или адрес балансировщика.

Если указан https://127.0.0.1:6443, установщик не сможет использовать его напрямую: внутри контейнера 127.0.0.1 указывает на сам контейнер. Сначала организуйте доступ контейнера к Kubernetes API и только затем продолжайте установку.

Создание файла конфигурации

Создайте файл $CONFIG_FILE со следующим содержимым и замените example.com на свой домен:

apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: deckhouse
spec:
  version: 1
  enabled: true
  settings:
    bundle: Managed
    releaseChannel: EarlyAccess
    logLevel: Info
---
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: global
spec:
  version: 2
  settings:
    modules:
      publicDomainTemplate: "%s.example.com"

Домен в publicDomainTemplate не должен совпадать с доменом, указанным в clusterDomain, или быть его поддоменом. Перед использованием шаблона настройте DNS-сервисы в сетях, где расположены узлы кластера, и в сетях, из которых клиенты обращаются к веб-интерфейсам сервисов платформы.

Если на узлах есть нестандартные taints и компоненты DP должны на них запускаться, добавьте соответствующие значения в global.spec.settings.modules.placement.customTolerationKeys. Не добавляйте примерный taint, если его нет в кластере.

Проверьте файл:

yq eval-all '.' "$CONFIG_FILE" >/dev/null && echo "YAML OK"
grep -n $'\t' "$CONFIG_FILE"

Первая команда должна вывести YAML OK, вторая — ничего.

Запуск установщика Deckhouse Platform Open

Тег установщика должен соответствовать releaseChannel в конфигурации. Для EarlyAccess используется тег early-access.

Проверьте наличие файлов:

ls -l "$CONFIG_FILE" "$INSTALLER_KUBECONFIG"

Запустите установщик:

docker run --pull=always -it -v "$CONFIG_FILE:/config.yml:ro" -v "$INSTALLER_KUBECONFIG:/kubeconfig:ro" registry.deckhouse.ru/deckhouse/ce/install:early-access bash

Путь образа установщика пока использует обозначение ce для Deckhouse Platform Open.

Внутри открывшегося контейнера запустите:

dhctl bootstrap-phase install-deckhouse --kubeconfig=/kubeconfig --config=/config.yml

Не закрывайте терминал до завершения бутстрапа. Установка может занимать от 5 до 30 минут.

Наблюдение за установкой

В отдельном терминале перейдите в тот же рабочий каталог и снова задайте переменные из раздела «Настройка рабочих путей». Выполните команду:

d8 k --kubeconfig="$ADMIN_KUBECONFIG" -n d8-system get deployment,replicaset,pods -w

Если под deckhouse не создаётся, посмотрите события:

d8 k --kubeconfig="$ADMIN_KUBECONFIG" -n d8-system get events --sort-by=.metadata.creationTimestamp

Ошибки ImagePullBackOff, ErrImagePull, 401 Unauthorized или 403 Forbidden обычно означают проблему с адресом хранилища образов контейнеров, доступом к нему, DNS или маршрутизацией.

Для диагностики конкретного пода используйте:

d8 k --kubeconfig="$ADMIN_KUBECONFIG" -n <NAMESPACE> describe pod <POD_NAME>

Проверка результата установки

Дождитесь готовности основного Deployment:

d8 k --kubeconfig="$ADMIN_KUBECONFIG" -n d8-system rollout status deployment/deckhouse --timeout=10m
d8 k --kubeconfig="$ADMIN_KUBECONFIG" -n d8-system get deployment,pods -o wide

Проверьте модули:

d8 k --kubeconfig="$ADMIN_KUBECONFIG" get modules -o wide

У включённых модулей ожидаются PHASE: Ready, ENABLED: True и READY: True.

Статуса Module недостаточно: он может быть Ready, даже если отдельный Deployment, StatefulSet или DaemonSet модуля не был создан или перезапускается. Проверьте реальные ресурсы:

d8 k --kubeconfig="$ADMIN_KUBECONFIG" get deployment,statefulset,daemonset -A

У DaemonSet значения DESIRED, CURRENT и READY должны совпадать. У Deployment и StatefulSet ожидаемое количество реплик должно быть готово.

Найдите поды, которые не находятся в фазе Running или Succeeded:

d8 k --kubeconfig="$ADMIN_KUBECONFIG" get pods -A --field-selector='status.phase!=Running,status.phase!=Succeeded'

Проверьте актуальные предупреждения:

d8 k --kubeconfig="$ADMIN_KUBECONFIG" get events -A --field-selector=type=Warning --sort-by=.metadata.creationTimestamp

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

Проверка, что DP не управляет компонентами Talos

Проверьте, что модули DP, которые могут управлять компонентами Talos, остаются выключенными.

d8 k --kubeconfig="$ADMIN_KUBECONFIG" get modules control-plane-manager node-manager terraform-manager cni-cilium kube-dns kube-proxy registry-packages-proxy -o wide

Все перечисленные модули должны иметь ENABLED: False.

Проверьте модули облачных провайдеров:

d8 k --kubeconfig="$ADMIN_KUBECONFIG" get modules -o wide | grep -E '(^NAME|^cloud-provider-)'

Все найденные модули cloud-provider-* должны иметь ENABLED: False.

Повторно проверьте исходные компоненты:

d8 k --kubeconfig="$ADMIN_KUBECONFIG" -n kube-system get pods -o wide

d8 k --kubeconfig="$ADMIN_KUBECONFIG" get nodes -o wide

Все Talos-узлы должны оставаться Ready, а исходные CNI, CoreDNS и компоненты control plane — продолжать работать. Если kube-proxy использовался до установки DP, он также должен продолжать работать.

Критерии успешной установки

Установка считается успешной, если одновременно выполняются следующие условия:

  • все Talos-узлы остались Ready;
  • исходные CNI и CoreDNS продолжают работать, а kube-proxy — если он использовался до установки DP;
  • Deployment deckhouse готов;
  • включённые модули имеют READY: True;
  • реальные Deployment, StatefulSet и DaemonSet модулей готовы;
  • модули DP, которые могут управлять компонентами Talos, остаются выключенными;
  • административный доступ через Talos admin kubeconfig сохранён.

Дополнительные ресурсы