Helm图表定义了帮助程序模板,_helpers.tpl其中用于为服务创建规范化名称.服务(DNS)名称模板的标准格式为:
{{- define "postgresql.fullname" -}}
{{- $name := default .Chart.Name .Values.nameOverride -}}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
{{- end -}}
Run Code Online (Sandbox Code Playgroud)
如果使用postgresql作为子图,您应该如何使用基于DNS的服务发现来引用它?一种常见的模式似乎是将子图助手复制到父图表中.
{{- define "keycloak.postgresql.fullname" -}}
{{- $name := default "postgresql" .Values.postgresql.nameOverride -}}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
{{- end -}}
Run Code Online (Sandbox Code Playgroud)
这是完全疯狂的原因显而易见!!!
当然有更好的方法来使用子图助手?如果你可以创建一个上下文对象,那么就可以调用它,例如:
value: {{ template "postgresql.fullname" ({Chart: {Name: 'not-used'}, Release: {Name: .Release.Name}, Values: { nameOverride: .Values.postgresql.nameOverride}}) }}
Run Code Online (Sandbox Code Playgroud)
可悲的是,我不知道如何动态地创建这样的上下文.如果辅助函数更改为引用新属性,这仍然会中断,但显而易见.
或者,从子图中提供服务名称的另一种方法是什么?
我目前正在为多容器应用程序编写 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 }}
[...]
Run Code Online (Sandbox Code Playgroud)
我现在想要做的是能够设置一些特定于应用程序的值(以 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
[...]
Run Code Online (Sandbox Code Playgroud)
我的想法是我将“默认”部分中的值用于应用程序,除非在相应应用程序的部分中指定了特定于应用程序的值。在我的示例中,我有一个用于 applicationA 的内存请求的自定义值和一个用于应用程序 B 的 CPU 请求的自定义值,但所有其他值都应来自默认部分。也可能存在根本没有定义应用程序特定设置的应用程序(在这种情况下,所有内容都来自 values.yaml 的默认部分)。“索引”功能似乎允许我做我想做的事情,所以在我的模板中,我尝试了这个(为了可读性而换行):
resources: …Run Code Online (Sandbox Code Playgroud)