azure - 将 key 从 Keyvault 同步到 Azure AKS 群集

标签 azure kubernetes azure-aks

我正在尝试在 azure keyvault 和我的 pod 之间同步 secret 。这是我的设置。

  1. 在容器中,我有 application.properties 引用环境 secret TESTTOKEN

  2. 已将 TESTTOKEN(不带 keyvault 的值)添加到我的部署 yml (env),并且我能够成功运行微服务

  3. 已按照 Azure 步骤设置 CSI here

  4. 创建一个 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/

    相关文章:

    Azure Functions 在与 Azure Cosmos DB 或 SQL 数据库结合进行负载测试时失败

    kubernetes - 将节点标签设置为 pod 环境变量

    kubernetes - 部署定制的kube-scheduler

    azure - 在哪里可以查看 Azure 资源管理器模板资源的所有可能属性?

    sql-server - Azure SQL 数据库中的异步触发器

    Azure 网站记录 404

    kubernetes - Istio 可从浏览器访问,但不能从 curl 访问

    kubernetes - 将 Snakemake 与 Azure Kubernetes 服务结合使用

    用于文件处理的 Azure 后台服务

    azure - "select count(id) from table"在 SQL Azure 中计算最多需要 30 分钟