【问题标题】:How to pass azure key vault secrets to kubernetes pod using file in helm charts如何使用 helm 图表中的文件将 azure key vault 机密传递给 kubernetes pod
【发布时间】:2021-11-14 12:45:57
【问题描述】:

我正在使用 azure key vault 来保存机密并在 deployment.yaml 中用作环境变量。

但问题是我可以在 azure 门户中的 azure kubernetes 集群中看到这些秘密。

我在 kubernetes 文档中读到,我们可以将这些变量用作文件而不是 env 变量,以实现更安全的部署。

我需要做哪些改变才能实现这一目标

这是我的舵图 -

SecretProviderClass.yaml

apiVersion: secrets-store.csi.x-k8s.io/v1alpha1
kind: SecretProviderClass
metadata:
  name: azure-keyvault 
spec:
  provider: azure
  secretObjects:
  - secretName: database-configs
    type: Opaque
    data:
    - objectName: DB-URL
      key: DB-URL

  parameters:
    usePodIdentity: "false"
    useVMManagedIdentity: "true"
    userAssignedIdentityID: {{ .Values.spec.parameters.userAssignedIdentityID }} 
    resourceGroup: {{ .Values.spec.parameters.resourceGroup }} 
    keyvaultName: {{ .Values.spec.parameters.keyvaultName }} 
    tenantId: {{ .Values.spec.parameters.tenantId }} 
    objects: |
      array:
        - |
          objectName: DB-URL
          objectType: secret
          objectAlias: DB-URL

deployment.yaml

env:
          - name: DB-URL
            valueFrom:
              secretKeyRef:
                name: database-configs
                key: DB-URL
          volumeMounts:
          - mountPath: "/mnt/azure"
            name: volume
          - mountPath: "mnt/secrets-store"
            name: secrets-mount
            readOnly: true
      volumes:
        - name: volume
          persistentVolumeClaim:
            claimName: azure-managed-disk      
        - name: secrets-mount
          csi:
            driver: secrets-store.csi.k8s.io
            readOnly: true
            volumeAttributes:
              secretProviderClass: "azure-keyvault"

在部署时 helm 替换这些值的文件-

settings.ini -

[server]
hostname = "localhost"
hot_deployment = false
url = "$env{DB-URL}"

[user_store]
type = "read_only_ldap"

任何帮助将不胜感激。

我正在寻找同时使用密钥库和 kubernetes 的安全方式

【问题讨论】:

    标签: azure kubernetes-helm azure-aks azure-keyvault kubernetes-secrets


    【解决方案1】:

    机密出现在 Azure 门户 Kubernetes 资源视图中,因为 SecretProviderClass azure-keyvault 具有 spec.secretObjects 字段。在某些情况下,您可能希望创建一个 Kubernetes Secret 来镜像已安装的内容。使用可选的 secretObjects 字段定义同步的 Kubernetes 机密对象的所需状态。 Reference

    删除 spec.secretObjects 将阻止已装载的机密内容与 AKS 群集同步。


    环境变量是一个动态命名的值,它可以影响正在运行的进程在计算机上的行为方式。它们是进程运行的环境的一部分。这些不应与文件混淆。

    Kubernetes documentation 表示秘密可以通过 3 种方式与 Pod 一起使用:


    我看到您的 Helm Chart 已经设置了秘密卷挂载。这就是here的最后一步:

    修改您的图像或命令行,以便程序在您的秘密将出现的目录中查找文件(在这种情况下,它看起来像 /mnt/secrets-store)。秘密data 映射中的每个键都成为mountPath 下的文件名。

    注意:假设您错过了/

    - mountPath: "mnt/secrets-store"
    

    【讨论】:

    • 感谢您的解释。您的意思是添加 deployment.yaml 作为 - - mountPath: "mnt/secrets-store/DB-URL 并为每个变量执行此操作?
    • 如何从我的 settings.ini 文件中调用它们?谢谢
    • 您不必为每个文件单独添加mountPath。在您的 deployment.yml 中设置的 mountPaths 已经从 /mnt/secrets-store 中的密钥挂载了每个密钥。
    • 由于INI 文件是一个非正式标准,如何引用其他文件或其他文件中的值取决于使用配置文件的程序。假设说settings.ini 文件是应用程序的一部分,我建议您添加像DB-URL-PATH = /mnt/secrets-store/DB-URL 这样的秘密文件路径,并使消费者程序使用文本流操作从$DB-URL-PATH 获取秘密值,类似于@987654343 @等
    • 在哪里添加秘密文件路径?在 deployment.yaml 中?在ini文件中我应该只提到url =“$ DB-URL-PATH”。抱歉这么多问题,只是想了解这个概念
    猜你喜欢
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 2020-04-26
    • 1970-01-01
    • 2020-12-19
    • 2018-07-13
    • 2020-04-30
    • 1970-01-01
    相关资源
    最近更新 更多