В этом руководстве описано, как развернуть кластер Deckhouse Kubernetes Platform в закрытом окружении без прямого доступа к хранилищу образов контейнеров DKP (registry.deckhouse.ru) и внешним репозиториям deb/rpm-пакетов, используемых на узлах поддерживаемых операционных систем.
Обратите внимание, что установка DKP в закрытом окружении доступна в следующих редакциях: SE, SE+, EE, CSE Lite, CSE Pro.
Особенности закрытого окружения
Установка в закрытом окружении практически не отличается от установки на bare metal.
Ключевые особенности:
- Параметры прокси-сервера, задаваемые в конфигурации кластера при установке, автоматически транслируются в переменные окружения
HTTP_PROXY,HTTPS_PROXYиNO_PROXYдля узлов кластера и компонентов DKP. Пользовательские приложения (поды) не получают эти переменные из конфигурации кластера автоматически. Чтобы обеспечить им доступ в Интернет через прокси, необходимо явно задать переменные окружения (HTTP_PROXY,HTTPS_PROXYи, при необходимости,NO_PROXY) в манифестах. В зависимости от корпоративных политик доступ для приложений может быть организован и другими способами — например, через открытие прямого доступа для узлов. - container registry с образами контейнеров DKP разворачивается отдельно с доступом изнутри контура, а в кластере настраивается его использование и необходимые права доступа.
Взаимодействие с узлами кластера, как правило, осуществляется через отдельный физический сервер или виртуальную машину — bastion-хост. Прокси для доступа к внешним ресурсам из внутреннего контура разворачивается в соответствии с сетевой политикой и архитектурой инфраструктуры. В зависимости от требований он может быть размещён как на bastion-хосте, так и на отдельной машине. Приватный container registry рекомендуется размещать на отдельной виртуальной машине или сервере во внутренней сети. Совмещение registry с bastion-хостом в продуктивных средах не рекомендуется. Исключение могут составлять учебные или упрощённые стенды для ограниченных задач.
В зависимости от принятых в компании политик безопасности доступ к внешним ресурсам может отсутствовать полностью. В таких случаях прокси-сервер для выхода во внешние сети не используется. Необходимые внешние зависимости (например, архив с образами контейнеров DKP) доставляются в контур на требуемую виртуальную машину любым разрешённым способом — например, с использованием съёмных носителей.
Общая схема закрытого окружения:

На схеме также показан внутренний репозиторий пакетов ОС. Он используется для установки пакетов на узлы в случае, если доступ к официальным репозиториям отсутствует даже через прокси. Во многих закрытых контурах уже развернуты собственные репозитории пакетов ОС, и установка выполняется из них — в этом случае прокси-сервер для работы с пакетами не требуется. Прокси-сервер используется для других типов трафика:
- загрузка образов контейнеров с публичного registry DKP на bastion-хост;
- обращения компонентов DKP и узлов к внешним ресурсам (если такие обращения разрешены политикой безопасности);
- при необходимости — доступ приложений в подах к внешним сервисам.
Выбор инфраструктуры
В данном руководстве описывается развёртывание в закрытом окружении кластера, состоящего из одного master-узла и одного worker-узла.
Для выполнения работ потребуются:
- персональный компьютер, с которого будут выполняться операции;
- отдельный физический сервер или виртуальная машина Bastion (bastion-хост);
- отдельный физический сервер или виртуальная машина под container registry;
- при необходимости физический сервер или виртуальная машина под прокси-сервер;
- два физических сервера или две виртуальные машины под узлы кластера.
Требования к серверам:
- Bastion — не менее 4 ядер CPU, 8 ГБ ОЗУ, 150 ГБ на быстром диске. Такой объём дискового пространства необходим, поскольку на bastion-хосте временно хранятся все образы DKP, используемые при установке. Перед загрузкой в приватный container registry образы скачиваются с публичного registry DKP на bastion-хост, после чего упаковываются в архивы. Эти операции требуют значительного объёма свободного места.
- ВМ под приватный registry — не менее 4 ядер CPU, 8 ГБ ОЗУ и не менее 150 ГБ на быстром диске для хранения образов DKP. Требуемый объём дискового пространства рекомендуется планировать с запасом, ориентируясь на размер бандла после выполнения команды
d8 mirror push. - Узлы кластера — ресурсы под будущие узлы кластера выбираются исходя из требований к планируемой нагрузке. Для примера подойдёт минимально рекомендуемая конфигурация — 4 ядра CPU, 8 ГБ ОЗУ и 60 ГБ на быстром диске (400+ IOPS) на каждый узел.
Подготовка приватного container registry
DKP поддерживает только Bearer token-схему авторизации в container registry.
В качестве приватного container registry можно использовать любой из поддерживаемых. Протестирована и гарантируется работа со следующими container registry — Nexus, Harbor, Artifactory, Docker Registry, Quay.
В рамках этого руководства будет для примера использован Harbor. Он поддерживает настройку политик и управление доступом на основе ролей (RBAC), выполняет проверку образов на уязвимости и позволяет помечать доверенные артефакты. Harbor входит в состав проектов CNCF.
Установка Harbor
Установите последнюю версию Harbor из GitHub-репозитория проекта. Для этого скачайте архив с установщиком из нужного релиза, выбрав вариант с harbor-offline-installer в названии.

