我们在集群中配置了用于秘密管理的CSI驱动程序,并使用下面的秘密提供程序类模板自动将秘密分配给部署环境变量。以上设置工作正常。
但是我有两个问题。每当对秘密进行新的更改时,例如向YAML和密钥库添加新的秘密时,下一个版本将使用helm升级命令失败,说明未找到指定的秘密。
所以为了解决这个问题,我必须卸载所有的helm release,并且需要再次安装helm release,这意味着停机时间,我如何在没有任何停机时间的情况下实现这个场景?
其次,当秘密模板发生变化时,是否有什么建议的方法来重启pod:
的值。
keyvault:
name: mykv
tenantId: ${tenantId}$
clientid: "#{spid}#"
clientsecret: "#{spsecret}#"
secrets:
- MyAPPA_SECRET1_NAME1
- MyAPPA_SECRET2_NAME2
- MyAPPA_SECRET3_NAME3
部署。yaml, ENV部分如下
{{- if eq .Values.keyvault.enabled true }}
{{- range .Values.keyvault.secrets }}{{/* <-- only one range loop */}}
- name: {{ . }}
valueFrom:
secretKeyRef:
name: {{ $.Release.Name }}-kvsecret
key: {{ . }}
{{- end }}
{{- end }}
volumeMounts:
- name: {{ $.Release.Name }}-volume
mountPath: '/mnt/secrets-store'
readOnly: true
volumes:
- name: {{ $.Release.Name }}-volume
csi:
driver: 'secrets-store.csi.k8s.io'
readOnly: true
volumeAttributes:
secretProviderClass: {{ $.Release.Name }}-secretproviderclass
nodePublishSecretRef:
name: {{ $.Release.Name }}-secrets-store-creds
secretProviderClass的yaml文件如下所示。
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
name: {{ $.Release.Name }}-secretproviderclass
labels:
app: {{ $.Release.Name }}
chart: "{{ $.Release.Name }}-{{ .Chart.Version }}"
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
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 "mydev-kv" }}
objects: |
array:
{{- range .Values.keyvault.secrets }}{{/* <-- only one range loop */}}
- |
objectName: {{ $.Release.Name | upper }}-{{ . }}
objectType: secret
{{- end }}
tenantId: {{ .Values.keyvault.tenantid }}
{{- end }}
{{- end -}}
{{- define "commonobject.secretproviderclass" -}}
{{- template "commonobject.util.merge" (append . "commonobject.secretproviderclass.tpl") -}}
{{- end -}}
问题不在"头盔升级"。命令。我发现这是CSI驱动程序或SecretProviderClass的限制。当已经创建部署时,会更新SecretProviderClass资源,但是会更新SecretProviderClassPodStatuses">
更新秘密的两个可能的解决方案:
- delete secret and restart/create pod =>这是有效的,但它听起来更像是一个变通而不是一个实际的解决方案
- 设置enableSecretRotation为true =>它最近已经在CSI驱动程序中实现了,并且处于"alpha"版本
https://secrets-store-csi-driver.sigs.k8s.io/topics/secret-auto-rotation.html
编辑:
最后,我用这个命令使用自动秘密旋转在Azure Kubernetes服务中:
az aks addon update -g [resource-group] -n [aks-name] -a azure-keyvault-secrets-provider --enable-secret-rotation --rotation-poll-interval 0.5m
您可以使用以下命令检查该选项是否已启用:
az aks addon show -g [resource-group] -n [aks-name] -a azure-keyvault-secrets-provider
更多信息在这里:https://learn.microsoft.com/en-us/azure/aks/csi-secrets-store-driver enable-and-disable-autorotation