Skip to content

Sealed Secrets 部署指南:实现 100% 纯正的 GitOps 密码管理

🌱 创建: 2026/04/20 ⏱️ 更新: 2026/05/22

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 的工作流:

  1. 集群端(解密守卫):在 K3s 集群内部,运行着一个 Controller。它手里死死捏着一把**“私钥”**。
  2. 本地端(加密枪):在你的个人电脑上,安装了一个名为 kubeseal 的工具。它手里拿着集群公开的**“公钥”**。

当你想配置一个密码时,你只需要在本地用 kubeseal 对明文密码开一枪,它就会被加上一层“密封壳”(SealedSecret),变成一堆面目全非的乱码。 这堆乱码是绝对安全的,你可以放心地把它推送到 GitHub。当 ArgoCD 把这堆乱码拉到集群里时,内部的 Controller 会用私钥剥开这层壳,将其还原为真正的 K8s Secret 供应用使用。


🏗️ 核心施工流程 (Installation Steps)

Section titled “🏗️ 核心施工流程 (Installation Steps)”

我们要兵分两路,分别在本地和云端部署对应的组件。

步骤 1:本地安装加密工具 (kubeseal)

Section titled “步骤 1:本地安装加密工具 (kubeseal)”

在你的个人电脑(Mac/Linux)上安装这把“加密枪”。

对于 macOS 用户:

Terminal window
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 了本仓库,你必须重新生成属于你集群的加密文件(因为原来的乱码只有我的集群能解开)。

  1. 填写模版 (绝不提交) 用编辑器打开应用的 secret.template.yaml,将其中的占位符(如 REPLACE_ME)替换为你真实的密码并保存。 (🚫 致命警告:绝对不要将填写了真实密码的 template 文件 git commit!)

  2. 本地加密封壳 在终端运行以下命令,直接覆盖仓库中原有的 secret.yaml

    Terminal window
    kubeseal --format yaml < secret.template.yaml > secret.yaml
  3. 打扫战场并推送 现在,secret.yaml 已经是专门为你集群定制的加密版本了。

    Terminal window
    git add secret.yaml
    git commit -m "chore: 🔐 替换为我自己集群的加密凭证"
    git push

防线建好后,必须进行一次全链路验收。我们直接在终端里徒手造一个“假密码”进行测试。

1. 手写一份明文密码图纸:

Terminal window
cat <<EOF > test-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: my-test-password
namespace: default
type: Opaque
stringData:
db-pass: "K3s-Cyber-Fortress-888"
EOF

2. 呼叫 kubeseal 进行加密:

Terminal window
kubeseal -f test-secret.yaml -w my-sealed-secret.yaml

3. 将加密后的乱码扔进集群:

Terminal window
kubectl apply -f my-sealed-secret.yaml

4. 竣工验收 (见证奇迹): 我们去集群里查岗,看看 Controller 有没有把它还原成真正的 Secret:

Terminal window
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 并删除本地测试文件。)

Last updated: