K8s Secret :敏感数据管理的正确姿势

张开发
2026/4/17 0:45:48 15 分钟阅读

分享文章

K8s Secret :敏感数据管理的正确姿势
Secret 是什么Secret 是 K8s 里专门用来存储少量敏感数据的资源对象说白了就是给你存密码、密钥、仓库账号这些不能随便暴露的内容的。它最核心的作用就是把敏感数据和你的配置、代码彻底分开你把敏感数据存到 Secret 里你的 Pod 配置里只需要引用这个 Secret 的名字就行不用把明文写在配置里。这样一来就算你把整个配置文件夹分享给同学或者传到 GitHub 存档别人也看不到你的敏感数据不会出现泄露的问题。而且它还有几个很实用的特性它的内容只会存在节点的内存临时文件系统里不会写到硬盘上就算重启虚拟机这些数据也会被清掉不会留下残留它是命名空间隔离的同一个集群里不同命名空间的 Pod 用不了别的命名空间的 Secret安全性很高单个 Secret 最多存 1MiB 的数据刚好用来存小的敏感数据不适合存大文件Secret 的 3 种核心用法1. 给应用注入敏感数据这是最基础的用法把 Secret 里的内容通过环境变量的方式传给你的应用容器应用直接读环境变量就能拿到敏感数据。先把你的敏感数据存到 Secret 里kubectl create secret generic mysqlpass --from-literalpassword你的密码然后在 Pod 的配置里引用这个 Secretenv: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: mysqlpass key: password整个配置里再也没有明文密码了就算你把这个配置分享出去也不会泄露你的敏感数据。2. 拉私有镜像的凭证最容易卡住的问题自己搭的私有仓库本地能拉镜像到 K8s 里就拉不动了。这是因为 K8s 里是 kubelet 帮你拉镜像它没有你的仓库登录凭证这时候你就可以把你的仓库凭证存成 Secret然后告诉 kubelet拉镜像的时候用这个凭证kubectl create secret docker-registry my-registry-secret \ --docker-server你的仓库地址 \ --docker-username你的账号 \ --docker-password你的密码 \ --docker-email你的邮箱然后在 Pod 的配置里加上imagePullSecretsspec: imagePullSecrets: - name: my-registry-secret containers: - name: my-app image: 你的仓库地址/你的镜像:v1就这么一行kubelet 拉镜像的时候自动就会用这个凭证登录仓库镜像一下就能拉下来了。3. 把密钥挂载成文件如果你的敏感数据是文件比如 SSH 私钥、证书那你可以把 Secret 挂载成容器里的文件应用直接读文件就能拿到数据这个方式比环境变量更安全因为环境变量会被子进程继承很容易泄露而文件就不会有这个问题。kubectl create secret generic ssh-key --from-file你的私钥文件路径然后在 Pod 的配置里把 Secret 挂载到对应的目录volumes: - name: ssh-volume secret: secretName: ssh-key containers: - name: my-app volumeMounts: - name: ssh-volume mountPath: /root/.ssh readOnly: true这样容器里的/root/.ssh/id_rsa就是你的私钥应用直接读就行安全又方便。用 Secret 一定要注意的 5 个点别把 Base64 当加密很多人以为 Secret 里的数据是加密的其实不是它只是做了个 Base64 编码任何人只要能拿到你的 Secret一秒就能解码拿到明文Secret 的安全靠的是权限控制不是编码。环境变量不会自动更新如果你用环境变量的方式注入 Secret那你更新 Secret 之后环境变量不会变必须重启 Pod 才能生效但是如果是挂载文件的方式就会自动更新不用重启。Secret 不能跨命名空间用Secret 是命名空间隔离的你在 default 创建的 Secret别的命名空间的 Pod 用不了要想用的话得把 Secret 复制过去。别把 Secret 的配置传到 Git就算是 Secret 的配置也别传到公共仓库会泄露你的敏感数据最好单独存在本地。特权容器要谨慎用如果你的容器是以特权模式运行的那它就能访问整个节点上的所有 Secret所以特权容器别随便用。

更多文章