Скопируйте адрес ссылки. Например, для версии harbor-offline-installer-v2.14.1.tgz ссылка будет выглядеть следующим образом: https://github.com/goharbor/harbor/releases/download/v2.14.1/harbor-offline-installer-v2.14.1.tgz.
Подключитесь по SSH к виртуальной машине, на которой будет развёрнут Harbor, и скачайте архив любым удобным способом. Если у этой ВМ нет прямого доступа в Интернет, скачайте архив на рабочей машине или на bastion-хосте, а затем перенесите его на ВМ с Harbor.
Распакуйте скачанный архив (укажите имя архива):
tar -zxf ./harbor-offline-installer-v2.14.1.tgz
В полученной директории harbor расположены файлы, необходимые для установки.
Установите на эту же ВМ Docker и плагин Docker Compose. Они потребуются для настройки доступа к registry по TLS, а также для запуска установщика Harbor.
Перед развёртыванием хранилища сгенерируйте самоподписанный (self-signed) TLS-сертификат.
Из-за ограничений доступа в закрытом окружении невозможно получить сертификаты, например, от Let’s Encrypt, так как сервис не сможет выполнить проверку, необходимую для выдачи сертификата.
Существует несколько способов генерации сертификатов. В этом руководстве приведён один из вариантов. При необходимости используйте другой подходящий способ или разместите уже имеющийся сертификат.
Создайте директорию certs в директории harbor:
cd harbor/
mkdir certs
Перейдите в созданную директорию и сгенерируйте сертификаты для внешнего доступа следующими командами:
openssl genrsa -out ca.key 4096
openssl req -x509 -new -nodes -sha512 -days 3650 -subj "/C=RU/ST=Moscow/L=Moscow/O=example/OU=Personal/CN=myca.local" -key ca.key -out ca.crt
Сгенерируйте сертификаты для внутреннего доменного имени harbor.example, чтобы внутри приватной сети обращаться к ВМ с Harbor по защищённому соединению.
В приведённых ниже командах замените <INTERNAL_IP_ADDRESS> на внутренний IP-адрес виртуальной машины с Harbor. Этот адрес используется узлами кластера и другими сервисами для доступа к container registry из закрытого контура.
openssl genrsa -out harbor.example.key 4096
openssl req -sha512 -new -subj "/C=RU/ST=Moscow/L=Moscow/O=example/OU=Personal/CN=harbor.example" -key harbor.example.key -out harbor.example.csr
cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid, issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
IP.1=<INTERNAL_IP_ADDRESS>
DNS.1=harbor.example
EOF
openssl x509 -req -sha512 -days 3650 -extfile v3.ext -CA ca.crt -CAkey ca.key -CAcreateserial -in harbor.example.csr -out harbor.example.crt
openssl x509 -inform PEM -in harbor.example.crt -out harbor.example.cert
Проверьте, что все сертификаты созданы успешно:
ls -la
Далее настройте Docker для работы с приватным container registry, доступ к которому выполняется по TLS. Для этого создайте директорию harbor.example в /etc/docker/certs.d/:
sudo mkdir -p /etc/docker/certs.d/harbor.example
Параметр
-pуказывает утилитеmkdirсоздать родительские директории, если они отсутствуют (в данном случае — директориюcerts.d).
Скопируйте в неё созданные сертификаты:
cp ca.crt /etc/docker/certs.d/harbor.example/
cp harbor.example.cert /etc/docker/certs.d/harbor.example/
cp harbor.example.key /etc/docker/certs.d/harbor.example/
Эти сертификаты будут использоваться при обращении к registry по доменному имени harbor.example.
Скопируйте шаблон конфигурационного файла, который поставляется вместе с установщиком:
cp harbor.yml.tmpl harbor.yml
Измените в harbor.yml следующие параметры:
hostname— укажитеharbor.example(для него генерировались сертификаты);certificate— укажите путь к сгенерированному сертификату в директорииcerts(например,/home/ubuntu/harbor/certs/harbor.example.crt);private_key— укажите путь к приватному ключу (например,/home/ubuntu/harbor/certs/harbor.example.key);harbor_admin_password— задайте пароль для доступа в веб-интерфейс.
Сохраните файл.
Запустите скрипт установки:
./install.sh
Начнётся установка Harbor — будут подготовлены необходимые образы и запущены контейнеры.
Проверьте, что Harbor успешно запущен:
docker ps
Добавьте в файл /etc/hosts на ВМ с Harbor ассоциацию доменного имени harbor.example с localhost, чтобы можно было обращаться к Harbor по этому имени с этой же машины:
127.0.0.1 localhost harbor.example
В некоторых облачных провайдерах (например, Yandex Cloud) изменения в /etc/hosts могут быть сброшены после перезагрузки виртуальной машины. Сообщение об этом обычно указано в начале файла /etc/hosts.
# Your system has configured 'manage_etc_hosts' as True.
# As a result, if you wish for changes to this file to persist
# then you will need to either
# a.) make changes to the master file in /etc/cloud/templates/hosts.debian.tmpl
# b.) change or remove the value of 'manage_etc_hosts' in
# /etc/cloud/cloud.cfg or cloud-config from user-data
Если у вашего провайдера действует такая схема, внесите соответствующие изменения также в файл шаблона, указанный в комментарии, чтобы настройки сохранялись после перезагрузки.
На этом установка Harbor завершена! 🎉
Настройка Harbor
Создайте проект и пользователя, от имени которого будет выполняться работа с этим проектом.
Откройте веб-интерфейс Harbor по адресу harbor.example. Обратите внимание — доступ к этому интерфейсу из внешней сети закрыт, подключение возможно только с узла, имеющего доступ к внутреннему контуру.

