kubernetes 如何Release.name在另一个子图中引用一个子图的. www.example.com或帮助函数?

pepwfjgg  于 2023-03-29  发布在  Kubernetes
关注(0)|答案(1)|浏览(110)

我有一个包含三个子图表的父图表:subchart 01,subchart 02,subchart-main。在我的subchart-main中,我有一个configmap.yaml模板,它需要基于其他子图表创建一个json字符串:

configmap.yaml

kind: ConfigMap
data:
  appsettings.json: |-
    {
      "Services": [
        {
          "Name": {{ .Values.service1.name }}
          "Endpoint": "{{ .Values.service1.endpoint }}:5080"
        },
        {
          "Name": {{ .Values.service2.name }}
          "Endpoint": "{{ .Values.service2.endpoint }}:5081"
        },
      ]
    }

然后,我有以下值.yaml文件在父图表文件夹中,但它没有工作.

values.yaml

subchart-main:
  service1:
    name: {{ template .Release.name .Subcharts.subchart01 }}
    endpoint: {{ template "subchart01.fullname" .Subcharts.subchart01 }}
  service2:
    name: {{ template .Release.name .Subcharts.subchart02 }}
    endpoint: {{ template "subchart02.fullname" .Subcharts.subchart02 }}

任何帮助都将不胜感激。

9udxz4iz

9udxz4iz1#

重要
official documentation a子图表中所述
1.子图表被认为是“独立的”,这意味着子图表永远不能显式地依赖于其父图表。
1.因此,子图表不能访问其父图表的值。
1.父图表可以覆盖子图表的值。

  1. Helm有一个全局值的概念,所有图表都可以访问。

你能做什么

您可以使用global值并将helm模板语法({{ .Values.global.example }})作为值传递给子图表。
因此,在主图表的values.yaml文件中,您可以控制、覆盖和共享所有值,而子图表保持独立。

代码

你可以在github上找到完整的例子:https://github.com/Hadsch/helm-share-values-demo

  • mychart/Chart.yaml*
apiVersion: v2
  name: mychart
  • mychart/values.yaml* myValue:父代价值
global:
  service1:
    # Define name and endpoint for service1
    name: "my-service-1 SHARED"
    endpoint: "my-service-1-endpoint SHARED"
  service2:
    # Define name and endpoint for service1
    name: "my-service-2"
    endpoint: "my-service-2-endpoint"

subchart-main:
  service1:
    # Pass the values from global.service1 to subchart-main as a "string" using the template syntax
    name: "{{ .Values.global.service1.name }}"
    endpoint: "{{ .Values.global.service1.endpoint }}"

subchart01:
  # Pass the values from global.service1 to subchart01 as a "string" using the template syntax
  name: "{{ .Values.global.service1.name }}"
  endpoint: "{{ .Values.global.service1.endpoint }}"
  • 我的图表/图表/子图表-主图表/图表.yaml*
apiVersion: v2
name: subchart-main
  • mychart/图表/子图表-主/值.yaml*
    **重要提示:**如果作为子图安装,这些值将被mychart/values.yaml中定义的值覆盖。如果单独安装,将使用此处定义的值。
service1:
  name: "My Service 1"
  endpoint: "My Service 1 endpoint"

service2:
  name: "My Service 2"
  endpoint: "My Service 2 endpoint"
  • mychart/charts/subchart-main/templates/subchart-main.yaml*
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-cfg-subchart-main
data:
  # Important: The values containing the template syntax. Therefore the template function is required to get the defined values in the global section.
  name: {{ tpl .Values.service1.name . }}
  endpoint: {{ tpl .Values.service1.endpoint . }}
  • mychart/charts/subchart01/values.yaml*

与subchart-main相同:值将被覆盖!

name: "subchart-01"
endpoint: "subchart-01-endpoint"
  • mychart/charts/subchart01/templates/subchart01-cfg.yaml*
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-cfg-subchart01
data:
  name: {{ tpl .Values.name . }}
  endpoint: {{ tpl .Values.endpoint . }}

测试运行的输出

$ helm install my-test --dry-run mychart
NAME: my-test
NAMESPACE: my-test-namespace
STATUS: pending-install
REVISION: 1
TEST SUITE: None
HOOKS:
MANIFEST:
---
# Source: mychart/charts/subchart-main/templates/subchart-main.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-test-cfg-subchart-main
data:
  name: my-service-1 SHARED
  endpoint: my-service-1-endpoint SHARED
---
# Source: mychart/charts/subchart01/templates/subchart01-cfg.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-test-cfg-subchart01
data:
  name: my-service-1 SHARED
  endpoint: my-service-1-endpoint SHARED
---
# Source: mychart/templates/parent.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-test-cfg-parent
data:
  my-value: value-for-parent

相关问题