使用Secret Store CSI驱动程序将AKV变量获取到应用程序中



更新我的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中,有一个按文件键配置提供程序

但如果你在本地开发中没有以同样的方式安装秘密,那么代码库就会存在差异。

是的,这是正确的,对于您在开发和生产中所做的任何不同的事情都是正确的。如果您想避免差异,请在开发和生产中使用相同的机制,通过环境变量或文件向应用程序提供秘密值。

最新更新