从 Demo 到生产级:Kite 在 K3s 上的 PostgreSQL 与 Ingress 部署实战
从 Demo 到生产级:Kite 在 K3s 上的高可用数据库与 HTTPS 部署实践
引言
在之前的文章 《在 K3s 上使用 Prometheus 配置 Kite》 中,我们快速搭建了测试环境。但随着使用深入,原方案的局限性开始显现。今天我们将进行一次彻头彻尾的“生产级”改造。
1. 原方案的痛点:为什么不能用于生产?
原方案最大的问题在于数据持久化。
- 默认 SQLite 的风险:原方案依赖 Pod 内部或本地路径的 SQLite 数据库。在 Kubernetes 环境下,Pod 是随毁随建的(Stateless)。
- 数据丢失:一旦节点重启、Pod 漂移或进行版本升级,所有用户配置、AI 工作流数据将全部丢失。
- 不可扩展性:SQLite 不支持多实例并发写入,限制了未来的水平扩展。
2. 外部数据库集成:计算与存储分离
为了实现数据持久化,我们将数据库移出 K3s 集群,部署在独立的服务器(192.168.31.220)上。
2.1 数据库初始化
在 PG 服务器上执行:
1 | CREATE DATABASE kite_db; |
2.2 神奇的“桥梁”:Service & EndpointSlice
为了让集群内的 Pod 能通过 external-pg 这个域名访问外部 IP,我们利用 K8s 的服务发现机制:
1 | # external-db.yaml |
Kubernetes 正在逐步废弃旧的 Endpoints 资源,转而推荐使用更高效的 EndpointSlice。虽然旧的 Endpoints 目前依然能工作,但为了符合生产环境的长期维护标准(以及消除那个烦人的 Warning),我们直接按照新标准来。
3. 安全访问:Ingress 与 TLS 证书
生产环境离不开 HTTPS。我们通过 Traefik Ingress 配置自签名证书。
3.1 创建 TLS Secret
1 | openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ |
3.2 刷新本地 DNS (macOS)
在 /etc/hosts 添加 192.168.31.98 kite.damingerdailocal.com 后,别忘了执行刷新:
1 | sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder |
4. 终极部署:Helm 一键点火
通过自定义 values.yaml 覆盖默认配置,禁用 SQLite 并启用 PG 和 Ingress。
1 | db: |
执行部署:
1 | helm upgrade --install kite kite/kite --namespace kite-system --create-namespace -f values.yaml |

在 Helm 的设计中,upgrade –install 是生产环境最常用的命令, 如果 Kite 还没安装:它会执行 安装 (Install) 动作,创建一个新的 Release;如果 Kite 已经安装:它会对比 my-values.yaml 和当前的配置,执行 更新 (Upgrade) 动作。
5. 避坑总结与经验谈
在这次迁移中,我遇到了几个典型问题,希望能帮到大家:
- Namespace 依赖陷阱:直接
apply带有 namespace 属性的资源时,若命名空间不存在会报错。经验: 在 YAML 头部包含 Namespace 定义,或先执行kubectl create ns。 - 残留资源冲突:清理
default命名空间的旧 Service 时,Endpoints资源通常会随之自动删除。如果遇到NotFound报错,说明 K8s 已经帮你处理好了。 - Readiness Probe 假死:Pod 启动后显示
0/1 READY,通常是正在执行数据库 Migration。经验: 通过kubectl logs观察是否有CREATE TABLE动作,不要急着重启。 - 外部访问阻碍:如果
ping通了但curl不通,大概率是目标机器(192.168.31.220)的防火墙没放行 5432 端口。
结语
通过这次改造,Kite 已经具备了应对生产环境的基础能力。数据有了保障,访问有了加密。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Damingerdai's Blog!
