Azure Kubernetes 服务在获取 Secrets-store-creds 时出现 csi 秘密存储错误

问题描述 投票:0回答:1

我正在运行一个 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 kubernetes-helm azure-aks kubernetes-secrets
1个回答
0
投票

看起来您已正确设置 Azure Key Vault、AKS 和 Kubernetes 机密。

csi-secrets-store-provider-azure
已安装并且最初工作正常,但您遇到了秘密旋转功能的问题。错误
MountRotationFailed
表明 CSI 驱动程序在获取节点发布机密时遇到问题,而节点发布机密是与 Azure Key Vault 通信所必需的。

确保角色分配,即确保您已使用 RBAC 在 Azure Key Vault 中为您的服务主体 (

arkokasp
) 分配了必要的角色。服务主体至少需要
Key Vault Secrets User
角色才能读取机密。

enter image description here

验证您的

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

enter image description here

现在,部署一个使用此 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

enter image description here

参考资料:

© www.soinside.com 2019 - 2024. All rights reserved.