Стадия жизненного цикла модуля: Предварительная версия (preview)

У модуля есть требования для установки

Для использования образов из пользовательского хранилища внутри кластера DKP, в котором оно располагается, воспользуйтесь способами описанными ниже.

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

Для доступа к хранилищу образов используется Ingress, публикующий сервис по адресу payload-registry.${PUBLIC_DOMAIN}. Сертификат для HTTPS выпускается автоматически, в соответствии с настройками управления сертификатами.

В случае использования собственного удостоверяющего центра (CA) или иного CA, который не может быть проверен узлами кластера, необходимо добавить соответствующую конфигурацию для дополнительного хранилища образов. В противном случае узлы кластера не смогут загрузить образы из-за ошибки проверки сертификата.

Использование образов при аутентификации с помощью токенов Kubernetes

Подробнее об этом способе аутентификации — в разделе «Аутентификация с использованием токенов Kubernetes»

Для использования токенов Kubernetes в роли imagePullSecrets:

  1. Создайте ServiceAccount и выдайте ему права с использованием PayloadRepositoryAccess (подробнее — в разделе «RBAC и PayloadRepositoryAccess»). ServiceAccount должен явно разрешить выпуск токенов для загрузки образов с помощью аннотации payload-registry.deckhouse.io/allow-image-pull: "true":

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: my-pull-sa
      annotations:
        payload-registry.deckhouse.io/allow-image-pull: "true"

    Без аннотации allow-image-pull контроллер откажется выпускать токен для ServiceAccount: это не позволяет пользователю, который может только создавать секреты, сослаться на более привилегированный ServiceAccount и получить его токен.

  2. Создайте секрет, который будет использоваться как imagePullSecrets:

    apiVersion: v1
    kind: Secret
    metadata:
      name: my-pull-secret
      annotations:
        payload-registry.deckhouse.io/service-account.name: my-pull-sa
        # Необязательно: время жизни токена для этого секрета, в секундах (минимум 600).
        # Если не указано, используется значение по умолчанию модуля.
        # payload-registry.deckhouse.io/token-ttl: "3600"
    type: kubernetes.io/dockerconfigjson
    data:
      # Временное значение, которое будет перезаписано актуальными значениями.
      .dockerconfigjson: eyJhdXRocyI6e319

    Указанный секрет будет удалён автоматически при удалении соответствующего ServiceAccount.

    Если указанный в аннотации ServiceAccount не существует (например, секрет создан не в том неймспейсе), контроллер не удаляет секрет, а оставляет его и записывает на него событие Warning (ServiceAccountNotFound) с объяснением причины. Посмотреть события можно командой d8 k describe secret <имя>.

  3. Проверьте что данные в секрете обновились:

    d8 k get secret my-pull-secret -o yaml

    Пример вывода:

    apiVersion: v1
    kind: Secret
    metadata:
      name: my-pull-secret
      annotations:
        payload-registry.deckhouse.io/expires-at: "2026-03-06T02:14:19Z"
        payload-registry.deckhouse.io/hash: e3ba7bd9aeae15fdbce8ae1eed05f26732ebd82e4563115d34f335702071929e
        payload-registry.deckhouse.io/service-account.name: my-pull-sa
        payload-registry.deckhouse.io/service-account.uid: f847810d-bcdd-42b8-9f95-2c2d8d10bc8c
    type: kubernetes.io/dockerconfigjson
    data:
      # Значение, заполненное актуальными данными.
      .dockerconfigjson: ...
    

    Наличие аннотаций показывает что данные для доступа к хранилищу образов успешно добавлены и будут обновляться.

    По умолчанию данные в секрете действительны в течение 24 часов с момента последнего обновления. Время жизни можно задать для каждого секрета аннотацией payload-registry.deckhouse.io/token-ttl (в секундах, минимум 600). Время истечения срока действия указывается в аннотации payload-registry.deckhouse.io/expires-at. Данные обновляются за некоторое время до истечения срока действия.

  4. Добавьте imagePullSecrets к компоненту кластера и укажите образ:

    apiVersion: v1
    kind: Pod
    metadata:
      name: ubuntu
    spec:
      containers:
        - name: ubuntu
          image: payload-registry.${PUBLIC_DOMAIN}/project-1/ubuntu:latest
      imagePullSecrets:
        - name: my-pull-secret