kubernetes 秘密项目未作为文件路径挂载

Posted

技术标签:

【中文标题】kubernetes 秘密项目未作为文件路径挂载【英文标题】:kubernetes secret items not mounted as file path 【发布时间】:2019-11-27 23:56:40 【问题描述】:

我有以下 yaml:

        volumeMounts:
        - name: app-secret
          mountPath: /app
          readOnly: true
      volumes:
      - name: app-secret
        secret:
          secretName: app-secret
          items:
          - key: app-secret.json
            path: appsettings.secret.json

我希望秘密安装在/app/appsettings.secret.json 上,但事实并非如此。我不知道它安装在哪里,容器崩溃了,我没有机会kubectl exec 进入容器来检查秘密安装在哪里。我的猜测是它清除了/app 的内容。任何建议和见解都值得赞赏。

【问题讨论】:

问题可能出在您的containers[] 部分。如果没有,请使用 $ kubectl describe cmd 描述您的 pod。 您的应用程序是否也从 /app 文件夹运行?因为我认为秘密挂载将替换 /app 容器映像中的任何内容。也许尝试安装为 /config 或类似的。 【参考方案1】:

这行得通:

 volumeMounts:
        - name: app-secret
          mountPath: /app/appsettings.secret.json
          subPath: appsettings.secret.json
          readOnly: true
      volumes:
      - name: app-secret
        secret:
          secretName: app-secret
          items:
          - key: app-secret.json
            path: appsettings.secret.json

【讨论】:

这个支持添加多个文件吗? 如果您使用kubectl create secret genetic --from-file ./something.ext 创建了一个单独的秘密,那么items 下的key 将是something.ext。这很好用!【参考方案2】:

您是否可以共享完整的 yaml 以查看它是否存在其他问题并因此而崩溃?

我已经在我的环境中尝试过,效果很好,请看附图。

在我的环境中测试 - 见下图:

【讨论】:

它会覆盖 /app 文件夹的内容吗?我猜这会导致我的应用程序崩溃,因为 /app 是应用程序的根目录。【参考方案3】:

是的,你的假设是正确的。挂载到根文件夹这就是为什么我们通常将秘密挂载到不同的文件夹下,比如/senstivie。我从未尝试过 @KOk ,但它看起来很有趣 - 如果它有效,我会很有趣!

无论如何,如果你想看一个真实的工作示例 - 这是volume mount definition,这是我构建的一个 OSS 项目的Dockerfile(Kamus,一个秘密加密的解决方案)。它类似于您的用例 - dotnet core,带有 appsettings.secrets.json。如果没有帮助,请告诉我。

【讨论】:

以上是关于kubernetes 秘密项目未作为文件路径挂载的主要内容,如果未能解决你的问题,请参考以下文章

Spring Cloud Kubernetes 不重新加载秘密更改

在 podTemplate 中为 kubernetes-plugin 配置时未安装 hostPathVolume

如何使用 Spring Boot 将来自 Google Secret Manager 的秘密作为环境变量注入 Kubernetes Pod?

如何通过yaml将秘密文件设置为kubernetes秘密?

Kubernetes 在现有目录上挂载卷,其中包含容器内的文件

terraform-kubernetes-provider 如何从文件中创建秘密?