DEBUG.WIKI
京东云;让 AI 进入真实业务;零售 · 物流 · 客服 · 硬件;查看方案 →
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国
Evoxt;最高 6.0GHz CPU;高频云服务器 · 免费每周备份;查看配置 →

Secret 已存在仍挂载失败:items.key 要匹配数据键,不是目标文件名

Secret对象存在仍报references non-existent secret key时,区分源数据键与items.path、subPath、应用路径,修正映射并保留凭据轮换条件。

Pod 停在挂载阶段,事件提示 MountVolume.SetUp failed 和 references non-existent secret key: keyfile,但命名空间里已经有指定的 Secret。这时要检查 Secret 内部的数据键:对象存在,并不代表它包含名为 keyfile 的条目。

Secret volume 的 items.key 选择源数据键,items.path 决定它投影到卷里的相对文件路径。这两个名称可以不同。应用读取的路径、挂载路径和 subPath 则属于后续的文件布局,不能反过来代替源键。

只看键名,先别输出凭据内容

下面是只读检查示例,替换命名空间、Pod 和 Secret 名称:

kubectl -n app describe pod web-abc123
kubectl -n app describe secret app-credentials

Secret 的 describe 输出会列出数据键及字节数,默认不展示凭据内容。将事件点名的键与这里的实际名称逐字比较,包括大小写和文件扩展名。不要为了判断文件名就把整个 Secret 解码、贴入聊天记录或保存到普通日志。

如果连 Secret 对象都不存在,需先核对 secretName 和 Pod 的命名空间;本文处理的是对象已找到,但必需键不存在的情况。

从文件创建时,默认键名就是文件名

例如使用 --from-file=./credentials.json 创建 Secret,默认得到的数据键是 credentials.json,不是文件内容中的字段,也不会自动叫 keyfile。

下面是已有 Pod 模板的字段对应示例,假设实际 Secret 中包含 credentials.json:

volumes:
  - name: credentials
    secret:
      secretName: app-credentials
      items:
        - key: credentials.json
          path: client.json
containers:
  - name: web
    volumeMounts:
      - name: credentials
        mountPath: /run/app-credentials
        readOnly: true

这会把源键投影为 /run/app-credentials/client.json。将片段合并到原模板,保留镜像、命令和其他字段;不要用它覆盖整个 containers 数组。挂载目录也应专用于凭据,避免遮住镜像中已有的应用文件。

显式列出 items 时,只投影列出的键;所有必需键都要存在,否则卷不能按要求创建。删掉 items 虽然会让所有键按默认名称投影,但可能改变文件布局并暴露额外凭据,应先确认应用需要什么。

如果打算统一源键名,可以在新建 Secret 时采用 --from-file=keyfile=./credentials.json。这会创建键 keyfile;它不是把既有 Secret 中的数据键自动重命名。修改既有对象前应查清所有引用者,并通过原来的 Secret 管理入口处理,避免删除重建期间让其他 Pod 失去凭据。

卷挂载成功后,再核对应用路径

应用的环境变量或配置应指向实际投影路径。例如程序读取 /home/app/client.json,而卷挂载到了 /run/app-credentials/client.json,挂载问题修复后仍可能出现文件不存在。

采用单文件挂载时,subPath 要引用卷内的目标相对路径,也就是这里的 client.json,而非源键 credentials.json。Secret 通过 subPath 挂载不会自动接收更新;凭据轮换需要安排 Pod 更新,不能只改 Secret 就认为所有容器已经获得新值。目录挂载的更新也不是瞬时发生,程序是否重新读取凭据还要另行确认。

修改前保存部署配置及受控的 Secret 版本,敏感备份应放在有权限保护的凭据管理位置。验收先确认挂载事件不再报告缺键,再确认应用以原运行用户能读取正确路径、凭据认证符合预期,整个过程无须打印内容。回退应同时恢复对应的数据键和模板;只恢复一边可能再次造成映射不一致。