我试图弄清楚为什么 Helm 升级在配置为不创建新的秘密 cookie 时总是创建新的秘密 cookie,如果具有该值的秘密已存在于部署中。
我在库图表中定义了以下模板函数:
{{ include "my-lib.messaging.secrets" ( dict "global" .Values.global "messagingService" .Values "release" .Release ) }}
*/}}
{{- define "my-lib.messaging.secrets" -}}
{{- $secretObj := (lookup "v1" "Secret" .release.Namespace "messaging-secret") | default dict }}
{{- if .global.config.enabled }}
{{- $secretObj := (lookup "v1" "Secret" .release.Namespace "global-secret") | default dict }}
{{- end }}
{{- $secretData := (get $secretObj "data") | default dict }}
{{- $cookie := (get $secretData "messaging.cookie") | default (randAlphaNum 32) }}
messaging.cookie: "{{ $cookie }}"
{{- end }}
这里的期望是,如果
messaging-secret
(或global-secret
)存在并且包含messaging.cookie
,则不会改变,将使用相同的值,否则将生成新的值。
当我安装图表时,我得到以下内容
global-secret
:
apiVersion: v1
data:
messaging.cookie: cXJSS2N6TDB2VGF4bzR4YWhEVzVuVXB2dzZMbWFzSWg=
kind: Secret
metadata:
annotations:
meta.helm.sh/release-name: test
meta.helm.sh/release-namespace: test
creationTimestamp: "2023-08-07T18:43:33Z"
labels:
app.kubernetes.io/managed-by: Helm
name: global-secret
namespace: test
resourceVersion: "18494964"
uid: 3701e400-697c-48de-8eb9-c695ae624542
type: Opaque
但是当我进行 Helm 升级时,会生成新值,尽管它不应该:
apiVersion: v1
data:
messaging.cookie: Mk5DbThHRDRlSGRVNG1XQWZyTGJVSENtZWlWRGhvR3Y=
kind: Secret
metadata:
annotations:
meta.helm.sh/release-name: test
meta.helm.sh/release-namespace: test
creationTimestamp: "2023-08-07T18:43:33Z"
labels:
app.kubernetes.io/managed-by: Helm
name: global-secret
namespace: test
resourceVersion: "18495726"
uid: 3701e400-697c-48de-8eb9-c695ae624542
type: Opaque
Helm 值包含:
global:
config:
enabled: true
并且
global-secret.yaml
模板包含以下内容:
apiVersion: v1
kind: Secret
metadata:
name: global-secret
stringData:
{{- include "my-lib.messaging.secrets" (dict "global" .Values.global "messagingService" .Values.messagingService "release" .Release) | indent 2 }}
我假设
lookup
将正确识别数据并使用它,而不是生成新的随机值。有人可以指出问题出在哪里吗?
在尝试了多种选择使其发挥作用后,这是一个愚蠢的错误:D 由于第二个赋值中存在
secretObj
,因此 global-secret
变量根本没有被 :
覆盖。因此,Helm 无法使用新值,并且它为 null。
解决方案,不要声明相同的变量,使用现有的,意思是:
{{- $secretObj := (lookup "v1" "Secret" .release.Namespace "messaging-secret") | default dict }}
{{- if .global.config.enabled }}
{{- $secretObj := (lookup "v1" "Secret" .release.Namespace "global-secret") | default dict }}
{{- end }}
应该是:
{{- $secretObj := (lookup "v1" "Secret" .release.Namespace "messaging-secret") | default dict }}
{{- if .global.config.enabled }}
{{- $secretObj = (lookup "v1" "Secret" .release.Namespace "global-secret") | default dict }}
{{- end }}
最终,非常简单的修复!