前言
在数字化时代,人工智能生成内容(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。
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 来管理数据库,提供了更底层、更全面的视角来观察和操作数据库集群。
创建 PostgreSQL 元数据库
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
创建 Qdrant 向量数据库
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
创建 Redis 内存数据库
Dify 用 Redis 存储用户对话历史记录,我们创建一个支持高可用的 Redis 集群,这个集群有 redis 和 sentinel 两种组件。
redis 节点 2 副本,一主一备,规格是 2C1G,存储 20G sentinel 节点 3 副本,规格 0.2C0.2G,存储 20G# 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
部署 Dify
执行 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,主要是设置了相关数据库的访问信息,比如链接地址,用户名和密码等。
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
生成。
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
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 处理能力不足,我们有两种选择:
垂直扩容,给每个 Qdrant 节点加更多的 CPU 和内存。 水平扩容,加更多的 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 应用开发部署效率,整体架构非常灵活,具备很强的扩展性,降低了生产环境运维复杂度。
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
关注小猿姐,一起学习更多云原生技术干货。
总结
**文章总结**:本文主要介绍了如何利用KubeBlocks和Dify技术栈构建并部署生产级别的AIGC应用,以满足人工智能内容生成(AIGC)技术的日益.*?盛需求。在数字化浪潮中,AIGC技术为内容创作者和企业带来了新的机会,但开发者面临技术实施和基础设施管理的挑战。
**1. Dify技术栈介绍**:
- Dify作为一个开源大语言模型应用开发平台,旨在帮助开发者快速、简便地实现从创意到产品的全流程。它拥有丰富的模型支持、易用的Prompt设计工具和灵活的Agent框架。
**2. KubeBlocks价值阐述:**
- KubeBlocks提供了一套基于Kubernetes的数据基础设施管理平台,解决了管理复杂数据基础设施的难题,包括关系型、内存型和向量数据库等。KubeBlocks支持一键式部署、自动故障恢复以及无缝扩展,确保了可靠性、弹性和可观测性。
**3. 结合KubeBlocks和Dify:**
- 两者结合提供了一种高效的AIGC应用开发部署方案。Dify负责应用的快速开发,KubeBlocks则承担基础设施的稳定运维管理任务。这种组合降低了技术实施门槛,加速了产品开发周期,提升了应用的可靠性和可扩展性。
**4. 操作指南:**
- 详细阐述了如何在Kubernetes环境中安装KubeBlocks,并为其配置Qdrant向量数据库和其他必要数据库服务(如PostgreSQL和Redis)。之后指导了如何通过Kubernetes的Helm工具部署和初始化Dify平台。
**5. 基础设施运维简化:**
- 借助KubeBlocks,可以轻松实现数据基础设施的日常运维操作,包括扩缩容、磁盘空间扩展和集群重启等。这些操作简化了生产环境的运维和维护。
**6. KubeBlocks v0.9.0发布信息:**
- 文章末尾提及KubeBlocks的新版本v0.9.0,介绍了其API的新功能和增强特性,以及新增的支持和功能,如Redis分片模式、MySQL主备支持等,鼓励用户使用和贡献项目。
整体而言,该文章为那些希望在云原生环境下构建和运维AIGC应用的开发者和团队提供了一套实用的指导和工具解决方案。KubeBlocks和Dify的结合使得AIGC应用开发变得更加简单和高效。