一、概述

dify官方提供的安装方式是docker-compose方式部署的,单机运行。
但是在企业生产环境,单机没法提供冗余,一旦故障,就很麻烦了。
如果有大量的APP用户,那么单机承受不住这么多并发,也会出现故障。
 
很多小伙伴们,想在k8s中运行dify,解决冗余以及并发问题,直接扩容节点即可。
注意:只有企业版会提供k8s部署,社区版是没有的。
对于我们这种个人开发者来说,囊中羞涩,不愿意花费这笔钱。企业版还得联系商务,提供企业相关信息,特别麻烦。
 
对于在k8s中部署dify,确实比较难。几个月前一筹莫展,经过不懈的努力,终于搞定了。

二、准备工作

前提条件

硬件

CPU:建议至少 4 核。
内存:建议至少 8GB,推荐 16GB。
存储:建议至少 20GB 可用空间。
操作系统:推荐 Ubuntu 22.04+ 或 WSL(Windows 子系统)。
软件依赖:需要 Docker(版本 20.10.5 或更高)和 Docker Compose(版本 2.0.0 或更高)

软件

Docker,Docker Compose,参考文章:https://www.cnblogs.com/xiao987334176/p/18809253
如果有现成的私有仓库,可以忽略
如果有现成的NFS,可以忽略
 
符合以上条件,就可以部署了

镜像推送

下载镜像

docker pull postgres:15-alpine
docker pull redis:6-alpine
docker pull semitechnologies/weaviate:1.19.0
docker pull nginx:latest
docker pull langgenius/dify-plugin-daemon:0.0.6-local
docker pull langgenius/dify-sandbox:0.2.11
docker pull ubuntu/squid:latest
docker pull langgenius/dify-api:1.1.3
docker pull langgenius/dify-web:1.1.3

推送镜像

这里使用shell脚本完成

#!/bin/bash

images="postgres:15-alpine
redis:6-alpine
semitechnologies/weaviate:1.19.0
nginx:latest
langgenius/dify-plugin-daemon:0.0.6-local
langgenius/dify-sandbox:0.2.11
ubuntu/squid:latest
langgenius/dify-api:1.1.3
langgenius/dify-web:1.1.3" # 遍历镜像列表,并推送到harbor
for line in $images; do
#echo "$line"
docker tag $line harbor.qq.com:8083/dify/$line
docker push harbor.qq.com:8083/dify/$line
done

注意修改harbor的的地址为实际访问地址

登录到harbor,查看镜像

创建命名空间以及密钥

创建命名空间dify
kubectl create namespace dify
创建拉取镜像需要的密钥
kubectl create secret docker-registry harbor-key --docker-server=harbor.qq.com:8083 --docker-username=devops --docker-password=1sB5r9UShgK5 --namespace=dify

注意:修改harbor地址,用户名,密码。

下载部署yaml

yaml已经写好了,推送到我个人的github,地址:https://github.com/987334176/dify-k8s

下载项目后,进入文件夹1.1.3

目录结构

env --> 全局环境变量
pvc --> 所有组件,统一使用一个pvc来进行持久化存储
databases --> 数据库相关:postgresql,redis,weaviate
middleware --> 中间件相关:plugin-daemon,sandox,ssf-proxy,nginx
services --> 服务相关:api,web,worker

三、创建全局环境变量

这里有500个多个变量,直接一键运行

kubectl apply -f env/env.yaml

四、创建pv和pvc

创建storageClass,因为pv和pvc必须是同一个storageClass才能绑定成功

kubectl apply -f pvc/storageClass.yaml

注意:修改NFS 服务端的共享路径

创建pv,pvc。注意:这里的pv是自建的NFS,请根据实际情况修改

kubectl apply -f pvc/pv.yaml
kubectl apply -f pvc/pvc.yaml

查看pvc状态,注意:请确保pvc状态为Bound

