gpt4 book ai didi

kubernetes-helm - 根据 Helm 图中的变量值动态访问值

转载 作者:行者123 更新时间:2023-12-04 14:34:22 26 4
gpt4 key购买 nike

我目前正在为多容器应用程序编写 Helm 图表。我们有一堆微服务容器(我们称它们为“应用程序”),它们在通过 K8s 处理的方式上非常相似,并且可以(因此应该)由相同的 Helm 模板处理以避免重复。另一方面,能够为不同的应用程序(例如,资源请求)单独配置某些设置是有意义的。我目前正在做这样的事情:

{{- $applications:= <obtain list of applications> }}
{{ range $app:= $applications }}
apiVersion: apps/v1
kind: StatefulSet
spec:
[...]
spec:
containers:
- name: {{ $app }}
image: {{ $.Values.image.registry }}mycompany/myproduct-{{ $app }}:{{ $.Values.image.version }}
[...]

我现在想要做的是能够设置一些特定于应用程序的值(以 K8s resources.requests.memory 或副本数为例),可以在 values.yaml 中为每个应用程序单独设置,但回退到如果未设置,则为默认值。
这个想法是在 values.yaml 中有这样一个部分:
applications:
default:
replicas: 1
resources:
requests:
memory: 512Mi
cpu: 250m
applicationA:
resources:
requests:
memory: 7Gi
applicationB:
resources:
requests:
cpu: 500m
[...]

这个想法是我将“默认”部分中的值用于应用程序,除非在相应应用程序的部分中指定了特定于应用程序的值。在我的示例中,我有一个用于 applicationA 的内存请求和一个用于应用程序 B 的 CPU 请求的自定义值,但所有其他值都应来自默认部分。也可能存在根本没有定义应用程序特定设置的应用程序(在这种情况下,所有内容都来自 values.yaml 的默认部分)。 “索引”函数似乎允许我做我想做的事,所以在我的模板中,我尝试了这个(为了可读性而换行):
resources:
requests:
memory: {{ default \
(index $.Values "applications" "default" "resources" "requests" "memory") \
(index $.Values "applications" $app "resources" "requests" "memory") }}

由于索引允许我使用我的循环变量“$app”的值从 values.yaml“取消引用”一个值,这实际上有效......唉,索引失败了
错误调用索引:nil 指针的索引
在我没有为其中一个设置指定特定于应用程序的值的情况下,解引用失败。我需要的是 index 在那种情况下不会失败,而只是返回一个空值,这样默认值就会生效。不幸的是,我似乎找不到办法做到这一点。

但也许有一种完全不同的方式来处理这个问题,所以任何想法和建议都值得赞赏。当然,作为后备,我可以在 values.yaml 中为每个应用程序明确设置每个值,但这感觉不对。

最佳答案

我对我的图表做了类似的事情,但基于环境而不是应用程序。

在我的 values.yaml :

env: dev

replicaCount:
_default: 1
staging: 2
prod: 4

在我的模板中:
  replicas: {{ pluck .Values.env .Values.replicaCount | first | default .Values.replicaCount._default }}
pluck命令返回一个列表,和 first从该列表中选择第一项。如果没有返回任何内容,则回退到 _default值(value)。所以当我运行 helm template --set env=staging ,我得到了我为我的登台环境设置的配置。

您的 values.yaml文件看起来像这样:
replicas:
_default: 1
resources:
requests:
memory:
_default: 512Mi
applicationA: 7Gi
cpu:
_default: 250m
applicationB: 500m

您的模板将具有以下内容:
memory: {{ pluck .Values.app .Values.resources.requests.memory | first | default .Values.resources.requests.memory._default }}

然后你只需要添加 --set app=applicationA到您的 Helm 命令。

我认为这使得 values.yaml或多或少可读,但模板变得有点难看。

您可能会使用 pluck 的组合使用您的原始值文件,如下所示:
{{ pluck .Values.app .Values.applications | default .Values.applications.default | toYaml | indent N }}

我没试过,所以YMMV。 (您肯定必须更改 N 以匹配插入块的缩进级别。)只是一个想法。似乎脆弱配置的潜力很大。

关于kubernetes-helm - 根据 Helm 图中的变量值动态访问值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52742241/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com