我正在 Azure 中设置 Keyvault 与 k8s 的集成。我可以使用托管标识在 Azure 中使用 csi 驱动程序装载包含机密的卷。我可以通过在 pod 中执行并找出秘密来验证秘密是否已安装。但是,现在我想将秘密公开为环境变量,但我不清楚如何做到这一点。以下是我已经部署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 驱动程序会自动创建所需的机密。因此,经过一些研究和挖掘文档和源代码后,我找到了添加nodePublishSecretRef
到 pod yaml 的建议。然后您需要nodePublishSecretRef
使用 aad 客户端 ID 和客户端密码进行设置。[1, 2] 但是,由于我使用的是托管身份,因此我不确定如何执行此操作。
有没有人使用托管身份进行这项工作并且可以提供任何见解?或者我是否需要创建一个启动脚本(通过 configmap?)以将卷安装填充为 env。变量。