Kubernetes-helm:为多个应用程序使用一个模板

Aso*_*oub 5 templates kubernetes kubernetes-helm

这就是我目前所拥有的:

基本的helm create附带一个values.yaml文件和template一个带有deployment.yaml. 该Deployment文件已被修改为管理 docker 镜像中的 spring-boot 应用程序。

现在values.yaml包含类似的东西

myApp:
  repository: myApp.mycompany.com/demo/my-app-customers
  tag: stable
Run Code Online (Sandbox Code Playgroud)

并且deployment.yaml包含

spec:
  template:
    spec:
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.myApp.repository }}:{{ .Values.myApp.tag }}"
Run Code Online (Sandbox Code Playgroud)

假设我必须管理另一个 spring-boot 应用程序,非常接近“my-app-customers”。我想我只需要添加另一行values.yaml,就像这样:

mySecondApp:
  repository: myApp.mycompany.com/demo/my-app-others
  tag: stable
Run Code Online (Sandbox Code Playgroud)

但这不起作用,deployment.yaml因为它使用.Values.myApp.repository. 这意味着我需要创建另一个文件来部署第二个应用程序deployment-others.yaml.Values.mySecondApp.repository因此,不同的应用程序不可能使用相同的模板。

  • 我是对的还是我错过了什么?
  • 是否有另一种方法可以做到这一点,或者我是否需要复制过去的类似部署(和其他)文件并为每个应用程序提供一个模板文件?

Dav*_*aze 6

执行此操作的标准方法是拥有一个second-deployment.yaml文件,该文件本质上是第一个文件的副本,但具有不同的标签和值引用。通常会放入一些模板_helpers.tpl来生成标签块之类的内容,您可以将这些模板扩展为公共环境变量,或者您可以将一些配置卸载到 ConfigMap 中以减少重复。

Helm 的模板层根本不了解 YAML 语法,因此只要每个文件生成有效的 YAML,您就可以做任何您想做的事情。这可以在单个文件中包含多个文档,并且可以通过模板生成它们。不过,这可能会变得棘手。基本轮廓可能看起来像

{{- range list .Values.myApp .Values.mySecondApp -}}
---
...
spec:
  template:
    spec:
      containers:
        - name: {{ $.Chart.Name }}
          image: "{{ .repository }}:{{ .tag }}"
...
{{ end -}}
Run Code Online (Sandbox Code Playgroud)

如果您尝试这样做,您需要注意这.是值对象的片段,而不是像通常那样的根对象;例如,请注意$.Chart.Name显式引用顶级图表名称。