赛博堡垒的数据总控台:部署 pgAdmin 4 可视化面板
📖 认识数据总控台:为什么选择纯 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,将明文模版转化为连你自已都无法反向解密的加密文件:
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
🎉 竣工验收与数据库连接
Section titled “🎉 竣工验收与数据库连接”- 打开浏览器,使用加密文件中设置的邮箱与密码登录。
- 右键点击 Servers -> Register -> Server。
- General 标签页:Name 填入
CNPG-Master(或任意你喜欢的名字)。 - 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
- Host name/address: 填入你在上一期部署 CNPG 时自动生成的 Service 名称,通常为
- 如果遇到
FATAL: password authentication failed for user "postgres"参考赛博排障实录:CNPG 密码“脑裂”与内核级破门指南
点击 Save。恭喜你,整座赛博堡垒的数据命脉,现在完全掌握在你的鼠标指针之下了!
🧪 终极验证:SQL 权限调度实战
Section titled “🧪 终极验证:SQL 权限调度实战”连接成功后,点击 pgAdmin 顶部的 “Query Tool” 图标,依次下发以下指令,验证你对这颗“数据心脏”的绝对支配权:
1. 签发赛博身份 (创建用户)
Section titled “1. 签发赛博身份 (创建用户)”-- 创建一个具有登录权限的测试用户CREATE ROLE cyber_test_user WITH LOGIN PASSWORD 'TestPass123!';
-- (查看验证) \du2. 划定私有领地 (创建数据库)
Section titled “2. 划定私有领地 (创建数据库)”-- 创建数据库并指定所有者为刚才的用户CREATE DATABASE cyber_test_db OWNER cyber_test_user;
-- (查看验证) \l3. 撤销指令 (拆除与清理)
Section titled “3. 撤销指令 (拆除与清理)”当测试完成需要抹除痕迹时,请按顺序执行:
-- 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;