Создание продукта для 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.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: <Описание_на_русском>
-
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.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