Чтобы открыть Harbor по доменному имени harbor.example с рабочего компьютера, добавьте соответствующую запись в файл /etc/hosts, указав внутренний IP-адрес ВМ с Harbor.
Для входа в интерфейс воспользуйтесь логином и паролем, указанными в конфигурационном файле harbor.yml.

Браузер может предупреждать о самоподписанном сертификате и считать соединение «небезопасным». Для закрытого окружения это ожидаемо и допустимо. При необходимости добавьте сертификат в хранилище доверенных сертификатов браузера или операционной системы, чтобы убрать предупреждения.
Создайте новый проект. Для этого нажмите на кнопку «Новый проект» и введите его название: deckhouse. Остальные настройки оставьте без изменений.

Создайте robot-account для этого проекта. Это специальный тип учетной записи, привязанный к проекту и предназначенный для автоматизации операций. Такой аккаунт не имеет доступа к веб-интерфейсу и используется исключительно для работы через Docker CLI или Helm CLI.
Перейдите в созданный проект и откройте вкладку «Аккаунты роботов». Нажмите кнопку «Создать новый аккаунт робота»:

Укажите имя аккаунта, краткое описание (если нужно) и срок жизни (можно выбрать в днях или поставить бессрочный):

Для обеспечения корректной работы необходимо предоставить аккаунту полный доступ в разделе «Repository». Остальные параметры можно настроить по желанию либо в соответствии с требованиями ИБ.

После создания аккаунта Harbor покажет секрет доступа (токен).
Сохраните секрет доступа сразу — позже Harbor больше не отобразит его, и получить его повторно будет невозможно.

