我正在Azure中设置Keyvault与k8s的集成。我可以在Azure中使用托管身份使用csi驱动程序挂载带有秘密的卷。我可以通过执行命令进入舱内,找出秘密来验证秘密是否被安装。然而,现在我想将秘密公开为环境变量,但我不清楚如何做到这一点。下面是我已经部署的SecretProviderClass
和Pod
。
spc-keyvault.yaml:
apiVersion: secrets-store.csi.x-k8s.io/v1alpha1
kind: SecretProviderClass
metadata:
name: spc-keyvault
spec:
provider: azure
secretObjects:
- secretName: foobar-secret
data:
- key: foobar
objectName: foobar
type: Opaque
parameters:
keyvaultName: "$keyvault"
usePodIdentity: "true"
useVMManagedIdentity: "false"
userAssignedIdentityID: ""
cloudName: ""
objects: |
array:
- |
objectName: foobar
objectType: secret
objectVersion: ""
resourceGroup: "$resourceGroup"
subscriptionId: "$subId"
tenantId: "$tenantId"
pod.yaml:
apiVersion: v1
kind: Pod
metadata:
name: inject-secrets-from-akv
labels:
aadpodidbinding: azure-pod-identity-binding-selector
spec:
containers:
- name: nginx
image: nginx
env:
- name: SECRET
valueFrom:
secretKeyRef:
name: foobar-secret
key: foobar
volumeMounts:
- name: secrets-store-inline
mountPath: "/mnt/secrets-store"
readOnly: true
volumes:
- name: secrets-store-inline
csi:
driver: secrets-store.csi.k8s.io
readOnly: true
volumeAttributes:
secretProviderClass: spc-keyvault
这是错误时,我部署我的Pod清单:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning Failed 58m (x227 over 108m) kubelet Error: secret "foobar-secret" not found
Normal Pulling 3m51s (x470 over 108m) kubelet Pulling image "nginx"
错误很明显,没有命名为:foobar-secret
的秘密。我以为csi驱动程序会自动创建所需的秘密。因此,在进行了一些研究并深入研究了文档和源代码之后,我发现了在pod yaml中添加nodePublishSecretRef
的建议。然后,您需要使用ad客户端id和客户端秘密来设置nodePublishSecretRef
。[1,2]然而,由于我使用的是托管身份,我不确定如何做到这一点。
有没有人得到这个工作使用管理身份,可以提供任何见解?或者我是否需要创建一个启动脚本(通过configmap?)来将卷装入为env。变量。
- https://azure.github.io/secrets-store-csi-driver-provider-azure/configurations/identity-access-modes/service-principal-mode/
- https://medium.com/swlh/integrate-azure-key-vault-with-azure-kubernetes-service-1a8740429bea
经过更多的挖掘,我发现在helm图表中有一点可以让csi驱动程序创建k8s秘密:
secrets-store-csi-driver.syncSecret.enabled = true
现在我有了k8s的秘密。我想我会分享给其他想要这个功能的人。
我可以通过更新entrypoint.sh将秘密导出到环境变量来解决这个问题。像这样:
if [ ! -z ${SECRET_PATH+x} ]
then
echo "Exporting secrets as env. variables."
for f in $(ls ${SECRET_PATH})
do
echo "Exporting $f..."
export $f=$(cat ${SECRET_PATH}/$f)
done
fi