首页 > 解决方案 > 多次安装单个 Kubernetes 部署

问题描述

我有一个 Helm 图表,它安装不同的 kubernetes 资源来部署我的应用程序。其中一种资源是具有两种风格的部署,一种用于应用程序的客户端部分,另一种用于服务器部分,因此实际上它们是两种部署。它们的大多数清单(yaml 文件)完全相同,唯一重要的区别是每个都引用不同的 configmap,以便为某些 configmap 属性(特别是类型:客户端/服务器和副本数)提供特定值. 这似乎不是很有效,因为我正在为部署复制代码,但这是我发现的方法。另一方面,对于配置图,我使用了 Helm 的模板功能({{ include }}) 所以我有一个“主”配置映射模板,它包含所有常见内容,以及两个单独的配置映射,指定每个部署的差异并包括主模板。

到目前为止一切顺利,即使可能存在一些不必要的代码重复,在这种情况下我不知道如何改进。

问题是上述两种部署的多种变体开始发挥作用。例如,我可能想要部署一个属性 X 具有特定值的客户端类型 pod,以及属性 X 具有不同值的两个服务器类型 pod。因此,按照我的方法,我将不得不开始创建更多部署 yaml 文件以涵盖所有可能的组合:type=client & X=Y, type=client & X=Z, type=server & X=Y, type=server & X =Z 等等。这样做的唯一目的是能够为每种类型或组合指定我想要多少个副本。

有没有办法(使用 Helm 或其他 Kubernetes 相关框架)拥有一个部署 yaml 文件并能够多次安装它,只指定变化的属性和该变化的副本数量?

例如:

我想:

其中 type 和 X 是某些 configmap 中的属性(数据)。

希望它足够清楚,否则请告诉我,谢谢。

标签: kuberneteskubernetes-helm

解决方案


在 Helm 中有几种方法可以解决这个问题。您需要将设置带到 Helm 的配置层(它们将位于values.yaml或通过类似的机制提供helm install --set);您无法将它们从 ConfigMap 中提取出来。

一种方法是让您的 Helm chart 仅安装一个 Deployment 实例和相应的 ConfigMap。有一个templates/deployment.yaml包含以下行的文件:

name: {{ .Release.Name }}-{{ .Chart.Name }}-{{ .Values.type }}-{{ .Values.X }}

replicas: {{ .Values.replicas }}

env:
  - name: TYPE
    value: {{ .Values.type }}
  - name: X
    value: {{ quote .Values.X }}

然后你可以部署它的多个副本:

helm install c1 . --set type=client --set X=1 --set replicas=3
helm install s1 . --set type=server --set X=1 --set replicas=2

您提到您已经使用模板生成类似的 ConfigMap,您也可以对任何 YAML 结构使用相同的方法。模板采用单个参数,一个可能的技巧是将列表作为该参数传递。要记住的另一个重要细节是,顶级名称 like.Values实际上是特殊对象中的字段查找.,可以在多个上下文中重新分配,因此您可能需要显式传递并引用顶级对象。

假设您的模板需要顶级值,以及一些额外的配置设置:

{{- define "a.deployment" -}}
{{- $top := index . 0 -}}
{{- $config := index . 1 -}}
metadata:
  name: {{ include "chart.name" $top }}-{{ $config.type }}-{{ $config.X }}
{{ end -}}

请注意,我们从单个列表参数中解压缩两个值,然后传入$top我们可能希望.作为参数传递的位置。

您可以拥有每个变体的顶级文件。例如,templates/deployment-server-1.yaml可能包含:

{{- $config := dict "type" "server" "X" "1" -}}
{{- include "a.deployment" (list . $config) -}}

.是顶级对象;我们将它和配置字典嵌入到单个列表参数中,以匹配模板的期望。dict如果在 Helm 配置中指定了某些值,则可以在调用中使用任何模板构造。

最后,实际上并没有规定 YAML 文件只包含一个对象。如果您的 Helm 配置仅列出了变体,您可以遍历它们并将它们全部发出:

{{-/* range will reassign . so save its current value */-}}
{{- $top := . -}}
{{- range .Values.installations -}}
{{-/* Now . is one item from the installations list */-}}
{{-/* This is the YAML start-of-document marker: */-}}
---
{{ include "a.deployment" (list $top .) -}}
{{- end -}}

您只需列出 Helm 中的所有变体和设置values.yaml(或者,再次列出外部提供的helm install -f more-values.yaml文件):

installations:
  - type: client
    X: 1
    replicas: 3
  - type: server
    X: 1
    replicas: 2

推荐阅读