在 Kubernetes 上用 KubeBlocks + Dify 快速构建生产级 AIGC 应用
前言
在数字化时代,人工智能生成内容(AIGC)技术正以前所未有的速度改变着我们的世界。AIGC 不仅为内容创作者提供了强大的工具,还为企业带来了前所未有的商业机会。通过 AIGC,应用能够自动生成文本、图像、音频甚至视频,极大地提高了内容生产的效率和质量。更重要的是,AIGC 能够根据用户的个性化需求,实时生成符合其兴趣的内容,从而极大地提升了用户体验。
然而,想要充分利用 AIGC 的潜力,开发者往往面临着技术门槛高、模型集成复杂、运维管理困难等一系列挑战。正是在这样的背景下,Dify 应运而生。Dify 是一个开源的大语言模型(LLM)应用开发平台,它巧妙地整合了 Backend as Service 和 LLMOps 的理念,旨在为开发者铺设一条从创意到产品的快速通道。Dify 不仅内置了丰富的模型支持、直观的 Prompt 设计工具、强大的 Agent 框架及灵活的流程编排能力,还提供了用户友好的界面和 API,大大降低了技术障碍,使得即使是非技术背景的人员也能参与到 AI 应用的塑造之中。
尽管 Dify 极大简化了 AI 应用的开发流程,但在实际部署和运维阶段,如何高效管理这些应用所需的基础设施仍然是一个不容忽视的问题。特别是 AIGC 应用一般都会用到多种数据库,比如关系型数据库 PostgreSQL 存储应用元数据、内存数据库 Redis 存储对话历史记录、向量数据库如 Qdrant 做 RAG 召回等等,确保这些关键组件的稳定运行、数据的一致性与安全性,以及应对快速增长的业务需求,对任何团队而言都是不小的挑战。这时,KubeBlocks 便成为了我们的得力助手。KubeBlocks 是一个基于 Kubernetes 的数据基础设施管理平台,它提供了一套完整的解决方案,帮助我们实现数据基础设施的自动化管理和调度。无论是 OLTP、OLAP、NoSQL、消息队列、流引擎还是新兴的向量数据库和大语言模型,KubeBlocks 都能够轻松地进行管理,极大地提升了有状态工作负载的管理效率。KubeBlocks 支持多云环境,提供一键式部署、无缝扩展、自动故障恢复等功能,确保了生产级应用的高性能、高弹性和可观测性。
将 Dify 和 KubeBlocks 结合起来,Dify 负责应用的快速开发和迭代,而 KubeBlocks 则确保了应用的基础设施既稳定又易于管理。这种结合不仅提高了开发效率,还保证了应用的可靠性和扩展性。本文将演示如何基于 KubeBlocks + Dify 构建生产级别的 AIGC 应用。
要求
Kubernetes 集群,版本>=1.21
Kubernetes 集群安装有 Ingress Controller
操作说明
安装 KubeBlocks
首先安装最新版本的 kbcli,kbcli 是 KubeBlocks 提供的专门命令行工具,它能够以更直观、更简洁的方式管理 KubeBlocks 相关的资源。对于 KubeBlocks 用户来说,kbcli 提供了更直接、更高效的操作路径,使得即便是 Kubernetes 的新手也能快速上手 KubeBlocks。
然后安装最新版本的 KubeBlocks。
KubeBlocks 安装完毕后,会默认启用一些常用的数据库,比如 mysql、postgresql、redis、mongodb 等。可以执行 kbcli addon list
查看具体启用了哪些数据库。
对于 Dify 依赖的向量数据库,比如 Qdrant,默认没有启用,我们执行以下命令启用 Qdrant addon。
然后执行 kbcli addon describe qdrant
,等待 Status 变为 Enabled。
Qdrant addon 默认使用官方 Docker Hub 上的镜像 docker.io/qdrant/qdrant
,如果在国内遇到 pull 镜像失败的问题,启用 addon 的时候也可以修改镜像地址,比如使用 KB 从官方仓库同步的镜像。
kbcli 不仅限于安装 KubeBlocks,还提供了丰富的数据库集群管理功能,如创建数据库集群、查看集群状态、集群横向/纵向扩缩容,存储扩缩容、启停/重启等常用的功能,这些功能都通过简洁的命令实现,大大降低了用户的学习成本。对于希望快速部署和测试 KubeBlocks 的用户,kbcli 提供了快速安装和初始化演示环境的功能,非常适合学习和实验场景。
对于熟悉 Kubernetes 且希望深入了解 KubeBlocks 与 Kubernetes 集成细节的高级用户来说,KB 提供了声明式 API,可以像 K8s 原生资源一样,用 kubectl 来管理数据库,提供了更底层、更全面的视角来观察和操作数据库集群。
创建 PostgreSQL 元数据库
Dify 元数据存在 PostgreSQL 中,我们创建一个主备形态的 PostgreSQL 集群。这个集群有主备 2 个副本,副本的规格是 1 核 2G,存储是 20G。
创建 Qdrant 向量数据库
Dify 用向量数据库存储用户上传的文档和其对应的特征向量,KB 支持很多向量数据库,既有专用的比如 Qdrant、Milvus、Weaviate,也有传统数据库集成了向量能力的,比如 PostgreSQL+pgvector 插件。以比较轻量的 Qdrant 为例,创建一个三节点的 Qdrant 集群,每个节点的规格是 1 核 2G,存储是 20G。
创建 Redis 内存数据库
Dify 用 Redis 存储用户对话历史记录,我们创建一个支持高可用的 Redis 集群,这个集群有 redis 和 sentinel 两种组件。
redis 节点 2 副本,一主一备,规格是 2C1G,存储 20G
sentinel 节点 3 副本,规格 0.2C0.2G,存储 20G
部署 Dify
执行 kubectl get cluster
,等待 PostgreSQL、Redis 和 Qdrant 集群都处于 Running 状态。
我们需要手工初始化 Dify 元数据库,先执行 kbcli cluster connect postgresql
连接 PG 集群,然后执行以下 SQL 创建 Dify 数据库。
接下来获取 Redis 默认账户 default 的密码,后续要配置给 Dify。
我们用 K8s 上主流的 helm 方式来部署 Dify,先添加相应的 helm repo:
保存以下内容到 values.yaml,主要是设置了相关数据库的访问信息,比如链接地址,用户名和密码等。
global.host 是访问 Dify 的域名,如果域名不是公网可访问的,后续需要配置本地静态解析,另外为了方便,先关闭 TLS。
PostgreSQL 集群的账户密码,KB 会保存到 secret 中,values.yaml 中通过 env 直接引用,不需要改动。
Dify 用 Redis 作为 Celery broker,因为 broker 连接地址是拼出来的,无法通过引用 secret 的方式配置,所以需要先执行
kubectl get secret redis-redis-account-default -o jsonpath="{.data.password}" |base64 -d
获取 redis default 账户密码,然后替换 values.yaml 中的${REDIS_PASSWORD}
。ingress.className 请替换为 K8s 集群中实际的 ingressclass,可以通过
kubectl get ingressclass
查看集群中有哪些可用的 ingressclass。env.SECRET_KEY,用于登录认证和敏感信息加密的,为了安全,请替换为强度足够高的 key,可以用
openssl rand -base64 42
生成。
接下来可以部署 Dify 了。
kubectl get pods -l app.kubernetes.io/name=dify
等待 Dify 相关 Pod 状态都变为 Running。
访问 Dify
Dify 通过 Ingress 对外暴露服务,执行 kubectl get ingress -l app.kubernetes.io/name=dify
,确认 dify ingress 的访问地址。
如果 ingress 域名不是公共可解析的,比如自定义的私有域名,那么需要在要访问 Dify 的客户端配置对域名 mydify.example.com
的静态解析。
请注意替换 10.43.65.209 为环境中实际的 dify ingress 的 IP 地址。
然后浏览器访问 http://mydify.example.com
,就可以打开 Dify 控制台了。
先注册一个管理员账号,然后登录可以看到 Dify 主界面。
基础设施运维
随着业务发展,不可避免的要对数据库做各种运维操作,KubeBlocks 对 day-2 的运维操作支持非常完善,比如升降级、扩缩容、启停等等,以下是一些常见的例子。
扩缩容
假如用户在知识库上传的文件越来越多,三节点 Qdrant 处理能力不足,我们有两种选择:
垂直扩容,给每个 Qdrant 节点加更多的 CPU 和内存。
水平扩容,加更多的 Qdrant 节点,分摊单个节点压力。
这两种扩容 KubeBlocks 都支持,先看垂直扩容,比如增加 CPU 到 8 核,内存到 32Gi。
还可以选择水平扩容增加更多的节点,比如从 3 节点,扩容到 5 节点。
当然,如果业务需求下降,比如用户删除了大批量文档,也可以垂直和水平缩容,操作命令跟扩容是一样的。
磁盘扩容
假如注册用户数量越来越多,PostgreSQL 元数据库存储空间不太够用了,可以进行扩容存储,比如扩到 50Gi。
重启
当 PostgreSQL 元数据库出现异常,比如报错时,可以尝试重启集群解决,也非常简单。
总结
本文介绍了如何用 KubeBlocks+Dify 构建生产级别 AIGC 应用,充分发挥了 KubeBlocks 在数据基础设施管理,以及 Dify 在 AIGC 应用开发领域的优势,两者的结合极大的提高了 AIGC 应用开发部署效率,整体架构非常灵活,具备很强的扩展性,降低了生产环境运维复杂度。
End
KubeBlocks 已发布 v0.9.0!KubeBlocks v0.9.0 全面升级了 API,构建一个 Cluster 更像是在用 Component “搭积木”!新增 topologies
字段,支持多种部署形态。InstanceSet 代替了 StatefulSet 来管理 Pods,支持将指定的 Pod 下线、Pod 原地更新,同时也支持数据库主从架构里主库和从库采用不同的 Pod spec。v0.9.0 还新增了 Reids 集群模式(分片模式),系统的容量、性能以及可用性显著提升!还支持了 MySQL 主备,资源的要求更少,数据复制的开销也更小!快来试试看!
小猿姐诚邀各位体验 KubeBlocks,也欢迎您成为产品的使用者和项目的贡献者。跟我们一起构建云原生数据基础设施吧!
💻 官网: www.kubeblocks.io
🌟 GitHub: https://github.com/apecloud/kubeblocks
🚀 Get started: https://cn.kubeblocks.io/docs/preview/user-docs/try-out-on-playground/try-kubeblocks-on-local-host
关注小猿姐,一起学习更多云原生技术干货。
版权声明: 本文为 InfoQ 作者【小猿姐】的原创文章。
原文链接:【http://xie.infoq.cn/article/79b8472b04e8dec6fd700c0a7】。文章转载请联系作者。
评论