我正在运行一个 Azure Kubernetes 服务集群。在为我的 Pod 设置环境变量的过程中,我安装了带有 Helm Chart 的
csi-secret-store-provider-azure
。第一次部署使用默认值,一切正常。我能够访问密钥库并将机密存储在附加到 Pod 的卷中。
经过一些测试后,我意识到,如果我需要添加新密钥或删除密钥,我无法重新加载附加到 Pod 的卷,但我必须删除该卷并再次部署它。这对于我的情况来说并不理想。在阅读一些文档时,我发现安装的舵图有一些可以帮助解决此问题的值。如:
csi-secrets-store-provider-azure/csi-secrets-store-provider-azure --set secrets-store-csi-driver.enableSecretRotation=true -n istio-system--set secrets-store-csi-driver.syncSecret.enabled=true
根据我的理解,启用并配置这些值后,我应该能够每 2 分钟重新同步一次我的秘密。
但不幸的是,情况并非如此,因为我开始在我的 Pod 上看到随机警告。事件中的警告如下:
Warning MountRotationFailed 22s (x25 over 4m12s) csi-secrets-store-rotation failed to get node publish secret default/secrets-store-creds, err: secrets "default/secrets-store-creds" not found
我的 yaml 部署如下所示:
SecretClassProvider.yaml
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
name: pod-service-app-config
namespace: default
spec:
provider: azure
secretObjects:
- secretName: pod-service-app-config
type: Opaque
data:
[.......] my configurations
在部署本身中,我有以下内容:
spec:
replicas: 1
selector:
matchLabels:
app: pod-service
template:
metadata:
labels:
app: pod-service
spec:
nodeSelector:
nodepool: linuxnode00
containers:
- name: pod-service
image: my-image
ports:
- containerPort: 80
env:
- name: Auth__ClientId
valueFrom:
secretKeyRef:
name: pod-service-app-config
key: KeyToFetch
volumeMounts:
- name: pod-service-app-config
mountPath: "/mnt/pod-service-app-config"
readOnly: true
restartPolicy: Always
volumes:
- name: pod-service-app-config
csi:
driver: secrets-store.csi.k8s.io
readOnly: true
volumeAttributes:
secretProviderClass: "pod-service-app-config"
nodePublishSecretRef:
name: secrets-store-creds
我设置了秘密
secret-store-creds
并且位于相同的命名空间中。但我真的不明白这里的根本原因是什么,如果有人可以对此进行一些说明,我将不胜感激。
如果您需要任何详细信息,请随时询问
看起来您已正确设置 Azure Key Vault、AKS 和 Kubernetes 机密。
csi-secrets-store-provider-azure
已安装并且最初工作正常,但您遇到了秘密旋转功能的问题。错误 MountRotationFailed
表明 CSI 驱动程序在获取节点发布机密时遇到问题,而节点发布机密是与 Azure Key Vault 通信所必需的。
确保角色分配,即确保您已使用 RBAC 在 Azure Key Vault 中为您的服务主体 (
arkokasp
) 分配了必要的角色。服务主体至少需要 Key Vault Secrets User
角色才能读取机密。
验证您的
SecretProviderClass
(pod-service-app-config
) 是否具有对 Azure Key Vault 的正确引用以及正确的 tenantId
。如果一切顺利,那么您可以继续确保您的 Kubernetes 部署使用 CSI Secret Store CSI 驱动程序成功地将这些机密装载到您的 Pod 中。
首先,确保您的
SecretProviderClass
配置正确。此类应正确引用 Azure Key Vault,并且必须指定要访问的机密,在本例中为 dbusername
。
示例 YAML。根据您自己的环境进行相应修改。
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
name: azure-kvname
namespace: default
spec:
provider: azure
secretObjects:
- secretName: my-kv-secret
type: Opaque
data:
- key: username
objectName: dbusername
parameters:
usePodIdentity: "false"
keyvaultName: "arkokv"
objects: |
array:
- |
objectName: dbusername
objectType: secret
tenantId: "id-value"
并使用
kubectl apply -f secretproviderclass.yaml
现在,部署一个使用此 Kubernetes Pod
SecretProviderClass
。
示例 yaml。您可以使用自己的部署文件对其进行修改。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-secrets-demo
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: nginx-secrets
template:
metadata:
labels:
app: nginx-secrets
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
volumeMounts:
- name: secret-volume
mountPath: "/mnt/secrets"
readOnly: true
volumes:
- name: secret-volume
csi:
driver: secrets-store.csi.k8s.io
readOnly: true
volumeAttributes:
secretProviderClass: "azure-kvname"
nodePublishSecretRef:
name: secrets-store-creds
以同样的方式使用
kubectl apply -f nginx-deployment.yaml
应用它
确认 Azure Key Vault 中存在该机密。另外,交叉检查
SecretProviderClass
YAML,假设 dbusername
和 dbpassword
都存在于您的 Key Vault 中并且权限已适当设置。
secretprovider yaml 示例。
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
name: azure-kvname
namespace: default
spec:
provider: azure
secretObjects:
- secretName: example-secret
type: Opaque
data:
- key: username # Key used in your Kubernetes secret to reference dbusername
objectName: dbusername # Name of the secret in Azure Key Vault
- key: password # Key used in your Kubernetes secret to reference dbpassword
objectName: dbpassword # Name of the secret in Azure Key Vault
parameters:
usePodIdentity: "false" # Set to "true" if using managed identities, otherwise ensure your service principal is configured correctly
keyvaultName: "arkokv" # Name of your Azure Key Vault
cloudName: "AzurePublicCloud" # Optional if default
objects: |
array:
- |
objectName: dbusername
objectType: secret # Object type in Key Vault (could be secret, key, or cert)
objectVersion: "" # Leave blank to always fetch the latest version
- |
objectName: dbpassword
objectType: secret
objectVersion: ""
resourceGroup: "rg-name" # Resource group where your Key Vault is located
subscriptionId: "abcd-44fb-efg-hijklmnop" # Your Azure subscription ID
tenantId: "id value" # Your Azure tenant ID
此配置将允许 CSI 驱动程序从 Azure Key Vault 获取指定的机密,并将它们作为文件呈现在使用此配置的 pod 中
SecretProviderClass
。
参考资料: