赞
踩
在数字化时代,人工智能生成内容(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 应用。
首先安装最新版本的 kbcli,kbcli 是 KubeBlocks 提供的专门命令行工具,它能够以更直观、更简洁的方式管理 KubeBlocks 相关的资源。对于 KubeBlocks 用户来说,kbcli 提供了更直接、更高效的操作路径,使得即便是 Kubernetes 的新手也能快速上手 KubeBlocks。
curl -fsSL https://kubeblocks.io/installer/install_cli.sh
然后安装最新版本的 KubeBlocks。
kbcli kubeblocks install
KubeBlocks 安装完毕后,会默认启用一些常用的数据库,比如 mysql、postgresql、redis、mongodb 等。可以执行 kbcli addon list
查看具体启用了哪些数据库。
kbcli addon list > NAME VERSION PROVIDER STATUS AUTO-INSTALL llm 0.9.0 community Disabled false minio 12.8.12 community Disabled false prometheus 15.16.1 community Disabled false qdrant 0.9.0 community Disabled false apecloud-mysql 0.9.0-beta.10 apecloud Enabled true elasticsearch 0.9.0 community Enabled true kafka 0.9.0 community Enabled true mongodb 0.9.0 apecloud Enabled true mysql 0.9.1 community Enabled true postgresql 0.9.0 community Enabled true pulsar 0.9.0 community Enabled true redis 0.9.0 community Enabled true snapshot-controller 1.7.2 community Enabled true
对于 Dify 依赖的向量数据库,比如 Qdrant,默认没有启用,我们执行以下命令启用 Qdrant addon。
kbcli addon enable qdrant
然后执行 kbcli addon describe qdrant
,等待 Status 变为 Enabled。
kbcli addon describe qdrant
>
Name: qdrant
Description: Qdrant is an open source (Apache-2.0 licensed), vector similarity search engine and vector database.
Labels: addon.kubeblocks.io/model=vector,addon.kubeblocks.io/name=qdrant,addon.kubeblocks.io/provider=community,addon.kubeblocks.io/version=0.9.0
Type: Helm
Status: Enabled
Auto-install: false
Installed Info:
NAME REPLICAS STORAGE CPU (REQ/LIMIT) MEMORY (REQ/LIMIT) STORAGE-CLASS TOLERATIONS PV-ENABLED
main / /
Qdrant addon 默认使用官方 Docker Hub 上的镜像 docker.io/qdrant/qdrant
,如果在国内遇到 pull 镜像失败的问题,启用 addon 的时候也可以修改镜像地址,比如使用 KB 从官方仓库同步的镜像。
kbcli addon enable qdrant --set image.registry=infracreate-registry.cn-zhangjiakou.cr.aliyuncs.com --set image.repository=apecloud/qdrant
kbcli 不仅限于安装 KubeBlocks,还提供了丰富的数据库集群管理功能,如创建数据库集群、查看集群状态、集群横向/纵向扩缩容,存储扩缩容、启停/重启等常用的功能,这些功能都通过简洁的命令实现,大大降低了用户的学习成本。对于希望快速部署和测试 KubeBlocks 的用户,kbcli 提供了快速安装和初始化演示环境的功能,非常适合学习和实验场景。
对于熟悉 Kubernetes 且希望深入了解 KubeBlocks 与 Kubernetes 集成细节的高级用户来说,KB 提供了声明式 API,可以像 K8s 原生资源一样,用 kubectl 来管理数据库,提供了更底层、更全面的视角来观察和操作数据库集群。
Dify 元数据存在 PostgreSQL 中,我们创建一个主备形态的 PostgreSQL 集群。这个集群有主备 2 个副本,副本的规格是 1 核 2G,存储是 20G。
# kbcli 方式
kbcli cluster create postgresql postgresql --cpu=1 --memory=2 --storage=20 --mode=replication --version=postgresql-14.8.0
# 或者 kubectl 方式
kubectl apply -f https://kubeblocks.io/yamls/dify/postgresql.yaml
Dify 用向量数据库存储用户上传的文档和其对应的特征向量,KB 支持很多向量数据库,既有专用的比如 Qdrant、Milvus、Weaviate,也有传统数据库集成了向量能力的,比如 PostgreSQL+pgvector 插件。以比较轻量的 Qdrant 为例,创建一个三节点的 Qdrant 集群,每个节点的规格是 1 核 2G,存储是 20G。
# kbcli 方式
kbcli cluster create qdrant --cluster-definition=qdrant --cluster-version=qdrant-1.8.4 --set cpu=1,memory=2Gi,storage=20Gi,replicas=3
# 或者 kubectl 方式
kubectl apply -f https://kubeblocks.io/yamls/dify/qdrant.yaml
Dify 用 Redis 存储用户对话历史记录,我们创建一个支持高可用的 Redis 集群,这个集群有 redis 和 sentinel 两种组件。
# kbcli 方式
kbcli cluster create redis redis --version=redis-7.0.6 --mode=replication --cpu=2 --memory=1 --storage=20 --replicas=2 --sentinel.cpu=0.2 --sentinel.memory=0.2 --sentinel.replicas=3 --sentinel.storage=20
# 或者 kubectl 方式
kubectl apply -f https://kubeblocks.io/yamls/dify/redis.yaml
执行 kubectl get cluster
,等待 PostgreSQL、Redis 和 Qdrant 集群都处于 Running 状态。
kubectl get cluster
>
NAME CLUSTER-DEFINITION VERSION TERMINATION-POLICY STATUS AGE
postgresql postgresql postgresql-14.8.0 Delete Running 20m
qdrant qdrant qdrant-1.8.4 Delete Running 11m
redis redis redis-7.0.6 Delete Running 73s
我们需要手工初始化 Dify 元数据库,先执行 kbcli cluster connect postgresql
连接 PG 集群,然后执行以下 SQL 创建 Dify 数据库。
create database dify;
接下来获取 Redis 默认账户 default 的密码,后续要配置给 Dify。
# 获取 Redis 密码
kubectl get secret redis-redis-account-default -o jsonpath="{.data.password}" |base64 -d
我们用 K8s 上主流的 helm 方式来部署 Dify,先添加相应的 helm repo:
helm repo add douban https://douban.github.io/charts/
保存以下内容到 values.yaml,主要是设置了相关数据库的访问信息,比如链接地址,用户名和密码等。
kubectl get secret redis-redis-account-default -o jsonpath="{.data.password}" |base64 -d
获取 redis default 账户密码,然后替换 values.yaml 中的 ${REDIS_PASSWORD}
。kubectl get ingressclass
查看集群中有哪些可用的 ingressclass。openssl rand -base64 42
生成。global: host: "mydify.example.com" enableTLS: false image: # Set to the latest version of dify # Check the version here: https://github.com/langgenius/dify/releases # If not set, Using the default value in Chart.yaml tag: "0.6.11" extraBackendEnvs: - name: CELERY_BROKER_URL value: redis://default:${REDIS_PASSWORD}@redis-redis-redis:6379/1 - name: REDIS_USERNAME value: default - name: REDIS_PASSWORD value: ${REDIS_PASSWORD} - name: REDIS_HOST value: redis-redis-redis - name: REDIS_PORT value: "6379" - name: REDIS_DB value: "0" - name: DB_USERNAME valueFrom: secretKeyRef: name: postgresql-conn-credential key: username - name: DB_PASSWORD valueFrom: secretKeyRef: name: postgresql-conn-credential key: password - name: DB_HOST value: postgresql-postgresql - name: DB_PORT value: "5432" - name: DB_DATABASE value: dify - name: VECTOR_STORE value: "qdrant" - name: QDRANT_URL value: "http://qdrant-qdrant:6333" - name: SECRET_KEY value: "PleaseReplaceThisToYourSecretOrUse" ingress: enabled: true className: "nginx" minio: embedded: true redis: embedded: false postgresql: embedded: false api: envs: - name: "MIGRATION_ENABLED" value: "true"
接下来可以部署 Dify 了。
helm upgrade -i dify douban/dify -f values.yaml
kubectl get pods -l app.kubernetes.io/name=dify
等待 Dify 相关 Pod 状态都变为 Running。
kubectl get pods -l app.kubernetes.io/name=dify
>
NAME READY STATUS RESTARTS AGE
dify-worker-5f5f99b7b7-p6qk8 1/1 Running 0 97s
dify-sandbox-7bf987566c-2fj6w 1/1 Running 0 97s
dify-frontend-c9df5ddb4-4v8jp 1/1 Running 0 97s
dify-api-7c98b9847c-4tgjx 1/1 Running 0 97s
Dify 通过 Ingress 对外暴露服务,执行 kubectl get ingress -l app.kubernetes.io/name=dify
,确认 dify ingress 的访问地址。
kubectl get ingress -l app.kubernetes.io/name=dify
>
NAME CLASS HOSTS ADDRESS PORTS AGE
dify nginx mydify.example.com 10.43.65.209 80 2m48s
如果 ingress 域名不是公共可解析的,比如自定义的私有域名,那么需要在要访问 Dify 的客户端配置对域名 mydify.example.com
的静态解析。
请注意替换 10.43.65.209 为环境中实际的 dify ingress 的 IP 地址。
sudo echo '10.43.65.209 mydify.example.com' >> /etc/hosts
然后浏览器访问 http://mydify.example.com
,就可以打开 Dify 控制台了。
先注册一个管理员账号,然后登录可以看到 Dify 主界面。
随着业务发展,不可避免的要对数据库做各种运维操作,KubeBlocks 对 day-2 的运维操作支持非常完善,比如升降级、扩缩容、启停等等,以下是一些常见的例子。
假如用户在知识库上传的文件越来越多,三节点 Qdrant 处理能力不足,我们有两种选择:
这两种扩容 KubeBlocks 都支持,先看垂直扩容,比如增加 CPU 到 8 核,内存到 32Gi。
kbcli cluster vscale qdrant --components qdrant --cpu 8 --memory 32Gi
还可以选择水平扩容增加更多的节点,比如从 3 节点,扩容到 5 节点。
kbcli cluster hscale qdrant --replicas 5
当然,如果业务需求下降,比如用户删除了大批量文档,也可以垂直和水平缩容,操作命令跟扩容是一样的。
假如注册用户数量越来越多,PostgreSQL 元数据库存储空间不太够用了,可以进行扩容存储,比如扩到 50Gi。
kbcli cluster volume-expand postgresql --components postgresql --storage=50Gi --volume-claim-templates=data
当 PostgreSQL 元数据库出现异常,比如报错时,可以尝试重启集群解决,也非常简单。
kbcli cluster restart postgresql
本文介绍了如何用 KubeBlocks+Dify 构建生产级别 AIGC 应用,充分发挥了 KubeBlocks 在数据基础设施管理,以及 Dify 在 AIGC 应用开发领域的优势,两者的结合极大的提高了 AIGC 应用开发部署效率,整体架构非常灵活,具备很强的扩展性,降低了生产环境运维复杂度。
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,也欢迎您成为产品的使用者和项目的贡献者。跟我们一起构建云原生数据基础设施吧!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。