shards:
- name: "db1"
url: "url1"
login: "login1"
password: "password1"
- name: "db2"
url: "url2"
login: "login2"
password: "password2"
部署。
{{- range $name, $val := .Values.shards }}
env:
- name: DB_URL
value: {{ $val.url }}
- name: DB_LOGIN
value: {{ $val.login }}
- name: DB_PASSWORD
value: {{ $val.password }}
{{- end }}
我有两个任务:将碎片配置转换为global-config/values.yaml。 将所有敏感数据从global-config/values.yaml(在碎片下)移动到Global-Config/Secrets.yaml中的秘密。 结果,Some-Module1,Some-Module2和Some-Module3应该从全局配置中读取碎片数据(即,循环应该看起来像{{ - rangage $ name,$ val,$ val:= .values.global.global.shards.shards }}),所有敏感数据均应从秘密来源。
这可能吗?如果是,我该如何实现?
这里有几个部分,有些比其他部分更容易。
重复的输出块。
如果您在几个地方重复的输出yaml块相同,则可以将其拆分为namemedtemplate。 例如,
{{/* env.db generates part of an env: block that sets database-specific
parameters. Takes a shard object as a parameter. Unindented, ends
with a newline. */}}
{{- define "env.db" -}}
- name: DB_URL
value: {{ .url }}
- name: DB_LOGIN
value: {{ .login }}
- name: DB_PASSWORD
value: {{ .password }}
{{ end -}}
{{- range $name, $val := .Values.shards }}
env:
{{ include "env.db" $val | indent 2 }}
{{- end -}}
。 这可能就像将
{{ define }}...{{ end }}
块移入现有global-secrets/templates/_helpers.tpl
文件一样。 主要图表需要在其Chart.yaml
文件中包含对库图表的依赖性,但是他们可以以完全相同的方式调用模板。
您可以任意传递许多.Values
选项以添加值时添加图表时,并且除图表的
helm install -f
文件外还使用这些文件。 这里可能的设置是您的CD系统可以从秘密商店中提取凭据并将其写出为yaml(或JSON)文件,然后运行values.yaml
I会避免将这些值放在the topecialhelm upgrade --install mod1 ./some-module1 --namespace mod1 \
-f values-credentials.yaml
顶键
下;仅当您具有多个嵌套图表或设置的多个层次相同的组件中的多个组件中的多个嵌套图表或设置时,这才是有用的。 另请注意(请参阅同一文档链接),依赖关系的设置不会向上传播到主图表:如果凭据在
global:
中,并且主要图表依赖于它们,则主图(包括global:
呼叫,以上)将无法看到这些值。
用秘密而不是掌舵价值。 如果可以的话,我会避免使用这样的外部依赖。 在上一节中,我建议使用某种凭据存储并具有自动化生成值的一部分,如果您没有更好可用的东西,则可以global-config/values.yaml
和base64 decode。HELM确实具有一个可以在群集中找到任意资源的功能。 原则上,您可以获得像
一样的秘密价值
include
您可以重复使用
kubectl get secret
,但是您必须为要摆脱秘密的每个价值的第二行做类似的第二行。 Helm没有一些标准的功能编程工具,例如“ MAP”,这将使更通用的解决方案成为可能。 您还必须容忍不存在秘密的情况,并弄清楚如何在不访问生产秘密的情况下开发和测试图表。 如果秘密在集群中发生变化,则舵图不会重新部署本身,您需要记住手工执行此操作。 (如果您希望部署由Kubernetes资源驱动,请考虑编写自定义操作员,也许在使用
-Kubebuilder时,一旦您开始围绕图书馆图表的复杂性,就不会更难GO是一种更具主流语言,包括单位测试框架。) 将秘密作为掌舵值的来源。 如果凭据只是一个秘密,而您没有自动化可以将其撤出,那么掌舵本身的任何内容都不会让您称其为
lookup
的一部分。 您需要如上所述调用{{- $secret := lookup "v1" "Secret" .Release.Namespace "secret-name" -}}
{{- $password := $secret.data.password | b64dec -}}
。
重申:
我会将重复的环境块打破到您控制的库图中。我不会尝试做任何事情以避免重复设置的重复块。 我将使您的部署系统从某个地方获得正确的凭据,并给它们注入一个选项。