[Документация Yandex Cloud](../../index.md) > [Yandex Cloud Marketplace](../index.md) > Партнерам > Концепции > Требования к продуктам Marketplace > Создание продукта для Managed Service for Kubernetes

# Создание продукта для Managed Service for Kubernetes

Чтобы добавить программный продукт для Managed Service for Kubernetes в Marketplace, его пакеты необходимо загрузить в [реестр](../../container-registry/concepts/registry.md) Yandex Cloud. Этот раздел поможет подготовить продукт Marketplace для Yandex Managed Service for Kubernetes.

Настройка доступа к продукту по [подписке](subscription.md) описана в разделе [Интеграция с License Manager API](../operations/license-manager-integration.md#managed-k8s).

Вы также можете создать продукты для Yandex Compute Cloud на базе ОС [Linux](compute-product.md), воспользовавшись соответствующими рекомендациями.

## Размещение и именование Docker-образов {#registry}

* [Helm-чарт](https://helm.sh/docs/topics/charts/) продукта и все Docker-образы, входящие в него, должны быть размещены в [реестре](../../container-registry/concepts/registry.md) издателя, созданном в Yandex Container Registry. Инструкции по [созданию реестра](../../container-registry/operations/registry/registry-create.md) и [загрузке Docker-образа](../../container-registry/operations/docker-image/docker-image-push.md) приведены в соответствующих разделах документации.

* Имя Helm-чарта продукта должно иметь вид:

   ```
   cr.yandexcloud.kz/<registry-id>/<vendor-name>/<product-name>/<chart>
   ```

   Где:

   * `<registry-id>` — идентификатор реестра издателя;
   * `<vendor-name>` — наименования компании-издателя продукта;
   * `<product-name>` — наименования продукта;
   * `<chart>` — название Helm-чарта.

* Имена Docker-образов продукта должны иметь вид:

   ```
   cr.yandexcloud.kz/<registry-id>/<vendor-name>/<product-name>/<component-name>:<tag>
   ```

   Где:

   * `<registry-id>` — идентификатор реестра издателя;
   * `<vendor-name>` — наименования компании-издателя продукта;
   * `<product-name>` — наименования продукта;
   * `<component-name>` — наименование компонента продукта, поставляемого в виде Docker-образа;
   * `<tag>` — тег Docker-образа. Не используйте тег `latest`.

По умолчанию во время публикации все Docker-образы, входящие в продукт, из реестра издателя перемещаются в публично доступный реестр `yc-marketplace`. При этом вся иерархия продукта, определенная издателем, сохраняется. Чтобы не перемещать Docker-образы в реестр `yc-marketplace`, используйте параметр `private_artifacts` в [спецификации продукта](#manifest).

> Например, Docker-образ `cr.yandexcloud.kz/b1gq90dgh25********/yandex-cloud/prometheus/pushgateway:1.0` будет опубликован под именем `cr.yandexcloud.kz/yc-marketplace/yandex-cloud/prometheus/pushgateway:1.0`.

Подробнее о работе с реестром в разделах [Загрузить Helm-чарт в реестр](../../container-registry/operations/helm-chart/helm-chart-push.md) и [Загрузить Docker-образ в реестр](../../container-registry/operations/docker-image/docker-image-push.md).


## Особенности сборки Helm-чарта {#special-requirements}

Helm-чарт должен содержать файл `values.yaml`, в котором в виде параметров будут перечислены все используемые Docker-образы. Имена Docker-образов в файле `values.yaml` должны начинаться с префикса `.Values` и указывать на Docker-образы, размещенные в реестре издателя, чтобы публикация и дальнейшая установка продукта в кластере пользователя прошли без ошибок.

{% note info %}

Marketplace устанавливает продукты для Managed Service for Kubernetes в кластеры, используя опцию `atomic` в Helm.

{% endnote %}

Все используемые Docker-образы должны быть заданы как `values` и перечислены в спецификации продукта. Это необходимо, так как в процессе публикации они будут перемещаться. Docker-образы, не указанные в спецификации продукта или описанные только в шаблонах, могут оказаться недоступны для пользователей при установке продукта — например, в кластер с особенностями конфигурации или без доступа в интернет.

Вы можете собирать в шаблоне указание на Docker-образ, например, меняя тег в зависимости от переменной. Чтобы это работало, в явном виде опишите в `values` и спецификации продукта все Docker-образы, которые могут понадобиться, а в шаблоне используйте ссылки на значения из `values`.

{% note warning %}

Для пространства имен `default` применяются более строгие политики безопасности, которые могут повлиять на работоспособность продукта. Если работа вашего продукта в `default` не гарантируется, необходимо указать в инструкции по развертыванию, что пользователь должен устанавливать его в другое пространство имен.

{% endnote %}


### Спецификация пода {#pod-spec}

Спецификация пода без параметров в общем виде:

```yaml
# pod spec
spec:
  containers:
  - image: cr.yandexcloud.kz/<registry-id>/<vendor-name>/<product-name>/<component-name>:<tag>
```

Спецификация пода, в котором имя Docker-образа заменено на переменную YAML path, описанную в файле `values.yaml`:

```yaml
# pod spec
spec:
  containers:
  - image: {{ .Values.images.pushgateway }}
```

```yaml
# values.yaml
images:
  pushgateway: cr.yandexcloud.kz/<registry-id>/<vendor-name>/<product-name>/<component-name>:<tag>
```


### Зависимые Helm-чарты {#dependent-charts}

Включайте зависимые Helm-чарты в состав родительского, используя пути относительно корня родительского Helm-чарта, например:

```yaml
# в Chart.yaml
dependencies:
  - name: redis
    version: 23.1.3
    repository: "file://charts/redis"  ## "oci://..." — нельзя.
  - name: common
    version: 2.0.0
    repository: "file://charts/common"
```

Docker-образы, используемые зависимыми Helm-чартами, должны быть параметризованы в `values.yaml` родительского Helm-чарта и описаны в спецификации продукта. Подробнее в статье [Scope, Dependencies, and Values](https://helm.sh/docs/topics/charts/#scope-dependencies-and-values).

Для удобства можно хранить Docker-образы в неплоской структуре реестра. `<chart>` и `<component-name>` могут содержать `/`, то есть иметь вложенные директории, поэтому должны выполняться условия:

* Helm-чарт находится в `cr.yandexcloud.kz/<registry-id>/<vendor-name>/<product-name>/<chart>`.
* Docker-образы находятся в `cr.yandexcloud.kz/<registry-id>/<vendor-name>/<product-name>/<component-name>:<tag>`.


### Пустое значение ключа {#empty-key}

При описании Helm-чартов в формате YAML вы можете использовать пустые значения для ключей в `values` и в то же время позволить задавать значение того же ключа в спецификации продукта.

По умолчанию пустое значение приравнивается к пустой строке. Если требуется не строка, а объект, то задавайте пустое значение таким образом:

```yaml
key: {}
```


## Внесение изменений в Helm-чарт {#update-helm-chart}

Helm-чарты кешируются на стороне бэкенда. Чтобы внести изменения в Helm-чарт, загрузите его заново с новым тегом и обновите тег в спецификации продукта.

Helm, в отличие от Docker, корректно поддерживает SemVer. Поэтому: `1.2.3-alpha` < `1.2.3` < `1.2.3+yandex`.


## Особенности среды выполнения {#runtime-features}

На кластерах Managed Service for Kubernetes, кроме устаревших кластеров, в качестве Container Runtime используется containerd. Сокет доступен по пути `/var/run/containerd/containerd.sock`.


## Спецификация продукта {#manifest}

Для публикации продукта необходима спецификация — документ, в котором будут описаны параметры развертывания продукта. Подготовьте спецификацию и [загрузите](../../storage/operations/objects/upload.md) ее в Yandex Object Storage.

Спецификация продукта описывается в формате YAML и содержит следующие данные:

1. `name` — название приложения по умолчанию при установке в кластер пользователя.

   ```yaml
   name: "our-app"
   ```

1. `helm_charts` — обязательное поле. Содержит список имен и тегов Helm-чарта продукта. Можно указать только один Helm-чарт.

   ```yaml
   helm_charts:
     - name: cr.yandexcloud.kz/b1gq90dgh25********/Vendor/Product/chart
       tag: 1.0-0
       images:
         - registry: app1.image.registry
           name_without_registry: app1.image.name
           tag: app1.image.tag
         - name_with_registry: app2.config.image.name
           tag: app2.config.image.tag
         - full: another-whatever-key.subkey.name
       # Указывает на то, что все заданные values относятся к этому Helm-чарту.
       reuse_values: true
   ```

   В Helm-чарте должно быть указано поле `images`. Содержит список метаданных Docker-образов, входящих в продукт. Значения переменных параметров метаданных Docker-образа — это ссылки в формате YAML Path на переменные из файла `values.yaml`. Записи могут быть оформлены в одном из форматов:
   
   * Имя Docker-образа, адрес реестра и тег описаны отдельными полями:

      ```yaml
      images:
      - registry: images.app.image.registry
        name_without_registry: images.app.image.name
        tag: images.app.image.tag
      ```

      ```yaml
      # values.yaml
      images:
        app:
          image:
            registry: "cr.yandexcloud.kz"
            name: "<registry-id>/<vendor-name>/<product-name>/<component-name>"
            tag: "<tag>"
      ```

   * Имя Docker-образа и адрес реестра описаны в одном поле, тег — в другом:

      ```yaml
      images:
        - name_with_registry: images.app.config.image.name
          tag: images.app.config.image.tag
      ```

      ```yaml
      # values.yaml
      images:
        app:
          config:
            image:
              name: "cr.yandexcloud.kz/<registry-id>/<vendor-name>/<product-name>/<component-name>"
              tag: "<tag>"
      ```

   * Описан полный путь до Docker-образа:

      ```yaml
      images:
        - full: images.app.image.name
      ```

      ```yaml
      # values.yaml
      images:
        app:
          image:
            name: "cr.yandexcloud.kz/<registry-id>/<vendor-name>/<product-name>/<component-name>:<tag>"
      ```

1. `requirements` — обязательное поле. Обязательные параметры кластера, в котором продукт будет разворачиваться. Раздел должен содержать параметр `min_k8s_version`, определяющий диапазон поддерживаемых версий Kubernetes.

   ```yaml
   requirements:
     min_k8s_version: ">=1.18"
   ```

1. `user_values` — необязательный параметр. Список переменных продукта, которые пользователь может переопределить во время установки или редактирования уже установленного продукта через консоль управления Yandex Cloud.

   {% note tip %}

   При перечислении в спецификации продукта значений, для которых будет запрошен пользовательский ввод, рекомендуется использовать правильные типы. Например, технически можно использовать `string` вместо `networkid`, но во втором случае пользователю будет предложено окно с выбором, а после ввода произойдет валидация. Также настоятельно рекомендуется указывать `secret: true` для чувствительных значений, которые, например, не должны попасть в логи.

   {% endnote %}

   Каждая переменная описывается обязательными полями:

   * `name` — YAML Path переменной из файла `values.yaml`;
   * `title` — краткое название переменной, может быть на русском и английском языке. Значение должно начинаться с заглавной буквы.

     ```yaml
     user_values:
     - name: app.port
       title:
         en: <english_title>
         ru: <заголовок_на_русском>
     ```
   * `description` — описание переменной, может быть на русском и английском языке. Значение должно начинаться с заглавной буквы.

      ```yaml
      user_values:
        - name: app.port
          title: <Заголовок>
          description:
            en: <English_description>
            ru: <Описание_на_русском>
      ```

   * `required` (опционально) — флаг *Обязательно для заполнения*. Может быть установлен в любом типе переменной, кроме `boolean_value`. Доступны значения `true` и `false`.

   * Тип переменной. Доступны значения:
      * `simple_disabled`. Может содержать значение по умолчанию и флаг включения.

        ```yaml
        user_values:
          - name: <название>
            disabled: true
            title: <Заголовок>
            simple_disabled:
              required: true
              default_value: "simple_string_value"
        ```

      * `integer_value`. Может содержать значение по умолчанию и диапазон допустимых значений.

        ```yaml
        user_values:
          - name: <название>
            title: <Заголовок>
            description: <Описание>
            integer_value:
              default_value: <целое_число_по_умолчанию>
              required: true
              restrictions:
                min: <целое_число_1>
                max: <целое_число_2>
        ```

      * `boolean_value`. Может содержать значение по умолчанию.

        ```yaml
        user_values:
          - name: <название>
            title: <Заголовок>
            description: <Описание>
            boolean_value:
              default_value: true
        ```

      * `string_selector_value` — строка из определенного списка. Может содержать значение по умолчанию и список допустимых значений.

        ```yaml
        user_values:
          - name: <название>
            title: <Заголовок>
            description: <Описание>
            string_selector_value:
              default_value: <значение_1>
              required: true
              values:
                - <значение_1>
                - <значение_2>
                - <значение_3>
        ```

      * `integer_selector_value` — целочисленное значение из определенного списка. Может содержать значение по умолчанию и список допустимых значений.

        ```yaml
        user_values:
          - name: <название>
            title: <Заголовок>
            description: <Описание>
            integer_selector_value:
              default_value: <целое_число_1>
              required: true
              values:
                - <целое_число_1>
                - <целое_число_2>
                - <целое_число_3>
        ```

      * `string_value`. Может содержать флаг и *поле с секретом*, а также ограничение на длину значения.

        ```yaml
        user_values:
          - name: <название>
            title: <Заголовок>
            description: <Описание>
            string_value:
              required: true
              secret: true
              length_restrictions:
                min: <минимальная_длина_строки>
                max: <максимальная_длина_строки>
        ```

      * `list_value`. Может содержать поля, доступные для указанного типа элементов списка. Элементы списка могут быть любого типа, который поддержан в `user_values`. При этом все элементы списка должны быть одного типа.

        ```yaml
        user_values:
          - name: <название>
            title: <Заголовок>
            description: <Описание>
            list_value:
              item:
               <тип_элемента_списка>: 
                 required: true
              min_items: <минимальная_длина_списка>
              max_items: <максимальная_длина_списка>
        ```

      * `cloudiddisabled` — идентификатор [облака](../../resource-manager/concepts/resources-hierarchy.md#cloud) в Yandex Cloud. Если параметр был передан, соответствующее поле продукта в консоли управления будет недоступно для редактирования и автоматически предзаполнится.

        ```yaml
        user_values:
          - name: <название>
            title: <Заголовок>
            cloud_id_value:
              required: true
        ```

      * `cloudid` — идентификатор облака в Yandex Cloud, который можно выбрать из консоли управления.

        ```yaml
        user_values:
          - name: <название>
            title: <Заголовок>
            cloud_id_value:
              required: true
        ```

      * `folderid` — идентификатор [каталога](../../resource-manager/concepts/resources-hierarchy.md#folder).

        ```yaml
        user_values:
          - name: <название>
            title: <Заголовок>
            folder_id_value:
              required: true
        ```

      * `clusterid` — идентификатор [кластера Kubernetes](../../managed-kubernetes/concepts/index.md#kubernetes-cluster).

        ```yaml
        user_values:
          - name: <название>
            title: <Заголовок>
            cluster_id_value:
              required: true
        ```

      * `networkid` — идентификатор [сети](../../vpc/concepts/network.md#network) Yandex Virtual Private Cloud.

        ```yaml
        user_values:
          - name: <название>
            title: <Заголовок>
            network_id_value:
              required: true
        ```

      * `subnetid` — идентификатор [подсети](../../vpc/concepts/network.md#subnet) Virtual Private Cloud.

        ```yaml
        user_values:
          - name: <название>
            title: <Заголовок>
            subnet_id_value:
              required: true
        ```

      * `serviceaccountid` — идентификатор [сервисного аккаунта](../../iam/concepts/users/service-accounts.md).

        ```yaml
        user_values:
          - name: <название>
            title: <Заголовок>
            service_account_id_value:
              required: true
        ```

      * `serviceaccountkey` — [авторизованный ключ](../../iam/concepts/authorization/key.md) сервисного аккаунта.

        ```yaml
        user_values:
          - name: <название>
            title: <Заголовок>
            service_account_key_value:
              required: true
        ```

      * `service_account_aws_key_value` — [статический ключ](../../iam/concepts/authorization/access-key.md) сервисного аккаунта для доступа к Object Storage. Передается в формате JSON.

        ```yaml
        user_values:
          - name: <название>
            title: <Заголовок>
            description: <Описание>
            service_account_aws_key_value:
              required: true
        ```

        Чтобы использовать значение этого поля в Helm-чарте или передавать его в файле при ручной установке, необходимо добавить в конец шаблона `templates/_helpers.tpl` следующий код:

        {% note warning %}

        После значения поля `name` из спецификации обязательно укажите `_generated`.

        {% endnote %}

        ```
        {{- define "<название_Helm-чарта>.access_key_id" -}}
        not_var{{- if .Values.saAccessKeyFile -}}
        {{- $key := .Values.saAccessKeyFile | fromJson -}}
        {{- $key.access_key.key_id -}}
        not_var{{- else }}
        {{- .Values.<значение_поля_name_из_спецификации>_generated.accessKeyID -}}
        not_var{{- end }}
        not_var{{- end }}

        {{- define "<название_Helm-чарта>.access_key_secret" -}}
        not_var{{- if .Values.saAccessKeyFile -}}
        {{- $key := .Values.saAccessKeyFile | fromJson -}}
        {{- $key.secret -}}
        not_var{{- else }}
        {{- .Values.<значение_поля_name_из_спецификации>_generated.secretAccessKey -}}
        not_var{{- end }}
        not_var{{- end }}
        ```

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

        ```
        apiVersion: v1
        kind: Secret
        metadata:
          name: {{ include "mychart.fullname" . }}
          labels:
            {{- include "mychart.labels" . | nindent 4 }}
        type: Opaque
        data:
          ACCESS_KEY_ID: {{ include "mychart.access_key_id" . | b64enc | quote }}
          SECRET_ACCESS_KEY: {{ include "mychart.access_key_secret" . | b64enc | quote }}
        ```

      * `ciliumvaluedisabled` — использование провайдера сетевых политик Cilium. Если параметр был передан, соответствующее поле продукта в консоли управления будет недоступно для редактирования и автоматически предзаполнится.

        ```yaml
        user_values:
          - name: <название>
            title: <Заголовок>
            cilium_value: {}
        ```

      * `ciliumvalue` — использование провайдера сетевых политик Cilium.

        ```yaml
        user_values:
          - name: <название>
            title: <Заголовок>
            cilium_value: {}
        ```

      * `kubednsclusteripvaluedisabled` — IP-адрес кластера Kubernetes. Если параметр был передан, соответствующее поле продукта в консоли управления будет недоступно для редактирования и автоматически предзаполнится.

        ```yaml
        user_values:
          - name: <название>
            title: <Заголовок>
            kube_dns_cluster_ip_value:
              required: true
        ```

      * `kubednsclusteripvalue` — IP-адрес кластера Kubernetes.

        ```yaml
        user_values:
          - name: <название>
            title: <Заголовок>
            kube_dns_cluster_ip_value:
              required: true
        ```

      * `loggroupidvalue` — идентификатор [лог-группы](../../logging/concepts/log-group.md) Yandex Cloud Logging.

        ```yaml
        user_values:
          - name: <название>
            title: <Заголовок>
            log_group_id_value:
              required: true
        ```

      * `kmskeyidvalue` — содержимое [ключа Yandex Key Management Service](../../kms/concepts/key.md).

        ```yaml
        user_values:
          - name: <название>
            title: <Заголовок>
            kms_key_id_value:
              required: true
        ```

      * `domainvalue` — домен, в котором будет расположен кластер Kubernetes.

        ```yaml
        user_values:
          - name: <название>
            title: <Заголовок>
            domain_value:
              required: true
        ```

      * `iamapikeyvalue` — значение [API-ключа](../../iam/concepts/authorization/api-key.md) сервисного аккаунта. Передается в формате JSON.

        ```yaml
        user_values:
          - name: <название>
            title: <Заголовок>
            iam_api_key_value:
              required: true
        ```

      * `storagebucketvalue` — [бакет](../../storage/concepts/bucket.md) Object Storage.

        ```yaml
        user_values:
          - name: <название>
            title: <Заголовок>
            storage_bucket_value:
              required: true
        ```

      * `prometheusworkspaceidvalue` — название рабочего пространства Prometheus.

        ```yaml
        user_values:
          - name: <название>
            title: <Заголовок>
            prometheus_workspace_id_value:
              required: false
        ```

      * `licenseidvalue` — идентификатор [подписки](../operations/license-manager-integration.md) из License Manager API.

        ```yaml
        user_values:
          - name: <название>
            title: <Заголовок>
            license_id_value:
              required: false
        ```

1. `private_artifacts` — необязательный параметр. Позволяет не перемещать все Docker-образы, входящие в продукт, из реестра издателя в публично доступный реестр `yc-marketplace`. Доступны значения `true` и `false`, значение по умолчанию — `false`.

   Параметр задается для версии продукта. Версию, для которой задан параметр `private_artifacts = true`, пользователь сможет установить только с помощью [интерфейсов](../../overview/concepts/interfaces.md) Yandex Cloud. Установка с помощью команды `helm install` будет недоступна.

   Доступ на скачивание компонентов, опубликованных на карточке продукта в разделе **Состав продукта**, будет выдаваться только сервисному аккаунту, от имени которого пользователь устанавливает продукт. Если пользователь удалит продукт, Marketplace отзовет доступ у сервисного аккаунта.

Значения переменных, указанные пользователем при установке продукта в кластер Kubernetes, будут переопределять значения из файла `values.yaml`.

## Пример спецификации продукта и соответствующего файла переменных {#examples}

### Спецификация продукта {#manifest}

```yaml
name: "our-app" 

helm_charts:
  - name: cr.yandexcloud.kz/b1gq90dgh25********/Vendor/Product/chart
    tag: 1.0-0
    images:
      - registry: app1.image.registry
        name_without_registry: app1.image.name
        tag: app1.image.tag
      - name_with_registry: app2.config.image.name
        tag: app2.config.image.tag
      - full: another-whatever-key.subkey.name    
    reuse_values: true

requirements:
  min_k8s_version: ">=1.18"

# Configurable parameters that might be changed by end user during installation of product. Should be presented in values.yaml
# Supported types: integer, boolean, string, string selector, integer selector.
user_values:
  - name: app.port
    title:
      en: Application port
      ru: Порт приложения
    description:
      en: Port that application will listen to
      ru: Порт, на котором приложение принимает входящие запросы
    integer_value:
      default_value: 8080
      required: true
      restrictions:
        min: 8000
        max: 9000
  - name: app.tls.use
    title:
      en: TLS
      ru: TLS
    description:
      en: Use TLS
      ru: Использовать TLS
    boolean_value:
      default_value: true
  - name: app.admin.password
    title:
      en: Admin password
      ru: Пароль администратора
    description:
      en: Password of administrator, should be at least 8 symbols
      ru: Пароль администратора, должен быть длиной не менее 8 символов
    string_value:
      required: true
      secret: true
      length_restrictions:
        min: 8
        max: 20
  - name: app.selector.string
    title:
      en: Custom string selector
      ru: Строковая опция
    description:
      en: One value string selector
      ru: Выбор одного строкового значения
    string_selector_value:
      default_value: opt1
      required: true
      values:
        - opt1
        - opt2
        - opt3
  - name: app.selector.integer
    title:
      en: Custom integer selector
      ru: Числовая опция
    description:
      en: One value integer selector
      ru: Выбор одного integer значения
    integer_selector_value:
      default_value: 1
      required: true
      values:
        - 1
        - 2
        - 3

# Optional: if set to `true`, the Helm chart and Docker images will not be placed in a public repo.
# This will make the product only installable via Marketplace (and not with `helm install ...`).
private_artifacts: false
```

{% cut "Предыдущая версия спецификации продукта" %}

```yaml
# Link to helm chart in publisher registry.
helm_chart:
  name: cr.yandexcloud.kz/b1gq90dgh25********/Vendor/Product/chart
  tag: 1.0-0

# Required parameters.
requirements:
  k8s_version: ">=1.18"

images:
  - registry: app1.image.registry
    name_without_registry: app1.image.name
    tag: app1.image.tag
  - name_with_registry: app2.config.image.name
    tag: app2.config.image.tag
  - full: another-whatever-key.subkey.name

# Configurable parameters that might be changed by end user during installation of product. Should be presented in values.yaml
# Supported types: integer, boolean, string, string selector, integer selector.
user_values:
  - name: app.port
    title:
      en: Application port
      ru: Порт приложения
    description:
      en: Port that application will listen to
      ru: Порт, на котором приложение принимает входящие запросы
    integer_value:
      default_value: 8080
      required: true
      restrictions:
        min: 8000
        max: 9000
  - name: app.tls.use
    title:
      en: TLS
      ru: TLS
    description:
      en: Use TLS
      ru: Использовать TLS
    boolean_value:
      default_value: true
  - name: app.admin.password
    title:
      en: Admin password
      ru: Пароль администратора
    description:
      en: Password of administrator, should be at least 8 symbols
      ru: Пароль администратора, должен быть длиной не менее 8 символов
    string_value:
      required: true
      secret: true
      length_restrictions:
        min: 8
        max: 20
  - name: app.selector.string
    title:
      en: Custom string selector
      ru: Строковая опция
    description:
      en: One value string selector
      ru: Выбор одного строкового значения
    string_selector_value:
      default_value: opt1
      required: true
      values:
        - opt1
        - opt2
        - opt3
  - name: app.selector.integer
    title:
      en: Custom integer selector
      ru: Числовая опция
    description:
      en: One value integer selector
      ru: Выбор одного integer значения
    integer_selector_value:
      default_value: 1
      required: true
      values:
        - 1
        - 2
        - 3

# Optional: if set to `true`, the Helm chart and Docker images will not be placed in a public repo.
# This will make the product only installable via Marketplace (and not with `helm install ...`).
private_artifacts: false
```

{% endcut %}

### Файл переменных values.yaml {#values}

```yaml
# An example of values.yaml related to publisher manifest above.
replicaCount: 1
podAnnotations: {}
podSecurityContext: {}
...
app1:
  image:
    registry: cr.yandexcloud.kz/b1gq90dgh25********/
    name: service-images/application-1
    tag: 1.0
app2:
  name: application-name
  config:
    # image can be declared on any level
    image:
      name: cr.yandexcloud.kz/b1gq90dgh25********/service-images/application-2
      tag: 2.0
    pullPolicy: IfNotPresent
another-whatever-key: # key name is not fixed
  subkey:
    name: cr.yandexcloud.kz/b1gq90dgh25********/service-images/application-3:3.0
...

# values
app:
  port: 80
  tls:
    use: true
  admin:
    password: ""
  selector:
    string: "opt1"
    integer: 1
```