Kubernetes Secret 详解:用 k8s-tutorials 实战挂载加密配置(Base64、secretKeyRef 与 Helm b64enc) 文档教程云原生【免费下载链接】k8s-tutorialsk8s tutorials | k8s 教程项目地址https://gitcode.com/gh_mirrors/k8s/k8s-tutorials点击查看免费下载导读在 Kubernetes 中ConfigMap 负责承载非敏感配置但当配置内容涉及数据库密码、令牌、API Key 等敏感信息时明文存储显然不可接受。本篇以 k8s-tutorials 仓库中的 Secret 教程docs/secret.md为骨架结合仓库内的 secret/ 实战源码与 helm-charts/hello-helm 模板系统讲解 Secret 的资源定义、Base64 编码、Pod 环境变量注入secretKeyRef、应用侧读取以及 Helm 场景下的模板化密钥管理读完即可在真实集群中安全地交付加密配置。一、为什么需要 SecretConfigMap 的局限前一篇教程docs/configmap.md展示了用 ConfigMap 按 namespace 隔离不同环境的DB_URL。ConfigMap 的定位是存放非机密性的键值对数据且单对象数据量不能超过 1 MiB它天然不适合承载敏感内容ConfigMap 的data字段以明文形式存放kubectl get configmap -o yaml即可直接看到全部配置内容若把数据库密码写进 ConfigMap等同于把密码明文暴露在 API Server 与 etcd 中任何能读取 ConfigMap 的人都能拿到凭据。Secret 正是为这类场景设计的它同样是键值对结构与 ConfigMap 的资源定义几乎一致但语义上专门用于保存少量敏感信息例如密码、令牌或密钥。区别在于两点——kind为Secret以及data中的 value 需要经过Base64 编码。二、Secret 的安全边界与官方安全实践需要特别澄清一个常见误解Secret 的 Base64 编码不是加密。它只是为了让 value 能够安全地承载任意字节内容包括二进制任何拿到编码串的人都可以用一条命令还原。真正的安全性来自 Kubernetes 平台层的防护官方文档为此给出了明确的基线建议本仓库教程也原文引用了这些要点etcd 中的静态加密默认情况下Secret 未加密地存储在 API 服务器的底层数据存储etcd中。任何拥有 API 访问权限的人都可以检索或修改 Secret任何有权访问 etcd 的人也可以。因此必须为 Secret 启用静态加密Encrypting Secret Data at Rest。RBAC 权限收敛启用或配置 RBAC 规则来限制读取和写入 Secret 的数据包括通过间接方式。注意一个隐含风险被准许创建 Pod 的人也会隐式地被授权获取 Secret 内容例如通过环境变量注入间接读取这是间接访问通道例如创建 Deployment 的能力同样适用。最小化 Secret 的创建与替换权限在适当的情况下还可以使用 RBAC 等机制限制允许哪些主体创建新 Secret 或替换现有 Secret。关键结论Base64 解决的是数据格式问题etcd 静态加密 RBAC 解决的是访问控制问题两者缺一不可。本仓库教程明确指出在生产实践中可以通过 pipeline 或专业的密钥管理服务如 AWS KMS进行密钥管理从而大大减少安全事故。三、Secret 的资源定义data 与 stringData3.1 用 Base64 编码 valueSecret 的data字段要求 value 必须是 Base64 编码后的字符串。本仓库教程给出了最常用的编解码命令echo db_password | base64 # ZGJfcGFzc3dvcmQK echo ZGJfcGFzc3dvcmQK | base64 -d # db_password将编码后的值填入对应的 key-value 中就得到仓库 secret/hellok8s-secret.yaml 中的完整资源定义# hellok8s-secret.yaml apiVersion: v1 kind: Secret metadata: name: hellok8s-secret data: DB_PASSWORD: ZGJfcGFzc3dvcmQK3.2 stringData免去手动编码除了dataSecret 还提供stringData字段写入时不需要 Base64 编码Kubernetes 会在写入 etcd 前自动完成编码转换。适合在编写资源文件时直接书写人类可读的明文值例如apiVersion: v1 kind: Secret metadata: name: hellok8s-secret stringData: DB_PASSWORD: db_password需要注意stringData是写入时便利机制kubectl get secret -o yaml读回时仍会以 Base64 的data形式呈现且同一 key 若同时出现在data与stringData中stringData优先。生产环境建议用 CI 流水线生成 Secret 对象避免把明文值提交进 Git 仓库。四、在 Pod 中引用 Secret环境变量注入 secretKeyRef创建好 Secret 后Pod 通过spec.containers[].env[].valueFrom.secretKeyRef将指定 key 注入为环境变量。仓库 secret/hellok8s.yaml 给出了完整示例# hellok8s.yaml apiVersion: v1 kind: Pod metadata: name: hellok8s-pod spec: containers: - name: hellok8s-container image: guangzhengli/hellok8s:v5 env: - name: DB_PASSWORD valueFrom: secretKeyRef: name: hellok8s-secret key: DB_PASSWORD字段含义拆解与 ConfigMap 章节的configMapKeyRef一一对应可对照 docs/configmap.md 学习env.name注入后容器内的环境变量名应用代码读取时必须与此保持一致valueFrom.secretKeyRef.name要引用的 Secret 对象名此处为hellok8s-secretvalueFrom.secretKeyRef.key要取出的键名此处为DB_PASSWORD。除环境变量外Secret 还支持以 Volume 形式挂载将spec.volumes[].secret.secretName指向 Secret挂载后每个 key 会以文件形式出现在挂载目录中/etc/secret-volume/DB_PASSWORD适合应用按文件读取密钥的场景且文件更新后通常无需重启 Pod 即可在挂载点感知相比环境变量注入的启动时一次性注入更灵活。本仓库教程以环境变量注入为主线下文沿用该方式。五、应用侧读取从源码看 DB_PASSWORD 的使用Secret 注入环境变量后应用代码与其他环境变量无异。仓库 secret/main.go 展示了 v5 版本的 HTTP 服务通过os.Getenv(DB_PASSWORD)读取数据库密码并随响应返回。package main import ( fmt io net/http os ) func hello(w http.ResponseWriter, r *http.Request) { host, _ : os.Hostname() dbPassword : os.Getenv(DB_PASSWORD) io.WriteString(w, fmt.Sprintf([v5] Hello, Kubernetes! From host: %s, Get Database Connect Password: %s, host, dbPassword)) } func main() { http.HandleFunc(/, hello) http.ListenAndServe(:3000, nil) }关键点os.Getenv(DB_PASSWORD)与 YAML 中env.name严格对应这是注入是否生效的校验链路——若 Secret 不存在或 key 名拼错容器启动时会报CreateContainerConfigError仓库 secret/Dockerfile 采用多阶段构建golang:1.16-buster编译 →distroless/base-debian10运行暴露3000端口镜像 tag 为guangzhengli/hellok8s:v5从源码结构看教程刻意让响应体直接回显密码目的是直观验证 Secret 注入是否成功生产代码不应这样输出敏感信息。六、完整部署与验证流程Secret 的部署流程与 ConfigMap 完全一致文档原话Secret 的使用方法和前面教程中 ConfigMap 基本一致依次执行即可# 1. 构建并推送 v5 镜像 docker build . -t guangzhengli/hellok8s:v5 docker push guangzhengli/hellok8s:v5 # 2. 先创建 Secret 资源 kubectl apply -f hellok8s-secret.yaml # secret/hellok8s-secret created # 3. 再创建引用该 Secret 的 Pod kubectl apply -f hellok8s.yaml # pod/hellok8s-pod created # 4. 端口转发后访问验证 kubectl port-forward hellok8s-pod 3000:3000 # 5. 另开终端 curl 验证注入结果 curl http://localhost:3000 # [v5] Hello, Kubernetes! From host: hellok8s-pod, Get Database Connect Password: db_password验证技巧先 apply Secret 再 apply Pod避免因引用不存在的 Secret 导致 Pod 创建失败响应中的Get Database Connect Password: db_password证明DB_PASSWORD已由secretKeyRef正确注入查看实际生效值可执行kubectl get secret hellok8s-secret -o yaml注意读回的是 Base64 编码串或kubectl exec hellok8s-pod -- env | grep DB_PASSWORD。七、进阶Helm 场景下的 Secret 模板化在生产中Secret 往往要按环境差异化dev/test/prod 密码不同直接维护多份 YAML 非常繁琐。仓库的 helm-charts/hello-helm 给出了模板化解法。7.1 用 b64enc 函数在渲染期编码helm-charts/hello-helm/templates/hellok8s-secret.yaml 中Secret 的值不再手工 Base64而是由 Helm 模板函数b64enc在渲染时自动编码# hellok8s-secret.yaml apiVersion: v1 kind: Secret metadata: name: {{ .Values.application.name }}-secret data: DB_PASSWORD: {{ .Values.application.hellok8s.database.password | b64enc }}这样 values 文件里可以存放明文密码便于维护渲染出的 Secret 却始终是 Base64 形式一举两得。7.2 values 按环境区分密码默认值定义在 helm-charts/hello-helm/values.yamlapplication: name: hellok8s hellok8s: image: guangzhengli/hellok8s:v6 replicas: 3 message: It works with Helm Values[v2]! database: url: http://DB_ADDRESS_DEFAULT password: db_passworddev 环境覆盖值定义在 helm-charts/hello-helm/values-dev.yamlapplication: hellok8s: message: It works with Helm Values values-dev.yaml! database: url: http://DB_ADDRESS_DEV password: db_password_dev通过helm install -f values-dev.yaml即可让 Secret 中的DB_PASSWORD自动渲染为 dev 环境的密码。7.3 Deployment 中同时引用 ConfigMap 与 Secrethelm-charts/hello-helm/templates/hellok8s-deployment.yaml 展示了DB_URL来自 ConfigMap与DB_PASSWORD来自 Secret在同一容器中并存的完整模板两个引用机制完全对称env: - name: DB_URL valueFrom: configMapKeyRef: name: {{ .Values.application.name }}-config key: DB_URL - name: DB_PASSWORD valueFrom: secretKeyRef: name: {{ .Values.application.name }}-secret key: DB_PASSWORD综合来看明文配置走 ConfigMap敏感配置走 Secret两者结构对称、使用方式一致这正是 k8s-tutorials 教程体系的连贯设计。八、Secret 使用最佳实践小结区分明文与敏感数据非敏感的DB_URL用 ConfigMap密码、令牌、证书私钥等一律走 Secret认清 Base64 的本质它只是格式编码而非加密安全底线是 etcd 静态加密 RBAC 权限收敛生产环境优先借助 pipeline / 专业密钥管理服务如 AWS KMS托管密钥善用stringData编写资源文件时免去手动 Base64但注意读回时仍以data形式展示控制暴露面Secret 对象按最小权限创建与替换并牢记能创建 Pod 的人即能间接读取 Secret模板化落地多环境场景用 Helm 的b64enc values 分层覆盖避免敏感值散落在各 YAML 中注入方式选型环境变量注入简单直接启动时一次性生效Volume 挂载更适合按文件读取且支持运行时感知更新。九、参考资源本仓库内可继续深入阅读的相关文件教程原文docs/secret.md实战源码与清单secret/main.go、secret/hellok8s-secret.yaml、secret/hellok8s.yaml、secret/Dockerfile前置对照章节docs/configmap.mdConfigMap 与 Secret 的结构/用法对比Helm 模板化示例helm-charts/hello-helm/templates/hellok8s-secret.yaml、helm-charts/hello-helm/templates/hellok8s-deployment.yaml、helm-charts/hello-helm/values.yaml、helm-charts/hello-helm/values-dev.yaml赞分享文档教程云原生【免费下载链接】k8s-tutorialsk8s tutorials | k8s 教程项目地址https://gitcode.com/gh_mirrors/k8s/k8s-tutorials点击查看免费下载相关推荐Kubernetes Ingress 详解与实战教程基于k8s-tutorials项目的网关配置指南Kubernetes Ingress 详解与实战教程基于k8s tutorials项目的网关配置指南 引言为什么需要Ingress 在现代微服务架构中一文档教程云原生MinIO on Kubernetes 的 TLS 安全接入配置指南证书、Secret 与挂载实践MinIO on Kubernetes 的 TLS 安全接入配置指南证书、Secret 与挂载实践 本文围绕仓库 docs/tls/kubernetes/RE后端存储对象存储分布式存储云原生2 条路径修好 Layui 标签页表单错乱Tabs 切换后 Form 不渲染的排查与自查2 条路径修好 Layui 标签页表单错乱Tabs 切换后 Form 不渲染的排查与自查 如果你切到第二个 Tab输入框整排塌掉、下拉框和日期选择器宽得像被前端UI组件上一篇大麦自动抢票工具上手指南Web 与 App 双端配置一次开售自动执行下一篇npkill 使用指南用交互式 CLI 一键扫描并清理 node_modules 等大型依赖目录创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考