我正在尝试在 azure keyvault 和我的 pod 之间同步 secret 。这是我的设置。
在容器中,我有 application.properties 引用环境 secret TESTTOKEN
已将 TESTTOKEN(不带 keyvault 的值)添加到我的部署 yml (env),并且我能够成功运行微服务
已按照 Azure 步骤设置 CSI here
创建一个 SecretProviderClass 如下
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
name: azure-kvname-user-msi
namespace: myspace
spec:
provider: azure
parameters:
usePodIdentity: "false"
useVMManagedIdentity: "true"
userAssignedIdentityID: "abcd-123"
keyvaultName: "my-kv-app"
cloudName: ""
objects: |
array:
- |
objectName: TESTTOKEN
objectType: secret
objectVersion: ""
tenantId: "12345_tenant_id"
- 在我的部署 yaml 中,我尝试挂载卷并使用同步 key
kind: Deployment
apiVersion: apps/v1
metadata:
labels:
app: test-microservice
name: testmsr
namespace: myspace
spec:
replicas: 1
selector:
matchLabels:
app: test-microservice
template:
metadata:
labels:
app: test-microservice
spec:
containers:
- name: test-microservice
image: cntrregistry-location/testmsr:v2.0.0
imagePullPolicy: Always
ports:
- containerPort: 8183
env:
- name: TESTTOKEN #Incorrect, but I do not know how to map
valueFrom:
secretKeyRef:
name: TESTTOKEN
key: TESTTOKEN
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: "azure-kvname-user-msi"
应用 yaml 时,pod 显示 ContainerCreation 错误。我尝试修改部署 yml 中的 env,但没有清楚地理解它只是失败。
我无法获取事件的顺序,即部署时仅会安装 secret ,因此它如何可用于 env,何时创建 k8s secret (是否有必要?)或从库中创建,无需k8s 的 secret 。
任何指针都会有帮助。
谢谢
最佳答案
在 SecretProviderClass 中,通常不需要 cloudName
,除非您使用的是 Azure 国家云。
您设置 volumeMounts
的方式是正确的。
ENV
部分是您的 yaml 中似乎存在问题的地方。环境变量(TESTTOKEN)应指向安装 secret 的路径。例如:
env:
- name: TESTTOKEN
value: /mnt/secrets-store/TESTTOKEN
您的应用程序应编码为从文件/mnt/secrets-store/TESTTOKEN 读取 secret ,而不是直接从环境变量中读取 secret 。
还有
要将 Azure Key Vault secret 与 native Kubernetes secret 同步,您需要:
使用
secretObjects
更新 SecretProviderClass:您需要在
SecretProviderClass
定义中添加secretObjects
部分。这将指示 Secret Store CSI 驱动程序将已安装的 Secret 与 Kubernetes native Secret 同步。apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: azure-kvname-user-msi namespace: myspace spec: provider: azure parameters: usePodIdentity: "false" useVMManagedIdentity: "true" userAssignedIdentityID: "abcd-123" keyvaultName: "my-kv-app" secretObjects: - secretName: testtoken-k8s-secret type: Opaque data: - objectName: TESTTOKEN key: TESTTOKEN
secretName
:将创建或更新的 Kubernetes native key 的名称。type
:要创建的 Kubernetes key 的类型。通常,对于一般 secret 来说,它是不透明
的。数据
:objectName
:这应与objects
部分中的objectName
(Azure Key Vault 中的 key 名称)匹配。key
: key 将存储在 Kubernetes key 中。
更新部署以使用 Kubernetes key :
修改部署,以便它从 Kubernetes native secret 中读取 secret 。
kind: Deployment
...
spec:
...
containers:
...
env:
- name: TESTTOKEN
valueFrom:
secretKeyRef:
name: testtoken-k8s-secret
key: TESTTOKEN
现在,CSI 驱动程序会将 Azure Key Vault 中的 key 同步到 myspace
命名空间中名为 testtoken-k8s-secret
的 Kubernetes native key 。然后,您的部署将从该 Kubernetes key 中读取 TESTTOKEN
的值,并将其设置为容器的环境变量。
关于azure - 将 key 从 Keyvault 同步到 Azure AKS 群集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76869470/