# kubectl -n dify get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
dify-pvc Bound dify 10Gi RWX nfs-storage <unset> 12m

服务器已经挂载好了NFS,进入到NFS根目录

cd /mnt/nfs_share

创建dify相关持久化文件,并设置权限

mkdir -p dify/volumes/db/data
mkdir -p dify/volumes/redis/data
mkdir -p dify/volumes/weaviate
mkdir -p dify/volumes/plugin_daemon
mkdir -p dify/volumes/app/storage
chmod 777 -R dify

五、数据库相关

postgresql

修改文件postgres-StatefulSet.yaml

vi databases/postgresql/postgres-StatefulSet.yaml

修改红色部分,增加了密钥,改了镜像地址

    spec:
imagePullSecrets:
- name: harbor-key
terminationGracePeriodSeconds: 10
containers:
- name: postgres
image: harbor.qq.com:8083/dify/postgres:15-alpine

发布应用

kubectl apply -f databases/postgresql/postgres-StatefulSet.yaml
kubectl apply -f databases/postgresql/postgres-Service.yaml

查看postgresql日志

# kubectl -n dify logs -f postgres-0
...
UTC [72] WARNING: no usable system locales were found
performing post-bootstrap initialization ...

第一次会出现,pod到这里就终止了,不用管

再次查看日志。

# kubectl -n dify logs -f postgres-0
2025-04-05 16:29:11.415 UTC [1] LOG: database system is ready to accept connections
2025-04-05 16:29:13.707 UTC [46] FATAL: database "postgres" does not exist
2025-04-05 16:29:18.721 UTC [53] FATAL: database "postgres" does not exist
...

提示数据库postgres不存在,因为在全局configMap里面,POSTGRES_DB的值为dify,所以默认的postgres不会创建。

这个是不影响dify运行的,但是postgres的健康检查命令,必须要这个数据库存在,否则会一直发日志。

手动创建postgres

kubectl -n dify exec -it postgres-0 -- createdb postgres

再次查看日志,就不会再出现了。

进入容器,查看dify数据库是否创建完成

# kubectl -n dify exec -it postgres-0 -- /bin/bash
postgres-0:/# pg_isready -U $PGUSER -d $POSTGRES_DB
/var/run/postgresql:5432 - accepting connections

出现accepting connections,说明连接成功了

111

k8s部署dify详细过程的更多相关文章

  1. .NetCore 使用k8s部署服务的过程中需要注意的地方以及遇到的问题

    这里开始我准备了3台测试服务器,这里我使用了JumpServer管理起来了,这里我们来看下: Master :192.168.0.236 Node1:192.168.0.237 Node2:192.1 ...

  2. HBase 1.2.6 完全分布式集群安装部署详细过程

    Apache HBase 是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统,是NoSQL数据库,基于Google Bigtable思想的开源实现,可在廉价的PC Server上搭建大规模结构化存 ...

  3. 拥抱云原生,如何将开源项目用k8s部署?

    微信搜索[阿丸笔记],关注Java/MySQL/中间件各系列原创实战笔记,干货满满. k8s以及云原生相关概念近年来一直比较火热,阿丸最近搞了个相关项目,小结一下. 本文将重点分享阿里开源项目otte ...

  4. 最简单的 K8S 部署文件编写姿势,没有之一!

    1. 头疼编写K8S部署文件? K8S yaml 参数很多,需要边写边查? 保留回滚版本数怎么设? 如何探测启动成功,如何探活? 如何分配和限制资源? 如何设置时区?否则打印日志是GMT标准时间 如何 ...

  5. 部署Bookinfo示例程序详细过程和步骤(基于Kubernetes集群+Istio v1.0)

    部署Bookinfo示例程序详细过程和步骤(基于Kubernetes集群+Istio v1.0) 部署Bookinfo示例程序   在下载的Istio安装包的samples目录中包含了示例应用程序. ...

  6. 记录一次用宝塔部署微信小程序Node.js后端接口代码的详细过程

    一直忙着写毕设,上一次写博客还是元旦,大半年过去了.... 后面会不断分享各种新项目的源码与技术.欢迎关注一起学习哈! 记录一次部署微信小程序Node.js后端接口代码的详细过程,使用宝塔来部署. 我 ...

  7. spinnaker自动发布k8s部署应用<一>

    一.准备环境 !docker-ce---17.06.2-ce !k8s集群----1.11.1 !helm部署工具---helm-v2.10.0 !spinnaker-charts---spinnak ...

  8. Jenkins+Git+Docker+K8s部署

    准备工作 Jenkins已安装 Docker和K8s部署运行成功 代码管理工具使用Git 最近公司项目使用Jenkins+Git+Docker+K8s进行持续化构建部署,这里笔者整理了一下构建部署的相 ...

  9. Kubernetes(k8s)部署redis-cluster集群

    Redis Cluster 提供了一种运行 Redis 安装的方法,其中数据 在多个 Redis 节点之间自动分片. Redis Cluster 还在分区期间提供了一定程度的可用性,这实际上是在某些节 ...

  10. K8S部署之kubeadm

    K8S部署笔记 一.集群环境说明 主机名 IP地址 说明 k8s-master01 192.168.1.107 master节点 k8s-master02 192.168.1.108 master节点 ...

