更新我的CSI Secrets Store驱动程序,如下所示:
https://learn.microsoft.com/en-us/azure/aks/csi-secrets-store-driver
我之前曾在usignsecretObjects
工作过,我用完成了这项工作
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
name: aks-akv-secret-provider
spec:
provider: azure
secretObjects:
- secretName: myapp-prod-secrets
type: Opaque
data:
- objectName: SENDGRID-API-KEY
key: SENDGRID_API_KEY
parameters:
usePodIdentity: "true"
keyvaultName: myappakvprod
cloudName: ""
objects: |
array:
- |
objectName: SENDGRID-API-KEY
objectType: secret
objectVersion: ""
tenantId: $tenantId
例如,在API的清单中,我会:
...
env:
- name: SENDGRID_API_KEY
valueFrom:
secretKeyRef:
name: myapp-prod-secrets
key: SENDGRID_API_KEY
volumeMounts:
- name: secrets-store01-inline
mountPath: /mnt/secrets-store
readOnly: true
volumes:
- name: secrets-store01-inline
csi:
driver: secrets-store.csi.k8s.io
readOnly: true
volumeAttributes:
secretProviderClass: aks-akv-secret-provider
...
然后在代码中,我会做一些类似的事情,它会起作用:
EMAIL_KEY = os.environ['SENDGRID_API_KEY']
基本上,它是将AKV秘密安装到Pod,然后创建Kubernetes秘密环境变量。
然而,文档中的这种方法似乎是经过深思熟虑的("你有时可能…",而不是"你必须"(:
https://learn.microsoft.com/en-us/azure/aks/csi-secrets-store-driver#sync-装载内容-带kubernetes秘密
我认为这表明,只需将机密安装到Pod就足够了,并且创建它们的Kubernetes机密是无关的。
我的问题是:
如果您只是将机密安装到Pod,如果它们不是环境变量,您应该如何从应用程序代码中访问它们
它们可以通过以下方式访问:
kubectl exec busybox-secrets-store-inline -- cat /mnt/secrets-store/ExampleSecret
所以我可以想象,在Python、JavaScript等中,你可以做任何类似的命令来读取秘密,而不是os.environ['ExampleSecret']
。但是,如果你在本地开发中没有以同样的方式增加秘密,那么代码库就会存在差异。
只是想澄清一下。
如果您只是将机密装载到pod,则机密将作为文件在装载位置上可用
- 文件名将是机密的名称(或您在机密提供程序类中指定的别名(
- 文件的内容将是机密值
要访问和使用代码中的机密,您需要读取文件以检索机密值。许多框架都内置了将这种结构映射到配置对象的功能,例如在.NET中,有一个按文件键配置提供程序
但如果你在本地开发中没有以同样的方式安装秘密,那么代码库就会存在差异。
是的,这是正确的,对于您在开发和生产中所做的任何不同的事情都是正确的。如果您想避免差异,请在开发和生产中使用相同的机制,通过环境变量或文件向应用程序提供秘密值。