机制定位
把 Secret 以卷的形式挂进容器,每个键落成一个文件,默认权限 0644,可以通过 defaultMode 或 items 里的 mode 收紧到 0440、0400。适用平台是 Kubernetes。相比环境变量注入,卷挂载更适合证书、密钥文件这类需要「落成文件」的凭据,并且内容会随 Secret 更新自动同步(分钟级),便于轮换;subPath 挂载则不会更新,需要重建 Pod。
基本信息
| 适用平台 | Kubernetes,Pod 的 volumes.secret |
|---|---|
| 默认权限 | 0644(容器内任意用户可读) |
| 权限调整 | 卷级 defaultMode 或按文件设置 items[].mode |
| 更新行为 | 普通挂载分钟级同步,subPath 不更新 |
典型使用场景
- 证书与私钥:挂到 /etc/tls 由应用直接读取,避免写进镜像
- 凭据文件:部分中间件只认配置文件里的密码,不适合用环境变量
- 多容器共享:同一 Secret 挂给多个容器,保证凭据一致
- 权限收紧:私钥文件设 0400,限制同 Pod 内其他进程可读
- 轮换验证:观察文件内容随 Secret 更新而变化的时间点
卷挂载示例
卷挂载示例
spec:
containers:
- name: app
volumeMounts:
- name: tls
mountPath: /etc/tls
readOnly: true
volumes:
- name: tls
secret:
secretName: app-tls
items:
- key: tls.crt
path: tls.crt
- key: tls.key
path: tls.key
mode: 0400验证权限与更新
验证权限与更新
kubectl exec -it web-x -- ls -l /etc/tls # 文件列表
kubectl exec -it web-x -- stat -c '%a %n' /etc/tls/tls.key # 权限是否符合预期
kubectl exec -it web-x -- cat /etc/tls/tls.crt | head -2 # 内容抽查
kubectl get secret app-tls -o jsonpath='{.data.tls\.key}' | base64 -d | head -c 60 # 与源比对挂载方式对比
| 维度 | 普通卷挂载 | subPath 挂载 |
|---|---|---|
| 更新传播 | 分钟级同步 | 不传播,需重建 Pod |
| 目录影响 | 遮蔽目标目录内容 | 只挂单个文件,不影响其他内容 |
| 权限控制 | defaultMode 或 items mode | 沿用源文件权限,控制有限 |
| 适用场景 | 证书目录、多文件凭据 | 需要覆盖镜像内已有文件的场景 |
卷挂载的 Secret 会随更新分钟级同步,适合需要轮换的证书;文件权限按最小可读设置,避免同 Pod 内其他容器越权读取。
应用若只在启动时读取一次证书,Secret 更新后仍会使用旧内容,需要应用支持热加载或用滚动重启触发重读。
权限与轮换要点
- 私钥文件显式设置 0400 或 0440,默认 0644 对同 Pod 内其他容器都是可读的
- 轮换后核对文件内容变化的时间点,再确认应用是否真的重读
- 应用不支持热加载时用滚动重启触发,避免新旧凭据交错的窗口过大
- 用 items 只挂需要的键,减少无意暴露的字段数量