Настройки образов, публикации 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-registry

Secret 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.

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

После изменения шаблона проверьте черновик в новом рабочем пространстве:

  1. На вкладке «Операции» дождитесь успешного применения OpenTofu.
  2. В «Диагностике» проверьте скачивание образов, готовность контейнеров и постоянного тома.
  3. Нажмите «Открыть IDE» и проверьте сертификат и работу терминала.
  4. Создайте файл в рабочей директории, остановите и снова запустите пространство. Файл должен сохраниться.

После проверки опубликуйте и активируйте версию. Для существующих пространств примените обновление версии.