На этом настройка Harbor завершена! 🎉
Копирование образов DKP в приватный container registry
Следующим шагом необходимо скопировать образы компонентов DKP из публичного registry Deckhouse Kubernetes Platform в Harbor.
Для дальнейших действий в этом разделе потребуется утилита Deckhouse CLI. Установите её на тот хост, с которого будут выполняться работы по переносу образов DKP в приватный registry. Для примера из этого руководства это bastion-хост. Инструкция по установке CLI — в документации.
Загрузка образов занимает продолжительное время. Чтобы не потерять прогресс при разрыве SSH-соединения, запускайте команды в сессии tmux или screen. В случае обрыва соединения вы сможете переподключиться к сессии и продолжить работу, не начиная процесс заново. Обе утилиты обычно доступны в репозиториях дистрибутивов Linux и устанавливаются через пакетный менеджер.
Скачайте образы DKP в выделенную директорию, используя команду d8 mirror pull.
По умолчанию d8 mirror pull скачивает только актуальные версии DKP, базы данных сканера уязвимостей (если они входят в редакцию DKP) и официально поставляемых модулей.
Выполните следующую команду, чтобы скачать образы актуальных версий. Перед запуском подставьте вместо плейсхолдеров свои данные: <EDITION>, <LICENSE_KEY> и при необходимости путь к директории:
d8 mirror pull \
--source='registry.deckhouse.ru/deckhouse/<EDITION>' \
--license='<LICENSE_KEY>' /home/ubuntu/d8-bundle
где:
--source— адрес хранилища образов Deckhouse;<EDITION>— код редакции Deckhouse Kubernetes Platform (например,ee,se,se-plus). По умолчанию используется значениеee(Enterprise Edition), поэтому параметр--sourceможно не указывать;--license— параметр для указания лицензионного ключа Deckhouse Kubernetes Platform для аутентификации в официальном хранилище образов;<LICENSE_KEY>— лицензионный ключ Deckhouse Kubernetes Platform;/home/ubuntu/d8-bundle— директория для размещения загруженных пакетов образов. Если она не существует, будет создана автоматически.
Если загрузка образов будет прервана, повторный вызов команды продолжит загрузку, если с момента её остановки прошло не более суток.
В зависимости от скорости интернет-соединения процесс может занять от 30 до 40 минут.
Проверьте, что все архивы успешно созданы:
$ ls -lh
итого 51G
-rw-rw-r-- 1 zhbert zhbert 4,8K фев 26 17:19 deckhousereleases.yaml
-rw-rw-r-- 1 zhbert zhbert 4,9G фев 26 18:30 module-code.tar
-rw-rw-r-- 1 zhbert zhbert 17M фев 26 18:30 module-commander-agent.tar
-rw-rw-r-- 1 zhbert zhbert 1008M фев 26 18:30 module-commander.tar
-rw-rw-r-- 1 zhbert zhbert 172M фев 26 18:30 module-console.tar
-rw-rw-r-- 1 zhbert zhbert 225M фев 26 18:31 module-csi-ceph.tar
-rw-rw-r-- 1 zhbert zhbert 1,1G фев 26 18:30 module-csi-hpe.tar
-rw-rw-r-- 1 zhbert zhbert 1,1G фев 26 18:30 module-csi-huawei.tar
-rw-rw-r-- 1 zhbert zhbert 170M фев 26 18:30 module-csi-netapp.tar
-rw-rw-r-- 1 zhbert zhbert 188M фев 26 18:30 module-csi-nfs.tar
-rw-rw-r-- 1 zhbert zhbert 555M фев 26 18:30 module-csi-s3.tar
-rw-rw-r-- 1 zhbert zhbert 544M фев 26 18:31 module-csi-scsi-generic.tar
-rw-rw-r-- 1 zhbert zhbert 207M фев 26 18:30 module-csi-yadro-tatlin-unified.tar
-rw-rw-r-- 1 zhbert zhbert 85M фев 26 18:31 module-development-platform.tar
-rw-rw-r-- 1 zhbert zhbert 146M фев 26 18:30 module-managed-memcached.tar
-rw-rw-r-- 1 zhbert zhbert 835M фев 26 18:31 module-managed-postgres.tar
-rw-rw-r-- 1 zhbert zhbert 113M фев 26 18:31 module-managed-valkey.tar
-rw-rw-r-- 1 zhbert zhbert 1,1G фев 26 18:31 module-neuvector.tar
-rw-rw-r-- 1 zhbert zhbert 3,4G фев 26 18:31 module-observability-platform.tar
-rw-rw-r-- 1 zhbert zhbert 600M фев 26 18:31 module-observability.tar
-rw-rw-r-- 1 zhbert zhbert 194M фев 26 18:30 module-operator-argo.tar
-rw-rw-r-- 1 zhbert zhbert 418M фев 26 18:30 module-operator-ceph.tar
-rw-rw-r-- 1 zhbert zhbert 705M фев 26 18:30 module-operator-postgres.tar
-rw-rw-r-- 1 zhbert zhbert 156M фев 26 18:30 module-operator-trivy.tar
-rw-rw-r-- 1 zhbert zhbert 60M фев 26 18:30 module-payload-registry.tar
-rw-rw-r-- 1 zhbert zhbert 15M фев 26 18:30 module-pod-reloader.tar
-rw-rw-r-- 1 zhbert zhbert 183M фев 26 18:30 module-prompp.tar
-rw-rw-r-- 1 zhbert zhbert 1022M фев 26 18:30 module-runtime-audit-engine.tar
-rw-rw-r-- 1 zhbert zhbert 78M фев 26 18:31 module-sdn.tar
-rw-rw-r-- 1 zhbert zhbert 179M фев 26 18:31 module-sds-local-volume.tar
-rw-rw-r-- 1 zhbert zhbert 157M фев 26 18:30 module-sds-node-configurator.tar
-rw-rw-r-- 1 zhbert zhbert 2,8G фев 26 18:30 module-sds-replicated-volume.tar
-rw-rw-r-- 1 zhbert zhbert 157M фев 26 18:30 module-secrets-store-integration.tar
-rw-rw-r-- 1 zhbert zhbert 51M фев 26 18:30 module-snapshot-controller.tar
-rw-rw-r-- 1 zhbert zhbert 37M фев 26 18:31 module-state-snapshotter.tar
-rw-rw-r-- 1 zhbert zhbert 24M фев 26 18:31 module-static-routing-manager.tar
-rw-rw-r-- 1 zhbert zhbert 41M фев 26 18:30 module-storage-volume-data-manager.tar
-rw-rw-r-- 1 zhbert zhbert 177M фев 26 18:31 module-stronghold.tar
-rw-rw-r-- 1 zhbert zhbert 1,5G фев 26 18:30 module-virtualization.tar
-rw-rw-r-- 1 zhbert zhbert 26G фев 26 17:50 platform.tar
-rw-rw-r-- 1 zhbert zhbert 1,3G фев 26 17:51 security.tar
Загрузите скачанные образы в приватный registry. В команде подставьте редакцию DKP и учётные данные robot-аккаунта Harbor:
<ROBOT_ACCOUNT_NAME>— имя robot-аккаунта;<PASSWORD>— токен, выданный при создании robot-аккаунта.
d8 mirror push $(pwd)/d8-bundle 'harbor.example:443/deckhouse/<РЕДАКЦИЯ_DKP>' --registry-login='robot$<ROBOT_ACCOUNT_NAME>' --registry-password='<PASSWORD>' --tls-skip-verify
Флаг
--tls-skip-verifyуказывает утилите доверять сертификату registry и пропустить его проверку.
Архив будет распакован, после чего образы будут загружены в registry. Этот этап обычно выполняется быстрее, чем скачивание, так как работа идёт с локальным архивом. Как правило, он занимает около 15 минут.
Проверить, что образы загружены, можно в веб-интерфейсе Harbor: откройте проект deckhouse в веб-интерфейсе Harbor.

