我们在 AKS 集群中配置了 CSI 驱动程序以进行秘密管理,如下所示。
helm 值文件。
keyvault:
enabled: true
tenantid: "#{tenantid}#"
clientid: "#{spid}#"
clientsecret: "#{spsecret}#"
secrets:
- MY-SECRET-1
- MY-SECRET-2
- COMMON-SECRET-1
- COMMON-SECRET-2
Secretprovider类模板如下。
spec:
provider: azure
secretObjects:
- data:
{{- range .Values.keyvault.secrets }}{{/* <-- only one range loop */}}
- key: {{ . }}
objectName: {{ $.Release.Name | upper }}-{{ . }}
{{- end }}
secretName: {{ $.Release.Name }}-kvsecret
type: opaque
parameters:
usePodIdentity: "false"
useVMManagedIdentity: "false"
userAssignedIdentityID: ""
keyvaultName: {{ .Values.keyvault.name | default "mykv" }}
objects: |
array:
{{- range .Values.keyvault.secrets }}{{/* <-- only one range loop */}}
- |
objectName: {{ $.Release.Name | upper }}-{{ . }}
objectType: secret
{{- end }}
tenantId: {{ .Values.keyvault.tenantid }}
{{- end }}
{{- end -}}
部署helm模板envt变量部分
env:
{{- if eq .Values.keyvault.enabled true }}
{{- range .Values.keyvault.secrets }}{{/* <-- only one range loop */}}
- name: {{ regexReplaceAll "\\W+" . "_" }}
valueFrom:
secretKeyRef:
name: {{ $.Release.Name }}-kvsecret
key: {{ . }}
{{- end }}
{{- end }}
{{- if eq .Values.keyvault.enabled true }}
volumeMounts:
- name: {{ $.Release.Name }}-volume
mountPath: '/mnt/secrets-store'
readOnly: true
{{- end }}
设置工作正常。但是有两件事我有问题。
所以为了在模板中隔离 App 特定的键名,我们在模板中使用了发布名称前缀,这样只有那些来自 keyvault 的 appspecific 键名才会被用于创建 secretproviderclass 对象。
但是,这又导致了更多与密钥库中应用程序的通用密钥名称相关的工作。因为我们已经为发布名称添加了前缀,所以我们必须用不同的应用程序名称重复相同的键名作为前缀来选择它们。
所以在 helm 模板中寻找一种方法,我们应该能够从 keyvault 和应用程序特定的密钥名称(以 releasename 为前缀)中获取通用密钥名称(不带 appname 前缀)。有什么指导吗?