如何通过Kustomize为Azure Kubernetes Service的SecretProviderClass资源实现多环境objectName字段覆写?
问题分析与解决方案
你遇到的问题根源在于原清单里的spec.parameters.objects是一个多行字符串,而非结构化的YAML数组,Json6902补丁只能操作结构化的Kubernetes资源字段,无法穿透字符串去修改内部的内容,所以你的补丁路径根本指向不存在的节点,自然不会生效。
下面提供两种可行的解决方案,你可以根据自己的场景选择:
方案1:将基础清单的objects改为结构化数组(推荐)
Secrets Store CSI Driver的Azure Provider实际上支持将objects定义为结构化数组,而非必须用字符串包裹。修改你的基础清单,把objects从字符串改成数组:
apiVersion: secrets-store.csi.x-k8s.io/v1alpha1 kind: SecretProviderClass metadata: name: azure-kvname spec: provider: azure secretObjects: - data: - key: dbuser objectName: db-user - key: dbpassword objectName: db-pass - key: admin objectName: admin-user - key: adminpass objectName: admin-password secretName: secret type: Opaque parameters: usePodIdentity: "true" keyvaultName: "dev-keyvault" cloudName: "" # 改成结构化数组,去掉字符串包裹 objects: - objectName: db-user objectType: secret objectVersion: "" - objectName: db-pass objectType: secret objectVersion: "" - objectName: admin-user objectType: secret objectVersion: "" - objectName: admin-password objectType: secret objectVersion: "" tenantId: "XXXXXXXXXXXX"
之后你的原Json6902补丁就能正常生效了,因为现在objects是真正的数组字段,补丁路径/spec/parameters/objects/0/objectName是有效的。
方案2:直接替换整个objects字符串(无需修改基础清单)
如果无法修改基础清单,你可以在Kustomize的Overlay里直接替换整个objects字符串的内容。在你的overlay目录下的kustomization.yaml中添加如下补丁:
patches: - target: kind: SecretProviderClass name: azure-kvname patch: |- - op: replace path: /spec/parameters/objects value: | array: - | objectName: dev-db-user objectType: secret objectVersion: "" - | objectName: dev-db-password objectType: secret objectVersion: "" - | objectName: dev-admin-user objectType: secret objectVersion: "" - | objectName: dev-admin-password objectType: secret objectVersion: ""
这个补丁会直接替换objects字段的整个字符串值,把里面的所有objectName替换成你需要的环境专属值。
另外,别忘了同步修改secretObjects里的objectName(比如把db-user改成dev-db-user),否则CSI驱动会找不到对应的密钥。你可以同样用Json6902补丁来处理这部分:
- op: replace path: /spec/secretObjects/0/data/0/objectName value: "dev-db-user" - op: replace path: /spec/secretObjects/0/data/1/objectName value: "dev-db-password" - op: replace path: /spec/secretObjects/0/data/2/objectName value: "dev-admin-user" - op: replace path: /spec/secretObjects/0/data/3/objectName value: "dev-admin-password"
这样就能保证secretObjects里的映射和Key Vault里的密钥名称一致了。
内容的提问来源于stack exchange,提问作者dywan666
相关产品推荐
相关产品推荐

