Создание продукта для Managed Service for Kubernetes
Чтобы добавить программный продукт для Managed Service for Kubernetes в Marketplace, его пакеты необходимо загрузить в реестр Yandex Cloud. Этот раздел поможет подготовить продукт Marketplace для Yandex Managed Service for Kubernetes.
Как настроить доступ к продукту по подписке, см. в разделе Интеграция с License Manager API.
Вы также можете создать продукты для Yandex Compute Cloud на базе ОС Linux, воспользовавшись соответствующими рекомендациями.
Размещение и именование образов
-
Helm chart
продукта и все docker-образы, входящие в него, должны быть размещены в реестре издателя, созданном в Yandex Container Registry. О том, как создать реестр и как загрузить образ, см. в соответствующих разделах документации. -
Имя helm chart продукта должно иметь вид:
cr.yandexcloud.kz/<registry-id>/<vendor-name>/<product-name>/<chart>Где:
<registry-id>— идентификатор реестра издателя;<vendor-name>— наименования компании-издателя продукта;<product-name>— наименования продукта;<chart>— название helm chart.
-
Имена 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.
Во время публикации все образы, входящие в продукт, из реестра издателя перемещаются в публично доступный реестр yc-marketplace. При этом вся иерархия продукта, определенная издателем, сохраняется.
Например, образ
cr.yandexcloud.kz/b1gq90dgh25********/yandex-cloud/prometheus/pushgateway:1.0будет опубликован под именемcr.yandexcloud.kz/yc-marketplace/yandex-cloud/prometheus/pushgateway:1.0.
Подробнее о работе с реестром см. в разделах Загрузить Helm-чарт в реестр и Загрузить Docker-образ в реестр.
Особенности сборки helm chart
Helm chart должен содержать файл values.yaml, в котором в виде параметров будут перечислены все используемые docker-образы. Имена docker-образов в файле values.yaml должны начинаться с префикса .Values и указывать на образы, размещенные в реестре издателя, чтобы публикация и дальнейшая установка продукта в кластере пользователя прошли без ошибок.
Спецификация пода без параметров в общем виде:
# pod spec
spec:
containers:
- image: cr.yandexcloud.kz/<registry-id>/<vendor-name>/<product-name>/<component-name>:<tag>
Спецификация пода, в котором имя образа заменено на переменную YAML path, описанную в файле values.yaml:
# pod spec
spec:
containers:
- image: {{ .Values.images.pushgateway }}
# values.yaml
images:
pushgateway: cr.yandexcloud.kz/<registry-id>/<vendor-name>/<product-name>/<component-name>:<tag>
Манифест
Для публикации продукта необходим манифест — документ, в котором будут описаны параметры развертывания продукта. Подготовьте манифест и загрузите его в Yandex Object Storage.
Манифест описывается в формате YAML и содержит следующие данные:
-
helm_chart— обязательное поле. Содержит имя и тег helm chart продукта.helm_chart: name: cr.yandexcloud.kz/<registry-id>/<vendor-name>/<product-name>/<chart> tag: <tag> -
requirements— обязательное поле. Обязательные параметры кластера, в котором продукт будет разворачиваться. Раздел должен содержать параметрk8s_version, определяющий диапазон поддерживаемых версий Kubernetes.requirements: k8s_version: ">=1.18" -
images— обязательное поле. Содержит список метаданных образов, входящих в продукт. Значения переменных параметров метаданных образа — это ссылки в формате YAML Path на переменные из файлаvalues.yaml. Записи могут быть оформлены в одном из форматов:-
Имя образа, адрес реестра и тег описаны отдельными полями:
images: - registry: images.app.image.registry name_without_registry: images.app.image.name tag: images.app.image.tag# values.yaml images: app: image: registry: "cr.yandexcloud.kz" name: "<registry-id>/<vendor-name>/<product-name>/<component-name>" tag: "<tag>" -
Имя образа и адрес реестра описаны в одном поле, тег — в другом:
images: - name_with_registry: images.app.config.image.name tag: images.app.config.image.tag# values.yaml images: app: config: image: name: "cr.yandexcloud.kz/<registry-id>/<vendor-name>/<product-name>/<component-name>" tag: "<tag>" -
Описан полный путь до образа:
images: - full: images.app.image.name# values.yaml images: app: image: name: "cr.yandexcloud.kz/<registry-id>/<vendor-name>/<product-name>/<component-name>:<tag>"
-
-
user_values— необязательный параметр. Список переменных продукта, которые пользователь может переопределить во время установки или редактирования уже установленного продукта через консоль управления Yandex Cloud. Каждая переменная описывается обязательными полями:-
name— YAML Path переменной из файлаvalues.yaml; -
title— краткое название переменной, может быть на русском и английском языке. Значение должно начинаться с заглавной буквы.user_values: - name: app.port title: en: <english_title> ru: <заголовок_на_русском> -
description— описание переменной, может быть на русском и английском языке. Значение должно начинаться с заглавной буквы.user_values: - name: app.port title: <Заголовок> description: en: <English_description> ru: <Описание_на_русском> -
required(опционально) — флаг Обязательно для заполнения. Может быть установлен в любом типе переменной, кромеboolean_value. Доступны значенияtrueиfalse. -
Тип переменной. Доступны значения:
-
simple_disabled. Может содержать значение по умолчанию и флаг включения.user_values: - name: <название> disabled: true title: <Заголовок> string_value: required: true default_value: "simple_string_value" -
integer_value. Может содержать значение по умолчанию и диапазон допустимых значений.user_values: - name: <название> title: <Заголовок> description: <Описание> integer_value: default_value: <целое_число_по_умолчанию> required: true restrictions: min: <целое_число_1> max: <целое_число_2> -
boolean_value. Может содержать значение по умолчанию.user_values: - name: <название> title: <Заголовок> description: <Описание> boolean_value: default_value: true -
string_selector_value— строка из определенного списка. Может содержать значение по умолчанию и список допустимых значений.user_values: - name: <название> title: <Заголовок> description: <Описание> string_selector_value: default_value: <значение_1> required: true values: - <значение_1> - <значение_2> - <значение_3> -
integer_selector_value— целочисленное значение из определенного списка. Может содержать значение по умолчанию и список допустимых значений.user_values: - name: <название> title: <Заголовок> description: <Описание> integer_selector_value: default_value: <целое_число_1> required: true values: - <целое_число_1> - <целое_число_2> - <целое_число_3> -
string_value. Может содержать флаг и поле с секретом, а также ограничение на длину значения.user_values: - name: <название> title: <Заголовок> description: <Описание> string_value: required: true secret: true length_restrictions: min: <min_длина_строки> max: <max_длина_строки> -
cloudiddisabled— идентификатор облака в Yandex Cloud. Если параметр был передан, соответствующее поле продукта в консоли управления будет недоступно для редактирования и автоматически предзаполнится.user_values: - name: <название> title: <Заголовок> cloud_id_value: required: true -
cloudid— идентификатор облака в Yandex Cloud, который можно выбрать из консоли управления.user_values: - name: <название> title: <Заголовок> cloud_id_value: required: true -
folderid— идентификатор каталога.user_values: - name: <название> title: <Заголовок> folder_id_value: required: true -
clusterid— идентификатор кластера Kubernetes.user_values: - name: <название> title: <Заголовок> cluster_id_value: required: true -
networkid— идентификатор сети Yandex Virtual Private Cloud.user_values: - name: <название> title: <Заголовок> network_id_value: required: true -
subnetid— идентификатор подсети Virtual Private Cloud.user_values: - name: <название> title: <Заголовок> subnet_id_value: required: true -
serviceaccountid— идентификатор сервисного аккаунта.user_values: - name: <название> title: <Заголовок> service_account_id_value: required: true -
serviceaccountkey— авторизованный ключ сервисного аккаунта.user_values: - name: <название> title: <Заголовок> service_account_key_value: required: true -
service_account_aws_key_value— статический ключ сервисного аккаунта для доступа к Object Storage. Передается в формате JSON.user_values: - name: <название> title: <Заголовок> description: <Описание> service_account_aws_key_value: required: trueЧтобы использовать значение этого поля в helm chart или передавать его в файле при ручной установке, необходимо добавить в конец шаблона
templates/_helpers.tplследующий код:Важно
После значения поля
nameиз манифеста обязательно укажите_generated.{{- define "<название_чарта>.access_key_id" -}} {{- if .Values.saAccessKeyFile -}} {{- $key := .Values.saAccessKeyFile | fromJson -}} {{- $key.access_key.key_id -}} {{- else }} {{- .Values.<значение_поля_name_из_манифеста>_generated.accessKeyID -}} {{- end }} {{- end }} {{- define "<название_чарта>.access_key_secret" -}} {{- if .Values.saAccessKeyFile -}} {{- $key := .Values.saAccessKeyFile | fromJson -}} {{- $key.secret -}} {{- else }} {{- .Values.<значение_поля_name_из_манифеста>_generated.secretAccessKey -}} {{- end }} {{- 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. Если параметр был передан, соответствующее поле продукта в консоли управления будет недоступно для редактирования и автоматически предзаполнится.user_values: - name: <название> title: <Заголовок> cilium_value: {} -
ciliumvalue— использование провайдера сетевых политик Cilium.user_values: - name: <название> title: <Заголовок> cilium_value: {} -
kubednsclusteripvaluedisabled— IP-адрес кластера Kubernetes. Если параметр был передан, соответствующее поле продукта в консоли управления будет недоступно для редактирования и автоматически предзаполнится.user_values: - name: <название> title: <Заголовок> kube_dns_cluster_ip_value: required: true -
kubednsclusteripvalue— IP-адрес кластера Kubernetes.user_values: - name: <название> title: <Заголовок> kube_dns_cluster_ip_value: required: true -
loggroupidvalue— идентификатор лог-группы Yandex Cloud Logging.user_values: - name: <название> title: <Заголовок> log_group_id_value: required: true -
kmskeyidvalue— содержимое ключа Yandex Key Management Service.user_values: - name: <название> title: <Заголовок> kms_key_id_value: required: true -
domainvalue— домен, в котором будет расположен кластер Kubernetes.user_values: - name: <название> title: <Заголовок> domain_value: required: true -
iamapikeyvalue— значение API-ключа сервисного аккаунта. Передается в формате JSON.user_values: - name: <название> title: <Заголовок> iam_api_key_value: required: true -
storagebucketvalue— бакет Object Storage.user_values: - name: <название> title: <Заголовок> storage_bucket_value: required: true -
prometheusworkspaceidvalue— название рабочего пространства Prometheus.user_values: - name: <название> title: <Заголовок> prometheus_workspace_id_value: required: false -
licenseidvalue— идентификатор подписки из License Manager API.user_values: - name: <название> title: <Заголовок> license_id_value: required: false
-
-
Значения переменных, указанные пользователем при установке продукта в кластер Kubernetes, будут переопределять значения из файла values.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
Файл переменных 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