Sealed Secrets 部署指南:实现 100% 纯正的 GitOps 密码管理
This content is not available in your language yet.
💣 GitOps 的阿喀琉斯之踵:密码裸奔
Section titled “💣 GitOps 的阿喀琉斯之踵:密码裸奔”在将集群的管理权全权交给 ArgoCD 之后,我们遇到了一个极其棘手的安全悖论:
GitOps 的核心法则要求集群的一切状态必须以 Git 仓库里的代码为准。这意味着,数据库密码、API Token、SSL 证书私钥等敏感信息,也必须作为代码提交到 GitHub。
然而,Kubernetes 原生的 Secret 资源,仅仅做了一层极其简陋的 Base64 编码。这根本不叫加密,这充其量叫“换了个字体”。如果你把原生的 Secret 直接推送到公开仓库,无异于在互联网的大街上裸奔。
为了实现 100% 纯正且安全的 GitOps,我们必须为赛博堡垒装上一把军工级的防盗锁:Sealed Secrets。
🛡️ 架构原理解析:套壳加密法
Section titled “🛡️ 架构原理解析:套壳加密法”Sealed Secrets 是 Bitnami 开源的非对称加密利器。它的工作机制极其优雅,完美契合了 GitOps 的工作流:
- 集群端(解密守卫):在 K3s 集群内部,运行着一个 Controller。它手里死死捏着一把**“私钥”**。
- 本地端(加密枪):在你的个人电脑上,安装了一个名为
kubeseal的工具。它手里拿着集群公开的**“公钥”**。
当你想配置一个密码时,你只需要在本地用 kubeseal 对明文密码开一枪,它就会被加上一层“密封壳”(SealedSecret),变成一堆面目全非的乱码。
这堆乱码是绝对安全的,你可以放心地把它推送到 GitHub。当 ArgoCD 把这堆乱码拉到集群里时,内部的 Controller 会用私钥剥开这层壳,将其还原为真正的 K8s Secret 供应用使用。
🏗️ 核心施工流程 (Installation Steps)
Section titled “🏗️ 核心施工流程 (Installation Steps)”我们要兵分两路,分别在本地和云端部署对应的组件。
步骤 1:本地安装加密工具 (kubeseal)
Section titled “步骤 1:本地安装加密工具 (kubeseal)”在你的个人电脑(Mac/Linux)上安装这把“加密枪”。
对于 macOS 用户:
brew install kubeseal(注:Linux 或 Windows 用户请前往 官方 Release 页面 下载二进制文件。)
步骤 2:集群部署解密守卫 (Controller)
Section titled “步骤 2:集群部署解密守卫 (Controller)”我们继续贯彻 GitOps 理念,使用 ArgoCD 来部署这个底层基建。
我已经将标准化图纸归档在了 GitHub 仓库中,请前往查看: 👉 获取部署图纸:infrastructure/sealed-secrets/
⚠️ 赛博包工头的避坑警告: 在我的
values.yaml图纸中,有一行极其关键的配置:fullnameOverride: sealed-secrets-controller。 因为 Helm 默认会将应用命名为sealed-secrets,但你本地的kubeseal工具默认寻找的服务名叫sealed-secrets-controller。如果没有这行代码强行纠正,你本地加密时会一直报连接超时!
将上述图纸纳入 ArgoCD 管理并同步后,你的集群就正式具备了解密能力。
🔐 实战工作流:如何安全地管理密码?
Section titled “🔐 实战工作流:如何安全地管理密码?”当你在本仓库中浏览各个业务应用(如数据库、管理面板)时,你会发现在它们的目录下通常有一对文件:
secret.template.yaml: 明文模版(带填空题的参考答案)。secret.yaml: 密封文件(一堆乱码的实战版)。
如果你克隆或 Fork 了本仓库,你必须重新生成属于你集群的加密文件(因为原来的乱码只有我的集群能解开)。
-
填写模版 (绝不提交) 用编辑器打开应用的
secret.template.yaml,将其中的占位符(如REPLACE_ME)替换为你真实的密码并保存。 (🚫 致命警告:绝对不要将填写了真实密码的 template 文件git commit!) -
本地加密封壳 在终端运行以下命令,直接覆盖仓库中原有的
secret.yaml:Terminal window kubeseal --format yaml < secret.template.yaml > secret.yaml -
打扫战场并推送 现在,
secret.yaml已经是专门为你集群定制的加密版本了。Terminal window git add secret.yamlgit commit -m "chore: 🔐 替换为我自己集群的加密凭证"git push
🧪 试压测:验证防线是否生效
Section titled “🧪 试压测:验证防线是否生效”防线建好后,必须进行一次全链路验收。我们直接在终端里徒手造一个“假密码”进行测试。
1. 手写一份明文密码图纸:
cat <<EOF > test-secret.yamlapiVersion: v1kind: Secretmetadata: name: my-test-password namespace: defaulttype: OpaquestringData: db-pass: "K3s-Cyber-Fortress-888"EOF2. 呼叫 kubeseal 进行加密:
kubeseal -f test-secret.yaml -w my-sealed-secret.yaml3. 将加密后的乱码扔进集群:
kubectl apply -f my-sealed-secret.yaml4. 竣工验收 (见证奇迹): 我们去集群里查岗,看看 Controller 有没有把它还原成真正的 Secret:
kubectl get secret my-test-password -n default -o jsonpath="{.data.db-pass}" | base64 -d && echo如果你的终端屏幕上干干净净地打印出了 K3s-Cyber-Fortress-888,恭喜你!你的赛博堡垒已经拥有了坚不可摧的密码管理体系。
(测试完毕后,记得执行 kubectl delete -f my-sealed-secret.yaml 并删除本地测试文件。)