随机推荐

  1. 微服务实战系列(三)-springcloud、springboot及maven之间关系-copy

    1 . 问题描述 随着springboot.springcloud的不断迭代升级,开发效率不断提升,越来越多的开发团队加入到spring的大军中,今天用通俗的语言,介绍下什么是springboot,s ...

  2. 项目PMP之一项目管理介绍

    一.项目定义: 概要:为创造独特的产品.服务或成果而进行的临时性工作 组织创造价值和效益.项目驱动变更创造商业价值的主要方式 特性/要素: 独特的产品.服务或成果,即一个或多个可交付成果(范围.进度( ...

  3. Linux 开发环境常用配置

    记录下我个人 Linux 开发环境常用配置,后续可以简单写个小脚本可以把一系列安装配置操作自动化一把. zsh install & conf https://blog.csdn.net/amo ...

  4. 对rpc长连接与短连接的思考

    大家好,我是思无邪,某go中厂开发工程师,也是OSPP2024的学生参与者! 如果你觉得我的文章有帮助,记得三连支持一下哦! 目前正在深入研究源码,与你们一起进步,共同攻克编程难关! 欢迎关注我的公众 ...

  5. 我们是如何解决abp身上的几个痛点

    大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进. abp框架在.net社区是spring一样的存在,用的人也非常多,毫无疑问,它确实 ...

  6. Linux驱动---/sys接口

    目录 一.伪文件 sys 二.led_classdev结构体 三.注册/注销LED 3.1.led_classdev_register 函数 3.2.led_classdev_unregister 函 ...

  7. 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-15- iframe操作--番外篇 (详细教程)

    1.简介 通过前边三篇的学习,想必大家已经对iframe有了一定的认识和了解,今天这一篇主要是对iframe的一些特殊情况的介绍和讲解,主要从iframe的定位.监听事件和执行js脚本三个方面进行展开 ...

  8. [ERR] 1273 - Unknown collation: 'utf8mb4_0900_ai_ci'

    使用navicate12运行sql文件出错 报错: [ERR] 1273 - Unknown collation: 'utf8mb4_0900_ai_ci'1报错原因:生成转储文件的数据库版本为8.0 ...

  9. Openlayers 距离环绘制

    思路:利用layer的StyleFunction 来使地图移动或者放缩的时候,使圆保持在地图中心 /** * 绘制距离环 * @param {number} distance 每环间隔距离,单位:米 ...

  10. Android设备基础信息获取 源码修改方式 APK开发

    APK 获取设备信息 头文件 import java.io.BufferedReader; import java.io.File; import java.io.FileFilter; import ...