使用 Secret Store CSI Driver 将 AKV 变量导入应用程序
Getting AKV variables into an application with Secret Store CSI Driver
更新我的 CSI Secrets Store 驱动程序,如下所述:
https://docs.microsoft.com/en-us/azure/aks/csi-secrets-store-driver
我之前通过 usign secretObjects
使用过它,我用它完成了:
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 秘密环境变量。
但是,文档中的这种方法似乎是事后才想到的(“你有时可能......”而不是“你必须”):
我认为这表明只需将机密安装到 Pod 就足够了,创建它们的 Kubernetes 机密是无关紧要的。
我的问题是:
如果您只是将秘密安装到 Pod,如果它们不是环境变量,您应该如何从应用程序代码访问它们?
可以通过以下方式访问它们:
kubectl exec busybox-secrets-store-inline -- cat /mnt/secrets-store/ExampleSecret
所以我想在 Python、JavaScript 等中你可以做任何类似的命令来读取秘密而不是 os.environ['ExampleSecret']
。但是,如果您在本地开发中没有以相同的方式安装机密,那么代码库中就会存在差异。
只是想对此进行澄清。
如果您只是将 secrets 挂载到 pod,则 secret 将作为挂载位置上的文件提供
- 文件名 将是机密的名称(或您在机密提供程序中指定的别名 class)
- 文件的内容将是秘密值。
要访问和使用代码中的机密,您需要读取文件以检索机密值。许多框架内置了将此类结构映射到配置对象的功能,例如在 .NET 中有 Key-per-file configuration provider
But if you aren't mounting secrets the same way in local development, there's disparity in the code base.
是的,这是正确的,对于您在开发和生产中所做的任何不同的事情都是如此。如果您想避免差异,请使用相同的机制通过环境变量或文件为开发和生产中的应用程序提供秘密值。
更新我的 CSI Secrets Store 驱动程序,如下所述:
https://docs.microsoft.com/en-us/azure/aks/csi-secrets-store-driver
我之前通过 usign secretObjects
使用过它,我用它完成了:
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 秘密环境变量。
但是,文档中的这种方法似乎是事后才想到的(“你有时可能......”而不是“你必须”):
我认为这表明只需将机密安装到 Pod 就足够了,创建它们的 Kubernetes 机密是无关紧要的。
我的问题是:
如果您只是将秘密安装到 Pod,如果它们不是环境变量,您应该如何从应用程序代码访问它们?
可以通过以下方式访问它们:
kubectl exec busybox-secrets-store-inline -- cat /mnt/secrets-store/ExampleSecret
所以我想在 Python、JavaScript 等中你可以做任何类似的命令来读取秘密而不是 os.environ['ExampleSecret']
。但是,如果您在本地开发中没有以相同的方式安装机密,那么代码库中就会存在差异。
只是想对此进行澄清。
如果您只是将 secrets 挂载到 pod,则 secret 将作为挂载位置上的文件提供
- 文件名 将是机密的名称(或您在机密提供程序中指定的别名 class)
- 文件的内容将是秘密值。
要访问和使用代码中的机密,您需要读取文件以检索机密值。许多框架内置了将此类结构映射到配置对象的功能,例如在 .NET 中有 Key-per-file configuration provider
But if you aren't mounting secrets the same way in local development, there's disparity in the code base.
是的,这是正确的,对于您在开发和生产中所做的任何不同的事情都是如此。如果您想避免差异,请使用相同的机制通过环境变量或文件为开发和生产中的应用程序提供秘密值。