Helm Chart中根values.yaml与Spark依赖values.yaml的取值规则咨询
Helm 根Chart与Spark子Chart的values参数映射及优先级问题
问题背景
现有Helm项目结构如下:
charts/ spark-0.0.1-100.tgz templates/ Chart.yaml values.yaml
根目录Chart.yaml定义Spark依赖:
appVersion: 0.1.0 dependencies: - name: spark version: "0.0.1-100" repository: https://helm.<corporation>.com/<project> condition: spark.enabled
根values.yaml中Spark相关配置(部分省略):
spark: enabled: true serviceAccount: annotations: eks.amazonaws.com/role-arn: arn:aws:iam::<account-id>:role/spark-service-account image: tag: "3.3.0-dev-28" extraEnv: - name: AWS_STS_REGIONAL_ENDPOINTS value: regional Master: Requests: Cpu: ... Memory: ... Disk: ... Limits: Cpu: ... Memory: ... Disk: ... Worker: Replicas: 3 Requests: Cpu: ... Memory: ... Disk: ... Limits: Cpu: ... Memory: ... Disk: ... zookeeper: host: "project-zookeeper" port: 2181
将charts/spark-0.0.1-100.tgz解压后,Spark子Chart的values.yaml内容:
global: aci: sdrAppname: spark image: repository: "docker.<corporation>.com/<project>/spark" tag: "1.0.1" spark: path: "/opt/spark" user: 1000 group: 1000 config: | SPARK_WORKER_OPTS="-Dspark.worker.cleanup.enabled=true -Dspark.worker.cleanup.appDataTtl=21600" Master: Name: master Replicas: 1 Component: "spark-core" Requests: Cpu: ... Memory: ... Disk: ... Limits: Cpu: ... Memory: ... Disk: ... ServicePort: <port> ContainerPort: <port> RestEnabled: "true" RestPort: <port> ServiceType: LoadBalancer WebUi: Name: webui ServicePort: <port> ContainerPort: <port>
疑问
- 根
values.yaml与Spark子Chart的values.yaml中的参数是如何对应的? - 根
values.yaml中的值是否会被子Chart的values.yaml中的值替换?
回答
1. 参数对应关系
Helm中,根Chart的values.yaml里以子Chart名称(此处为spark)为顶层键的配置,会映射到子Chart的配置体系中,对应规则遵循层级结构匹配:
- 根
values.yaml里的spark.image.tag→ 对应子Chartvalues.yaml中的image.tag - 根
values.yaml里的spark.Master.Requests→ 对应子Chartvalues.yaml中的Master.Requests - 根
values.yaml中新增的配置(如spark.serviceAccount、spark.extraEnv、spark.Worker、spark.zookeeper),若子Chart的模板文件中引用了这些键,则会生效;若子Chart无相关引用,则不会产生实际作用。
简言之:根Chart里spark节点下的所有配置项,会作为子Chart的输入值,与子Chart自身values.yaml中同层级的同名参数一一对应。
2. 值的优先级规则
Helm配置的优先级从高到低排序为:
- 命令行传递的参数(
--set或-f指定的额外values文件) - 根Chart
values.yaml中以子Chart名称为顶层键的配置 - 子Chart自身的
values.yaml配置
因此根values.yaml中的值不会被子Chart的values.yaml替换,反而会覆盖子Chart中对应层级的同名值。举两个具体例子:
- 子Chart
values.yaml里image.tag默认值为1.0.1,但根values.yaml中spark.image.tag设为3.3.0-dev-28,最终生效的是3.3.0-dev-28 - 子Chart
Master.Replicas默认值为1,若根Chart未配置spark.Master.Replicas,则使用子Chart的默认值;若根Chart设置了该值,就会覆盖子Chart的默认值
对于子Chart中存在但根Chart未配置的项(如WebUi、spark.path),会直接使用子Chartvalues.yaml中的默认值。
内容的提问来源于stack exchange,提问作者Lesha Pipiev
相关产品推荐
相关产品推荐

