跳转到内容

赛博堡垒的数据总控台:部署 pgAdmin 4 可视化面板

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

📖 认识数据总控台:为什么选择纯 YAML 部署?

Section titled “📖 认识数据总控台:为什么选择纯 YAML 部署?”

在上一期工程中,我们的 CloudNativePG (CNPG) 已经开始在底层默默运转。但作为首席架构师,我们不能总是依赖终端去敲击 SQL 语句。我们需要一个直观、强大的图形化面板——pgAdmin 4

有趣的是,这一次我们不使用 Helm Chart。 对于一些结构极其简单的应用,官方 Helm Chart 往往包裹了太多我们不需要的冗余配置。为了追求对赛博堡垒的“绝对掌控权”,我们将采用 纯 YAML 静态清单 的 GitOps 玩法。手写 Deployment、Service 和 Ingress,指哪打哪,干净利落。

👉 情报中心:besthomelab/k3s-homelab-gitops 图纸库


🔐 施工准备:为初始密码穿上防弹衣

Section titled “🔐 施工准备:为初始密码穿上防弹衣”

pgAdmin 启动时需要一个默认的管理员邮箱和密码。在 GitOps 架构中,最大的禁忌就是将明文密码直接 git push 到公开仓库。此时,我们需要祭出赛博堡垒的非对称加密护盾:Sealed Secrets

第一步:在本地填写图纸模版 (绝不提交!) 你需要先在本地参考密码模版,填入你真实的邮箱和超强密码。 👉 查看密码模版图纸:apps/pgadmin/secret.template.yaml

第二步:本地加密封壳 在终端运行 kubeseal,将明文模版转化为连你自已都无法反向解密的加密文件:

Terminal window
kubeseal --format yaml < apps/pgadmin/secret.template.yaml > apps/pgadmin/secret.yaml

⚠️ 包工头致命警告: 加密完成后,必须在 .gitignore 中忽略或直接删除 secret.template.yaml!你只能将生成的 secret.yaml 提交到 GitHub。


🔨 赛博流水线施工 (Core Manifests)

Section titled “🔨 赛博流水线施工 (Core Manifests)”

我们将所有的纯 YAML 资源放置在 apps/pgadmin/ 目录下。在此为你拆解我们在 Git 源码中埋下的三大核心设计思路:

1. 严格的读写权限与防裂脑策略 (Deployment) pgAdmin 内部使用 SQLite 作为配置数据库。SQLite 的致命弱点是不支持多点并发写入。如果 K8s 在更新时同时运行两个 pgAdmin 实例,你的配置库就会瞬间损毁。 因此,我们在源码中强制启用了 Recreate 更新策略(先杀旧再启新),并设定了 fsGroup: 5050 权限以兼容 Longhorn 的卷挂载。 👉 获取核心部署图纸:apps/pgadmin/deployment.yaml

2. 坚实的物理存储 (PVC) 明确声明调用集群的 longhorn 存储类,为 SQLite 提供 1Gi 的专属空间。 👉 获取存储声明图纸:apps/pgadmin/pvc.yaml

3. 对接赛博海关与内网服务 (IngressRoute & Service) 因为我们在 database 命名空间工作,依靠之前配置的 Traefik 全局泛域名弹药库,我们在路由配置中只需要留空 tls: {} 即可实现全自动 HTTPS,无需挂载任何证书 Secret。 👉 获取网关大门图纸:apps/pgadmin/ingressroute.yaml 👉 获取内部服务图纸:apps/pgadmin/service.yaml


🚀 启动全自动装配线 (ArgoCD Application)

Section titled “🚀 启动全自动装配线 (ArgoCD Application)”

万事俱备,最后我们需要在 Git 中提交一份 ArgoCD 指令,让监工去接管上述的所有 YAML 文件。

这里我们使用了一个极其优雅的 GitOps 技巧:在配置的 directory 字段中加入了 exclude: '*template*' 过滤网。这样即使你本地不小心把明文模版推送上去了,ArgoCD 也绝对不会将它下发到集群中,避免覆盖掉真正的加密 Secret。

👉 获取 ArgoCD 触发器指令:bootstrap/pgadmin-app.yaml


  1. 打开浏览器,使用加密文件中设置的邮箱与密码登录。
  2. 右键点击 Servers -> Register -> Server
  3. General 标签页:Name 填入 CNPG-Master(或任意你喜欢的名字)。
  4. Connection 标签页
    • Host name/address: 填入你在上一期部署 CNPG 时自动生成的 Service 名称,通常为 homelab-db-cluster-rw (后缀为 rw 代表强制连主库)。
    • Username: postgres
    • Password: 去终端执行以下命令提取超级管理员密码:
      Terminal window
      kubectl get secret -n database homelab-db-cluster-superuser -o jsonpath='{.data.password}' | base64 --decode && echo
  5. 如果遇到FATAL: password authentication failed for user "postgres" 参考赛博排障实录:CNPG 密码“脑裂”与内核级破门指南

点击 Save。恭喜你,整座赛博堡垒的数据命脉,现在完全掌握在你的鼠标指针之下了!

🧪 终极验证:SQL 权限调度实战

Section titled “🧪 终极验证:SQL 权限调度实战”

连接成功后,点击 pgAdmin 顶部的 “Query Tool” 图标,依次下发以下指令,验证你对这颗“数据心脏”的绝对支配权:

-- 创建一个具有登录权限的测试用户
CREATE ROLE cyber_test_user WITH LOGIN PASSWORD 'TestPass123!';
-- (查看验证) \du
-- 创建数据库并指定所有者为刚才的用户
CREATE DATABASE cyber_test_db OWNER cyber_test_user;
-- (查看验证) \l

当测试完成需要抹除痕迹时,请按顺序执行:

-- 1. 强制断开所有连接到该库的会话
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'cyber_test_db';
-- 2. 删除数据库
DROP DATABASE cyber_test_db;
-- 3. 删除用户
DROP ROLE cyber_test_user;