Настройки образов, публикации IDE и постоянного тома находятся в main.tf стартового шаблона рабочего пространства. Примеры меняют значения в существующем блоке locals; второй блок с теми же именами добавлять не требуется.
Образы из закрытого хранилища
Чтобы под рабочего пространства скачивал закрытые образы, создайте в целевом неймспейсе Secret типа kubernetes.io/dockerconfigjson. Например, используя подготовленный Docker config без размещения пароля в командной строке:
d8 k -n team-workspaces create secret generic workspace-registry --type=kubernetes.io/dockerconfigjson --from-file=.dockerconfigjson=/secure/path/config.jsonЗамените team-workspaces на «Namespace» шаблона, а путь — на файл с доступом к нужному хранилищу образов. Учётная запись, выполняющая команду, должна иметь право создавать Secret в этом неймспейсе.
В main.tf замените значение:
image_pull_secrets = ["workspace-registry"]Для нескольких хранилищ укажите несколько названий Secrets. Стартовый шаблон добавит их в imagePullSecrets пода, включая скачивание образа init-контейнера.
Сохраните, опубликуйте и активируйте шаблон, затем создайте пространство. В «Диагностике» проверьте, что под скачал образы и контейнеры перешли в готовое состояние.
Secrets для Jobs операций
Jobs OpenTofu и поды рабочих пространств используют отдельные настройки скачивания образов. При установке модулем Jobs работают в d8-development-platform; дополнительные Secrets для них задаются в spec.settings.imagePullSecrets ModuleConfig:
imagePullSecrets:
- operations-registrySecret operations-registry должен существовать в d8-development-platform. Эта настройка не создаёт Secret в целевом кластере и не заполняет local.image_pull_secrets шаблона. Подготовьте оба места, если закрытые образы используются для Jobs и рабочих пространств.
Публикация IDE
IDE каждого рабочего пространства публикуется на собственном HTTPS-хосте. Приложения и опубликованные порты получают соседние хосты, например terminal-ddp-ws-<суффикс>.example-workspaces.com и p1-ddp-ws-<суффикс>.example-workspaces.com. Для домена example-workspaces.com стартовый шаблон создаёт адрес вида https://ddp-ws-<суффикс>.example-workspaces.com.
Домен рабочих пространств должен быть отдельным от родительского домена DDP и Dex, для которого браузер допускает cookie. Например, при портале ddp.example.com используйте example-workspaces.com; адреса под ide.example.com этого разделения не обеспечивают.
Перед запуском подготовьте wildcard-запись *.example-workspaces.com, которая указывает на ingress-контроллер целевого кластера. В main.tf задайте:
ide_domain = "example-workspaces.com"
ingress_class = "nginx"
ide_tls_secret = "workspace-ide-tls"
ingress_annotations = {
"nginx.ingress.kubernetes.io/proxy-read-timeout" = "3600"
"nginx.ingress.kubernetes.io/proxy-send-timeout" = "3600"
}Замените nginx на существующий IngressClass. Значение null выбирает класс по умолчанию. Secret workspace-ide-tls должен находиться в неймспейсе шаблона и содержать сертификат для *.example-workspaces.com с доверенной браузером цепочкой.
Wildcard-сертификат покрывает IDE, приложения и адреса портов. При изменении правил Ingress сохраните все хосты из local.app_hosts и local.slot_hosts, их TLS и маршрут через шлюз. Схема адресов описана в настройке приложений.
Аннотации в примере предназначены для ingress-nginx и увеличивают тайм-ауты длительных соединений IDE. Для другого контроллера задайте поддерживаемые им аннотации.
Созданный Ingress направляет трафик в контейнер проверки доступа gate, который пропускает сессию, открытую через портал. Сохраняйте этот маршрут при изменении Ingress. Публикация code-server напрямую обходит проверку доступа.
Если ingress-контроллер уже выдаёт подходящий сертификат по умолчанию, задайте ide_tls_secret = null. Проверьте, что браузер доверяет сертификату именно для хоста пространства.
Выдача сертификата через cert-manager
При установленном cert-manager и настроенном ClusterIssuer можно получать сертификат для каждого пространства, включающий хост IDE, хосты приложений и все зарезервированные адреса портов. Замените значения в main.tf:
ide_domain = "example-workspaces.com"
ingress_class = "nginx"
ide_tls_secret = "${local.name}-ide-tls"
ingress_annotations = {
"cert-manager.io/cluster-issuer" = "letsencrypt-production"
"nginx.ingress.kubernetes.io/proxy-read-timeout" = "3600"
"nginx.ingress.kubernetes.io/proxy-send-timeout" = "3600"
}Замените letsencrypt-production на свой ClusterIssuer и обеспечьте условия его проверки домена. После создания пространства дождитесь выдачи сертификата и проверьте открытие IDE через портал.
Cert-manager может сохранять выпущенный Secret после удаления пространства. Если требуется автоматическое удаление сертификатных Secrets вместе с Certificate, настройте cert-manager с --enable-certificate-owner-ref; иначе включите очистку таких Secrets в процедуры обслуживания.
Хранение данных
Стартовый шаблон создаёт постоянный том с режимом ReadWriteOnce. Репозиторий находится в /workspace/code, состояние агента — в /workspace/state; оба пути размещены на этом томе.
Для выбора существующего StorageClass замените значение в main.tf:
storage_class = "fast-ssd"Значение null использует StorageClass по умолчанию. Размер задаёт переменная storage_size в variables.tf. Для начального размера 20Gi и вариантов выбора замените существующий блок:
variable "storage_size" {
description = "Размер тома рабочего пространства"
type = string
default = "20Gi"
validation {
condition = contains(["20Gi", "50Gi", "100Gi"], var.storage_size)
error_message = "Выберите 20Gi, 50Gi или 100Gi."
}
}Новое пространство получит выбранный объём. Расширение существующего PVC зависит от StorageClass и возможностей кластера. Не уменьшайте объём и не меняйте класс существующего тома: операция, которая требует удаления или замены тома, отклоняется порталом.
Остановка сохраняет том; удаление пространства удаляет его постоянные данные. Учитывайте также политику освобождения томов самого StorageClass.
Проверка результата
После изменения шаблона проверьте черновик в новом рабочем пространстве:
- На вкладке «Операции» дождитесь успешного применения OpenTofu.
- В «Диагностике» проверьте скачивание образов, готовность контейнеров и постоянного тома.
- Нажмите «Открыть IDE» и проверьте сертификат и работу терминала.
- Создайте файл в рабочей директории, остановите и снова запустите пространство. Файл должен сохраниться.
После проверки опубликуйте и активируйте версию. Для существующих пространств примените обновление версии.