Образы загружены и готовы к использованию! 🎉
Вход в registry для запуска установщика
Выполните вход на хост, с которого будет запускаться установщик (в примере — bastion-хост). На этой машине имя harbor.example должно разрешаться в адрес ВМ с Harbor (через запись в /etc/hosts или DNS).
На этом же хосте настройте доверие Docker к TLS-реестру аналогично разделу про Harbor: создайте каталог /etc/docker/certs.d/harbor.example/ и разместите в нём необходимые сертификаты. Их можно скопировать с ВМ с Harbor либо подготовить заново.
Выполните вход в registry Harbor, чтобы Docker получил доступ к образу установщика dhctl:
docker login harbor.example
Подготовка ВМ для будущих узлов
Требования к ВМ
Во время установки в качестве container runtime по умолчанию на узлах кластера используется ContainerdV2. Для его работы узлы должны соответствовать следующим требованиям:
- поддержка
CgroupsV2; - systemd версии
244; - поддержка модуля ядра
erofs.
Некоторые дистрибутивы (например, Astra Linux 1.7.4) не соответствуют этим требованиям, и ОС на узлах необходимо привести в соответствие требованиям перед установкой Deckhouse Kubernetes Platform. Подробнее — в документации.
Серверы для будущих узлов кластера должны соответствовать следующим требованиям:
- не менее 4 ядер CPU;
- не менее 8 ГБ RAM;
- не менее 60 ГБ дискового пространства на быстром диске (400+ IOPS);
- поддерживаемая ОС;
- ядро Linux версии
5.8или новее; - уникальный hostname в пределах всех серверов кластера (физических серверов и виртуальных машин);
-
наличие одного из пакетных менеджеров (
apt/apt-get,yumилиrpm).Важно: в РЕД ОС по умолчанию могут отсутствовать
yumиwhich, поэтому их необходимо заранее установить; - установленный Python;
- доступ к проксирующему registry или к приватному хранилищу образов контейнеров с образами Deckhouse;
- доступ к стандартным для используемой ОС репозиториям пакетов (через прокси-сервер или до внутреннего сервера-репозитория пакетов);
- SSH-доступ от сервера Bastion по ключу;
- сетевой доступ от сервера Bastion по порту
22/TCP; - на узле не должно быть установлено пакетов container runtime, например containerd или Docker.
Для правильного выбора ресурсов серверов ознакомьтесь с рекомендациями по подготовке к production и инструкцией по выбору типов и количества узлов кластера, а также ресурсов для них, в зависимости от ваших требований к эксплуатации будущего кластера.
Сопоставление harbor.example с адресом ВМ с Harbor
Чтобы серверы, на которых будут разворачиваться master и worker-узлы, могли получить доступ к приватному registry, настройте на них соответствие доменного имени harbor.example внутреннему IP-адресу ВМ с Harbor в приватной сети.
Для этого по очереди подключитесь к каждому серверу и добавьте запись в /etc/hosts (а при необходимости также в облачный шаблон, если провайдер управляет этим файлом).
<INTERNAL-IP-ADDRESS> harbor.example proxy.local
Не забудьте заменить
<INTERNAL-IP-ADDRESS>на реальный внутренний IP-адрес ВМ с Harbor.
Создание пользователя для master-узла
Для выполнения установки DKP создайте на будущем master-узле пользователя, под которым будет выполняться подключение и установка платформы.
Выполните команды от root (подставьте публичную часть своего SSH-ключа):
useradd deckhouse -m -s /bin/bash -G sudo
echo 'deckhouse ALL=(ALL) NOPASSWD: ALL' | sudo EDITOR='tee -a' visudo
mkdir /home/deckhouse/.ssh
export KEY='ssh-rsa AAAAB3NzaC1yc2EAAAADA...'
echo $KEY >> /home/deckhouse/.ssh/authorized_keys
chown -R deckhouse:deckhouse /home/deckhouse
chmod 700 /home/deckhouse/.ssh
chmod 600 /home/deckhouse/.ssh/authorized_keys
В результате этих команд:
- создаётся новый пользователь
deckhouse, который добавляется в группуsudo; - настраиваются права на повышение привилегий без ввода пароля;
- копируется публичная часть ключа, по которому можно будет войти на сервер под этим пользователем.
Проверьте подключение под новым пользователем:
ssh -J ubuntu@<BASTION_IP> deckhouse@<NODE_IP>
Если вход выполнен успешно, пользователь создан корректно.
Создание пользователя для worker-узла
Ниже описана подготовка узла для подключения через CAPS. Если вы предпочитаете добавлять статические узлы вручную с использованием bootstrap-скрипта, этот подраздел и последующие шаги с CAPS можно пропустить: создайте NodeGroup с типом Static, получите скрипт из секрета и выполните его на сервере, как описано в документации (ручной способ).
Сгенерируйте на master-узле SSH-ключ с пустой парольной фразой. Для этого выполните на master-узле следующую команду:
ssh-keygen -t rsa -f /dev/shm/caps-id -C "" -N ""
На подготовленном сервере для worker-узла создайте пользователя caps. Для этого выполните следующую команду, указав публичную часть SSH-ключа, полученную на предыдущем шаге:
# Укажите публичную часть SSH-ключа пользователя.
export KEY='<SSH-PUBLIC-KEY>'
useradd -m -s /bin/bash caps
usermod -aG sudo caps
echo 'caps ALL=(ALL) NOPASSWD: ALL' | sudo EDITOR='tee -a' visudo
mkdir /home/caps/.ssh
echo $KEY >> /home/caps/.ssh/authorized_keys
chown -R caps:caps /home/caps
chmod 700 /home/caps/.ssh
chmod 600 /home/caps/.ssh/authorized_keys
Подготовка конфигурационного файла
Конфигурационный файл для установки в закрытом окружении отличается от конфигурации для установки на bare-metal несколькими параметрами. Возьмите файл config.yml из четвёртого шага руководства по установке на bare-metal и внесите следующие изменения.
При необходимости доступа узлов кластера к внешним ресурсам через прокси прокси-сервер имеет смысл развернуть заранее. Для этого также рекомендуется использовать отдельную машину с доступом во внешнюю сеть.
-
В блоке
ClusterConfigurationукажите настройки прокси-сервера (если в контуре используется прокси для доступа к внешним ресурсам).# Настройки proxy-сервера. proxy: httpProxy: http://proxy.local:3128 httpsProxy: https://proxy.local:3128 noProxy: ["harbor.example", "proxy.local", "10.128.0.8", "10.128.0.32", "10.128.0.18"]Здесь указываются следующие параметры:
- адреса HTTP и HTTPS прокси-сервера;
- список доменов и IP-адресов, которые не будут проксироваться через прокси-сервер (внутренние доменные имена и внутренние IP-адреса всех серверов).
-
В секции
InitConfigurationдобавьте параметры доступа к registry:deckhouse: # Адрес Docker registry с образами Deckhouse (укажите редакцию DKP). imagesRepo: harbor.example/deckhouse/<РЕДАКЦИЯ_DKP> # Строка с ключом для доступа к Docker registry в формате Base64. registryDockerCfg: <DOCKER_CFG_BASE64> # Протокол доступа к registry (HTTP или HTTPS). registryScheme: HTTPS # Корневой сертификат, созданный ранее. # Получить его можно командой: `cat harbor/certs/ca.crt`. registryCA: | -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE-----Здесь
<DOCKER_CFG_BASE64>— строка авторизации из файла конфигурации Docker-клиента (в Linux обычно это$HOME/.docker/config.json) для доступа к стороннему container registry, закодированная в Base64.Например, для доступа к container registry
harbor.exampleпод пользователемuserс паролемP@ssw0rdэто будетeyJhdXRocyI6eyJoYXJib3IuZXhhbXBsZSI6eyJhdXRoIjoiZFhObGNqcFFRSE56ZHpCeVpBPT0ifX19(строка{"auths":{"harbor.example":{"auth":"dXNlcjpQQHNzdzByZA=="}}}в Base64). - В параметре releaseChannel ModuleConfig
deckhouseизмените наStableдля использования стабильного канала обновлений. -
В ModuleConfig global укажите использование самоподписанных сертификатов для компонентов кластера и укажите шаблон доменного имени для системных приложений в параметре
publicDomainTemplate:settings: modules: # Шаблон, который будет использоваться для составления адресов системных приложений в кластере. # Например, Grafana для %s.test.local будет доступна на домене 'grafana.test.local'. # Домен НЕ ДОЛЖЕН совпадать с указанным в параметре clusterDomain ресурса ClusterConfiguration. # Можете изменить на свой сразу, либо следовать шагам руководства и сменить его после установки. publicDomainTemplate: "%s.test.local" # Способ реализации протокола HTTPS, используемый модулями Deckhouse. https: certManager: clusterIssuerName: selfsignedПараметр
settings.modules.httpsв ModuleConfig/global поддерживает несколько режимов:CertManager— заказ сертификата у указанногоClusterIssuer(не обязательноselfsigned, можно задать свой издатель — корпоративный CA, HashiCorp Vault, Venafi и т. д., см. обзор в документации по сертификатам);CustomCertificate— готовая пара «сертификат + ключ» в Secret форматаkubernetes.io/tlsв пространстве имёнd8-system, при внешнем TLS-терминаторе возможен режимOnlyInURI. Сочетаниеselfsignedи отключение Let’s Encrypt в блоке выше показывает простой пример использования HTTPS в изолированном контуре без ACME/Let’s Encrypt. -
В ModuleConfig
user-authnизмените значение параметраdexCAModeнаFromIngressSecret:settings: controlPlaneConfigurator: dexCAMode: FromIngressSecret -
Добавьте включение и конфигурацию модуля cert-manager, в которой будет отключено использование Let’s Encrypt:
apiVersion: deckhouse.io/v1alpha1 kind: ModuleConfig metadata: name: cert-manager spec: version: 1 enabled: true settings: disableLetsencrypt: true -
В параметре internalNetworkCIDRs StaticClusterConfiguration укажите подсеть внутренних IP-адресов узлов кластера. Например:
internalNetworkCIDRs: - 10.128.0.0/24
Конфигурационный файл для установки подготовлен.
Установка DKP
Перенесите подготовленный конфигурационный файл на хост, с которого выполняется установка, например в директорию ~/deckhouse. Перейдите в директорию и запустите установщик командой:
docker run --pull=always -it -v "$PWD/config.yml:/config.yml" -v "$HOME/.ssh/:/tmp/.ssh/" --network=host -v "$PWD/dhctl-tmp:/tmp/dhctl" harbor.example/deckhouse/<РЕДАКЦИЯ_DKP>/install:stable bash
Если во внутренней сети нет локального DNS-сервера, и доменные имена прописаны в /etc/hosts на хосте, где запускается установщик, то обязательно укажите параметр --network=host, чтобы Docker смог ими воспользоваться.
После успешной загрузки и запуска контейнера вы увидите приглашение командной строки внутри контейнера:
[deckhouse] root@guide-bastion / #
Запустите установку DKP командой (укажите внутренний IP-адрес master-узла):
dhctl bootstrap --ssh-user=deckhouse --ssh-host=<master_ip> --ssh-agent-private-keys=/tmp/.ssh/id_rsa \
--config=/config.yml \
--ask-become-pass
Процесс установки может занять до 30 минут в зависимости от скорости сетевого соединения.
При успешном завершении установки вы увидите следующее сообщение:
┌ ⛵ ~ Bootstrap: Run post bootstrap actions
│ ┌ Set release channel to deckhouse module config
│ │ 🎉 Succeeded!
│ └ Set release channel to deckhouse module config (0.09 seconds)
└ ⛵ ~ Bootstrap: Run post bootstrap actions (0.09 seconds)
┌ ⛵ ~ Bootstrap: Clear cache
│ ❗ ~ Next run of "dhctl bootstrap" will create a new Kubernetes cluster.
└ ⛵ ~ Bootstrap: Clear cache (0.00 seconds)
🎉 Deckhouse cluster was created successfully!
Добавление узлов в кластер
Добавьте узел в кластер.
Для этого выполните следующие шаги:
-
Настройте StorageClass локального хранилища, выполнив на master-узле следующую команду:
sudo -i d8 k create -f - << EOF apiVersion: deckhouse.io/v1alpha1 kind: LocalPathProvisioner metadata: name: localpath spec: path: "/opt/local-path-provisioner" reclaimPolicy: Delete EOF -
Укажите, что созданный StorageClass должен использоваться как StorageClass по умолчанию. Для этого выполните на master-узле следующую команду:
sudo -i d8 k patch mc global --type merge \ -p "{\"spec\": {\"settings\":{\"defaultClusterStorageClass\":\"localpath\"}}}" -
Создайте NodeGroup
workerи добавьте узел с помощью Cluster API Provider Static (CAPS):sudo -i d8 k create -f - <<EOF apiVersion: deckhouse.io/v1 kind: NodeGroup metadata: name: worker spec: nodeType: Static staticInstances: count: 1 labelSelector: matchLabels: role: worker EOF -
Создайте в кластере ресурс SSHCredentials. Для этого выполните на master-узле следующую команду:
sudo -i d8 k create -f - <<EOF apiVersion: deckhouse.io/v1alpha2 kind: SSHCredentials metadata: name: caps spec: user: caps privateSSHKey: "`cat /dev/shm/caps-id | base64 -w0`" EOF -
Выведите публичную часть сгенерированного ранее SSH-ключа (он понадобится на следующем шаге). Для этого выполните на master-узле следующую команду:
cat /dev/shm/caps-id.pub -
Создайте StaticInstance для добавляемого узла. Для этого выполните на master-узле следующую команду, указав IP-адрес добавляемого узла:
# Укажите IP-адрес узла, который нужно подключить к кластеру. export NODE=<NODE-IP-ADDRESS> sudo -i d8 k create -f - <<EOF apiVersion: deckhouse.io/v1alpha2 kind: StaticInstance metadata: name: d8cluster-worker labels: role: worker spec: address: "$NODE" credentialsRef: kind: SSHCredentials name: caps EOF -
Убедитесь, что все узлы кластера находятся в статусе
Ready:$ sudo -i d8 k get no NAME STATUS ROLES AGE VERSION d8cluster Ready control-plane,master 30m v1.23.17 d8cluster-worker Ready worker 10m v1.23.17Запуск всех компонентов DKP после завершения установки может занять некоторое время.
Настройка Ingress-контроллера и создание пользователя
Установка ingress-контроллера
Убедитесь, что под Kruise controller manager модуля ingress-nginx запустился и находится в статусе Running. Для этого выполните на master-узле следующую команду:
$ sudo -i d8 k -n d8-ingress-nginx get po -l app=kruise
NAME READY STATUS RESTARTS AGE
kruise-controller-manager-7dfcbdc549-b4wk7 3/3 Running 0 15m
Создайте на master-узле файл ingress-nginx-controller.yml, содержащий конфигурацию Ingress-контроллера:
# Секция, описывающая параметры NGINX Ingress controller.
# https://deckhouse.ru/modules/ingress-nginx/cr.html
apiVersion: deckhouse.io/v1
kind: IngressNginxController
metadata:
name: nginx
spec:
# Имя Ingress-класса для обслуживания NGINX Ingress controller.
ingressClass: nginx
# Способ поступления трафика из внешнего мира.
inlet: HostPort
hostPort:
httpPort: 80
httpsPort: 443
# Описывает, на каких узлах будет находиться компонент.
# Возможно, захотите изменить.
nodeSelector:
node-role.kubernetes.io/control-plane: ""
tolerations:
- effect: NoSchedule
key: node-role.kubernetes.io/control-plane
operator: Exists
Примените его, выполнив на master-узле следующую команду:
sudo -i d8 k create -f $PWD/ingress-nginx-controller.yml
Запуск Ingress-контроллера после завершения установки DKP может занять некоторое время. Прежде чем продолжить, убедитесь, что Ingress-контроллер запустился (выполните на master-узле):
$ sudo -i d8 k -n d8-ingress-nginx get po -l app=controller
NAME READY STATUS RESTARTS AGE
controller-nginx-r6hxc 3/3 Running 0 5m
Создание пользователя для доступа в веб-интерфейсы кластера
Создайте на master-узле файл user.yml, содержащий описание учётной записи пользователя и прав доступа:
# Настройки RBAC и авторизации.
# https://deckhouse.ru/modules/user-authz/cr.html#clusterauthorizationrule
apiVersion: deckhouse.io/v1
kind: ClusterAuthorizationRule
metadata:
name: admin
spec:
# Список учётных записей Kubernetes RBAC.
subjects:
- kind: User
name: admin@deckhouse.io
# Предустановленный шаблон уровня доступа.
accessLevel: SuperAdmin
# Разрешить пользователю делать kubectl port-forward.
portForwarding: true
---
# Данные статического пользователя.
# https://deckhouse.ru/modules/user-authn/cr.html#user
apiVersion: deckhouse.io/v1
kind: User
metadata:
name: admin
spec:
# E-mail пользователя.
email: admin@deckhouse.io
# Это хеш пароля 3xqgv2auys, сгенерированного сейчас.
# Сгенерируйте свой или используйте этот, но только для тестирования:
# echo -n '3xqgv2auys' | htpasswd -BinC 10 "" | cut -d: -f2 | tr -d '\n' | base64 -w0; echo
# Возможно, захотите изменить.
password: 'JDJhJDEwJGtsWERBY1lxMUVLQjVJVXoxVkNrSU8xVEI1a0xZYnJNWm16NmtOeng5VlI2RHBQZDZhbjJH'
Примените его, выполнив на master-узле следующую команду:
sudo -i d8 k create -f $PWD/user.yml
Настройка DNS-записей
Для доступа к веб-интерфейсам кластера настройте соответствие следующих доменных имён внутреннему IP-адресу master-узла (используйте DNS-имена в соответствии с шаблоном DNS-имён, указанным в параметре publicDomainTemplate). Например, можно прописать их в /etc/hosts на локальной машине для шаблона DNS-имён %s.test.local. Перед выполнением замените плейсхолдер <MASTER_IP> на внутренний IP-адрес master-узла:
export PUBLIC_IP="<MASTER_IP>"
sudo -E bash -c "cat <<EOF >> /etc/hosts
$PUBLIC_IP api.test.local
$PUBLIC_IP code.test.local
$PUBLIC_IP commander.test.local
$PUBLIC_IP registry.test.local
$PUBLIC_IP console.test.local
$PUBLIC_IP dex.test.local
$PUBLIC_IP documentation.test.local
$PUBLIC_IP grafana.test.local
$PUBLIC_IP hubble.test.local
$PUBLIC_IP istio.test.local
$PUBLIC_IP istio-api-proxy.test.local
$PUBLIC_IP kubeconfig.test.local
$PUBLIC_IP openvpn-admin.test.local
$PUBLIC_IP prometheus.test.local
$PUBLIC_IP status.test.local
$PUBLIC_IP tools.test.local
$PUBLIC_IP upmeter.test.local
EOF
"
Проверить, что кластер корректно развёрнут и работает, можно в веб-интерфейсе Grafana, где отображается состояние кластера. Адрес Grafana формируется по шаблону publicDomainTemplate. Например, при значении %s.test.local интерфейс будет доступен по адресу grafana.test.local. Для входа используйте учётные данные пользователя, созданного ранее.
Куда двигаться дальше?
Все установлено, настроено и работает! Теперь можно воспользоваться предоставляемыми веб-интерфейсами для управления кластером:
- Веб-интерфейс Deckhouse — управление кластером и основными компонентами. Адрес: console.test.local.
- Документация — документация по установленной в кластере версии DKP. Адрес: documentation.test.local.
- Мониторинг — дэшборды Grafana, поставляемые с DKP. Адрес: grafana.test.local (путь к Prometheus: /prometheus/). Подробнее в документации.
- Status page — общий статус DKP и его компонентов. Адрес: status.test.local.
- Upmeter — контроль соблюдения SLA с детализацией по компонентам и периодам. Адрес: upmeter.test.local.
- Подготовка к production — проверьте готовность кластера к приёму трафика по инструкции для подготовки к production.
Развёртывание первого приложения
- Настройка CI/CD — создайте ServiceAccount для развёртывания в кластере и выдайте ему права. В результате вы получите kubeconfig, который можно использовать в системах автоматизированного развёртывания в Kubernetes. Подробнее о настройке доступа для CI/CD в разделе «Доступ для CI/CD». Адрес: kubeconfig.test.local.
- Направление трафика на приложение — создайте Service и Ingress для приложения. Подробнее о возможностях сетевого взаимодействия в разделе «Обработка входящего трафика».
- Мониторинг приложения — добавьте к созданному Service аннотации
prometheus.deckhouse.io/custom-target: "my-app"иprometheus.deckhouse.io/port: "80". Подробнее о настройке мониторинга приложений в разделе «Мониторинг приложений и инфраструктур».
Что дальше?
Подробная информация о системе и компонентах Deckhouse Kubernetes Platform — в документации. По вопросам можно обратиться в онлайн-сообщество.