kubernetes - 多次安装单个 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 文件并能够多次安装它,只指定变化的属性和该变化的副本数量?
例如:
我想:
- 3 个具有“type=client”和“X=1”的副本
- 2 个具有“type=server”和“X=1”的副本
- 4 个具有“type=client”和“X=2”的副本
- 1 个具有“type=server”和“X=3”的副本
其中 type 和 X 是某些 configmap 中的属性(数据)。
希望它足够清楚,否则请告诉我,谢谢。
解决方案
在 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
推荐阅读
- php - 多维数组在没有附加值时丢失其索引
- sql - 消除子查询以提高查询性能
- multiple-inheritance - Raku 如何处理钻石问题(多重继承)?
- c# - 如何通过实体框架中数据库的一列上的多个值与其他列上的不同值获取数据?
- android - 如何解决应用程序已在 android studio 模拟器中停止(片段寻呼机适配器)
- javascript - MongoDB 按月分组
- reactjs - 如何将管理面板添加到现有 ASP.NET Core MVC 项目
- java - 在 Java 中执行非线程安全可选操作的最快方法
- spring - Maven Failsafe 集成测试类路径
- javascript - Push duplicate items into a separate array in Javascript with for loop?