AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


在 Kubernetes 上用 KubeBlocks + Dify 快速构建生产级 AIGC 应用
发布日期:2024-07-18 08:01:02 浏览次数: 2452


前言



在数字化时代,人工智能生成内容(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


操作说明




01

安装 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

对于 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 来管理数据库,提供了更底层、更全面的视角来观察和操作数据库集群。


02

创建 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




03

创建 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



04

创建 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



05

部署 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



06

访问 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.0KubeBlocks v0.9.0 全面升级了 API,构建一个 Cluster 更像是在用 Component “搭积木”!新增 topologies 字段,支持多种部署形态。InstanceSet 代替了 StatefulSet 来管理 Pods,支持将指定的 Pod 下线、Pod 原地更新,同时也支持数据库主从架构里主库和从库采用不同的 Pod spec。v0.9.0 还新增了 Reids 集群模式(分片模式),系统的容量、性能以及可用性显著提升!还支持了 MySQL 主备,资源的要求更少,数据复制的开销也更小!快来试试看!


53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询