Создание продукта для Managed Service for Kubernetes
Чтобы добавить программный продукт для Managed Service for Kubernetes в Marketplace, его пакеты необходимо загрузить в реестр Yandex Cloud. Этот раздел поможет подготовить продукт Marketplace для Yandex Managed Service for Kubernetes.
Вы также можете создать продукты для Yandex Compute Cloud на базе ОС Linux, воспользовавшись соответствующими рекомендациями.
Размещение и именование образов
-
Helm chart
продукта и все docker-образы, входящие в него, должны быть размещены в реестре издателя, созданном в Yandex Container Registry. О том, как создать реестр и как загрузить образ, см. в соответствующих разделах документации. -
Имя helm chart продукта должно иметь вид:
cr.yandex/<registry-id>/<vendor-name>/<product-name>/<chart>
Где:
<registry-id>
— идентификатор реестра издателя;<vendor-name>
— наименования компании-издателя продукта;<product-name>
— наименования продукта;<chart>
— название helm chart.
-
Имена docker-образов продукта должны иметь вид:
cr.yandex/<registry-id>/<vendor-name>/<product-name>/<component-name>:<tag>
Где:
<registry-id>
— идентификатор реестра издателя;<vendor-name>
— наименования компании-издателя продукта;<product-name>
— наименования продукта;<component-name>
— наименование компонента продукта, поставляемого в виде docker-образа;<tag>
— тег docker-образа. Не используйте тегlatest
.
Во время публикации все образы, входящие в продукт, из реестра издателя перемещаются в публично доступный реестр yc-marketplace
. При этом вся иерархия продукта, определенная издателем, сохраняется.
Например, образ
cr.yandex/b1gq90dgh25********/yandex-cloud/prometheus/pushgateway:1.0
будет опубликован под именемcr.yandex/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.yandex/<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.yandex/<registry-id>/<vendor-name>/<product-name>/<component-name>:<tag>
Манифест
Для публикации продукта необходим манифест — документ, в котором будут описаны параметры развертывания продукта. Подготовьте манифест и загрузите его в Yandex Object Storage.
Манифест описывается в формате YAML и содержит следующие данные:
-
helm_chart
— обязательное поле. Содержит имя и тег helm chart продукта.helm_chart: name: cr.yandex/<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.yandex" 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.yandex/<registry-id>/<vendor-name>/<product-name>/<component-name>" tag: "<tag>"
-
Описан полный путь до образа:
images: - full: images.app.image.name
# values.yaml images: app: image: name: "cr.yandex/<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: <Описание_на_русском>
-
тип переменной. Доступны значения:
-
boolean_value
. Может содержать значение по умолчанию.user_values: - name: <Название> title: <Заголовок> description: <Описание> boolean_value: default_value: true
-
integer_value
. Может содержать значение по умолчанию, флагобязательно для заполнения
и диапазон допустимых значений.user_values: - name: <Название> title: <Заголовок> description: <Описание> integer_value: default_value: <целое_число_по_умолчанию> required: true restrictions: min: <целое_число_1> max: <целое_число_2>
-
string_value
. Может содержать флагиобязательно для заполнения
> и>поле с секретом
, а также ограничение на длину значения.user_values: - name: <Название> title: <Заголовок> description: <Описание> string_value: required: true secret: true length_restrictions: min: <min_длина_строки> max: <max_длина_строки>
-
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>
-
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 }}
-
-
Значения переменных, указанные пользователем при установке продукта в кластер Kubernetes, будут переопределять значения из файла values.yaml
.
Пример манифеста и соответствующего файла переменных
Манифест
# Link to helm chart in publisher registry.
helm_chart:
name: cr.yandex/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
Файл переменных values.yaml
# An example of values.xml related to publisher manifest above.
replicaCount: 1
podAnnotations: {}
podSecurityContext: {}
...
app1:
image:
registry: cr.yandex/b1gq90dgh25********/
name: service-images/application-1
tag: 1.0
app2:
name: application-name
config:
# image can be declared on any level
image:
name: cr.yandex/b1gq90dgh25********/service-images/application-2
tag: 2.0
pullPolicy: IfNotPresent
another-whatever-key: # key name is not fixed
subkey:
name: cr.yandex/b1gq90dgh25********/service-images/application-3:3.0
...
# values
app:
port: 80
tls:
use: true
admin:
password: ""
selector:
string: "opt1"
integer: 1