云产品 charts 包中 _config_helpers.yaml.tpl
文件用于定义云产品配置及其依赖。
定义云产品配置
ECP 6.0.2:replicas_by_modality 支持通过 License 传参修改副本数
ECP 6.1.1:新增 safe_render 和safe_render_multi模板函数
说明
_config_helpers.yaml.tpl
文件中data_template
属性用于定义云产品的配置模板,该配置会在渲染后生成云产品配置传递给 helm
用于部署云产品,该模板使用mako template语法,并包含了如下的模板函数:
${cloud_product_label}
:渲染为云产品节点label。${label_enabled}
:渲染为云产品节点label的value,默认为enabled。${random_password('password_tag', 8)}
:生成一个随机密码,,同一个password标识生成的随机密码在首次生成后,再次升级将不会改变。- param1:password标识
- param2:password的位数
${replicas_by_modality}
:平台设置的副本数,参考:通过 License 传参修改副本数。${safe_render('product', '/path', 'default_value')}
:获取某个云产品的配置。- param1:云产品标识
- param2:配置路径
- param3:获取配置失败时的默认配置
${safe_render_multi(['product1','product2'], '/path', 'default_value')}
:获取某个云产品的配置。匹配规则为第一个配置存在且为已安装状态的云产品,优先级以param1的列表顺序为准。
例如,集群中已安装的了一个 mariaDB 的云产品,定义的配置如下:
data_template:
endpoints:
admin:
password: 12sfeij113
mycloud-product 云产品需要使用 mariaDB 云产品的配置,获取 password 数据时,可通过如下方式进行获取:
data_template:
endpoints:
maria_db:
password:
${mariadb['endpoints']['admin']['password']}
若无法确定是否存在 mariaDB 的配置中,是否存在 password 配置,可以通过如下方式设置一个默认值:
data_template:
endpoints:
maria_db:
password:
${mariadb['endpoints'].get('admin', {}).get('password', "12345")}
若 mariaDB 可能还没安装,在获取不到时需要使用一个默认值代替,可以使用safe_render
模板函数
data_template:
endpoints:
maria_db:
password:
${safe_render('mariadb', '/endpoints/admin/password', 'default')
引用平行依赖的云产品(依赖的云产品存在互斥云产品)时,可以使用safe_render_multi模板函数:
data_template:
endpoints:
maria_db:
password:
${safe_render_multi(['neutron','proton'], '/endpoints/admin/password', 'default')
使用mako语法实现条件判断
mako语法同时兼容平台6.0.2和6.1.1版本,可以使用条件判断,实现按照自定义优先级获取依赖的云产品配置。
如果云产品需要同时兼容6.0.2版本和6.1.1版本,推荐使用mako语法:
password: |-
% if neutron:
${neutron.get(‘endpoints’,{}).get(‘oslo_db’,{}).get(‘auth’,{}).get(‘user’,{}).get(‘password’,’default’)}
% elif proton:
${proton.get(‘endpoints’,{}).get(‘oslo_db’,{}).get(‘auth’,{}).get(‘user’,{}).get(‘password’,’default’)}
% else:
${random_password(‘va_oslo_db_user’, 8)}
% endif
使用时注意缩进,避免格式错误导致配置渲染失败。
示例
data_template:
endpoints:
maria_db:
auth:
admin:
password:
${mariadb['endpoints']['oslo_db']['auth']['admin']['password']}
user:
password:
${random_password('user_mariadb', 8)}
neutron:
password:
${safe_render('neutron', '/endpoints/admin/password', 'default')
password1:
${safe_render_multi(['neutron','proton'], '/endpoints/admin/password', 'default')
password2: |-
% if neutron:
${neutron.get('endpoints',{}).get('oslo_db',{}).get('auth',{}).get('user',{}).get('password','default')}
% elif proton:
${proton.get('endpoints',{}).get('oslo_db',{}).get('auth',{}).get('user',{}).get('password','default')}
% else:
default
% endif
password3: |-
% if neutron:
${neutron.get('endpoints',{}).get('oslo_db',{}).get('auth',{}).get('user',{}).get('password','default')}
% else:
${random_password('va_oslo_db_user', 8)}
% endif
labels:
node_selector_key:
${cloud_product_label}
node_selector_value:
${label_enabled}
通过 License 传参修改副本数
说明
通过 ${replicas_by_modality} 来获取由平台设置的副本数,ECP 602 版本会从云产品 license 的 values 数据中获取指定的副本数。对应的 key 为default_product_replicas,获取不到时,默认值为3。
示例
license 定义为如下值时:
cloud_product:
- alcubierre:
ttl: '2200-01-01'
values:
default_product_replicas: 3
company: EasyStack-certified-OS-in-OS-3bonds-v6
lic_type: cloud_product
project: EasyStack
serial: d93d10ad-2075-4327-a059-ebde38345a3b
_config_helpers.yaml.tpl 定义:
data_template:
pod:
replicas:
devops_dashboard_api:
${replicas_by_modality}
devops_dashboard_server:
${replicas_by_modality}
渲染后:
data_template:
pod:
replicas:
devops_dashboard_api: 3
devops_dashboard_server: 3
通过License主动更新云产品及平台软件配置
之前云产品license中的自定义值,需要云产品在 _config_helpers.yaml.tpl 的 data_template 字段下通过模板的方式显式的引用相关的值,才可通过更新 license 的方式动态更新,数据更新方式较为被动,现在增加通过 license 主动更新云产品配置的方案,云产品无需再通过模板声明的方式获取 license 数据,后续 license 中的数据将逐步禁止云产品直接读取。
说明
license详细配置方案如下:
- 每个云产品 License 新增 config 字段,保存主动更新配置
- License CRD 中新增 platform_software 字段,保存平台软件主动更新配置
- License CRD 中 data 下新增 topology字段,保存平台软件和云产品的拓扑数据
- 安装阶段将云产品或平台软件对应的 config 及拓扑数据 topology和 data_template 渲染后的数据进行 merge,使用此数据进行安装
- 安装完成后,动态监控 license config,当出现变化时,将 license 中各云产品或平台软件 config 字段及拓扑数据和云产品的 cpconfig 的 data 数据进行 merge,merge 完成后计算 data hash,若 hash 不一致则触发配置更新操作。 渲染配置模板时,会跳过license数据的读取,并置为空对象,以达到禁止读取 license 数据的能力。
配置优先级
目前云产品的配置数据源来自于 _config_helpers.yaml.tpl 的 data_template 字段、config crd,cpconfig 自定义配置 custom_config 字段,加入了 license 数据后,字段相同时预计的配置优先级从低到高如下:
- data_template
- config crd
- 拓扑数据
- license config 数据
- custom_config 自定义配置
示例
values.yaml
_config_helpers.yaml.tpl# cloud_product_1 values.yaml pod: replicas: api: 1 dashboard: 1 db: 1 # platform_software_1 values.yaml pod: replicas: api: 1 dashboard: 1 db: 1
license configdata_template: pod: replicas: api: 2 dashboard: 2
最终渲染后的 values:apiVersion: servicecatalog.ecp.com/v1 data: cloud_product: cloud_product_1: ttl: -1 values: api: 2 dashboard: 2 config: pod: replicas: dashboard: 3 platform_software: platform_software_1: config: pod: replicas: dashboard: 3 topology: cloud_product_1: pod: replicas: dashboard: 4 platform_software_1: pod: replicas: dashboard: 4
# cloud_product_1 pod: replicas: api: 2 dashboard: 3 db: 1 # platform_software_1 pod: replicas: api: 2 dashboard: 3 db: 1
云产品依赖
说明
_config_helpers.yaml.tpl
文件中涉及参数如下:
dependencies
属性用于定义云产品的依赖arch
:定义云产品依赖的系统架构,支持 x86 和 armservices
:定义云产品依赖的服务parallel_services
:定义云产品平行依赖的服务,其中声明的云产品只要有一个满足即达到依赖条件exclusion
:定义云产品互斥依赖的服务,声明的云产品不可和此云产品同时安装platform_version
:定义云产品依赖的最低平台版本
base_version
:定义依赖的必升版本trial_days
:定义可试用天数(-1为免费,默认需要定义为180)license_expired
:定义license过期时需要upgrade的属性(例如应用中心在license过期时可能不会删除所有已安装应用,只会禁用应用商店功能),由云产品自行定义。示例
dependencies: platform_version: 6.0.1 arch: - x86 - arm services: horizon: 6.0.1-alpha.0 nova: 6.0.1-alpha.0 exclusion: - nova - cinder parallel_services: - iam: 6.0.1 schedule: 6.0.1 - neturn: 6.0.1 proton: 6.0.1 base_version: 6.2.1 trial_days: 180 license_expired: feature: disable: true
云产品必升版本
说明
_config_helpers.yaml.tpl
文件中base_version
属性用于定义云产品升级到此版本时,依赖的必升版本,云产品必须先升级到base_version
版本后,才能升级到此版本。示例
_config_helpers.yaml.tpl
文件中存在如下定义时,必须先升级到6.0.3
版本,才可继续升级到当前版本。base_version: 6.0.3