K8s部署Cloudreve
前置申明
本教程适用于将Cloureve安装到K8s集群中这一操作,至于各种高级操作(比如绑定unix、webdav等),是不支持的
数据库采用外置阿里云数据库,Ingress采用的Nginx,并通过hostNetwork模式安装Ingress container
准备工作
- 阿里云数据库的连接信息
- 一个K8s集群
部署步骤
部署Deployment
采用的单副本部署、无亲和度、采用独立命名空间进行存放
这里因为要映射配置文件,所以使用了Secret 文件引入方式,将文件挂载到卷上,然后将卷挂载到/cloudreve/conf.ini
---
apiVersion: apps/v1 # 使用apps/v1
kind: Deployment # 资源类型
metadata:
name: cloudreve-deploy # 定义名称
namespace: cloudreve-ns # 命名空间(记得提前创建)
labels:
region: cq # 服务部署的位置,这里我是自定义,可以不添加
app: cloudreve # 重要:全局标识,用于其他的资源捕获该资源,请勿修改
spec:
replicas: 1 # 单副本
selector:
matchLabels:
app: cloudreve # 匹配POD的Label中包含app: cloudreve的POD
template:
metadata: # 模板元信息(创建的POD将会集成这些信息)
name: cloudreve-pod # 名称
namespace: cloudreve-ns # 命名空间
labels:
app: cloudreve # 重要:该标识必须与matchLabels中的一致,才能保证通过deployment创建的RS中创建的Pod具有该标签
spec:
containers: # 定义容器
- name: cloudreve
image: cloudreve/cloudreve:latest # 官方镜像
imagePullPolicy: IfNotPresent # 配置除非不存在,否则拉取,避免意外更新
ports:
- containerPort: 5212 # 设置对外公开端口
volumeMounts:
- mountPath: /cloudreve/conf.ini # 挂载文件到容器的指定位置
name: appdata # 卷名称
subPath: cloudreve.conf # 挂载文件名
volumes:
- name: appdata # 卷名
secret:
secretName: cloudreve # 调用机密名
完成上述配置后,请先创建你的机密和命名空间,命令如下
请将配置文件放到同目录
cloudreve.conf
中
# 创建命名空间
kubectl create namespace cloudreve-ns
# 创建机密
kubectl create secret generic cloudreve --from-file=./cloudreve.conf -n cloudreve-ns
关于配置文件的示例,可以看下面这个
请修改配置文件中有<>的部分,其他不用管
[System]
; 运行模式
Mode = master
; 监听端口
Listen = :5212
; 是否开启 Debug
Debug = false
; Session 密钥, 一般在首次启动时自动生成
SessionSecret = 23333
; Hash 加盐, 一般在首次启动时自动生成
HashIDSalt = something really hard to guss
; 呈递客户端 IP 时使用的 Header
ProxyHeader = X-Forwarded-For
; 数据库相关,如果你只想使用内置的 SQLite 数据库,这一部分直接删去即可
[Database]
; 数据库类型,目前支持 sqlite/mysql/mssql/postgres
Type = mysql
; MySQL 端口
Port = 3306
; 用户名
User = <db用户名>
; 密码
Password = <db密码>
; 数据库地址
Host = <DB地址>
; 数据库名称
Name = <DB_name>
; 数据表前缀
TablePrefix = cd_
; 字符集
Charset = utf8
; SQLite 数据库文件路径
DBFile = cloudreve.db
; 进程退出前安全关闭数据库连接的缓冲时间
GracePeriod = 30
; 使用 Unix Socket 连接到数据库
UnixSocket = false
; 从机模式下的配置
[Slave]
; 通信密钥
Secret = <随意输入,没意义>
; 回调请求超时时间 (s)
CallbackTimeout = 20
; 签名有效期
SignatureTTL = 60
; 跨域配置
[CORS]
AllowOrigins = *
AllowMethods = OPTIONS,GET,POST
AllowHeaders = *
AllowCredentials = false
SameSite = Default
Secure = lse
; Redis 相关
; [Redis]
; Server = 127.0.0.1:6379
; Password =
; DB = 0
; 从机配置覆盖
[OptionOverwrite]
; 可直接使用 `设置名称 = 值` 的格式覆盖
max_worker_num = 50
配置完毕后,输入下面命令部署
kubectl apply -f ./deploy-cloudreve.conf
即可正常部署
校验Deployment是否部署成功
正常情况下,将会生产一个RS
资源,一个POD
资源,一个Deployment
资源
具体是三个黄色框体部分
确定他们都存在后继续
发布该服务(service+ingress)
因为我们服务要对外访问,因此需要部署一个service,由于我有ingress,因此使用ingress发布该服务。
首先创建一个Service,采用clusterip,用于将pod中的端口暴露出来,方便后续我们ingress去对接
apiVersion: v1
kind: Service
metadata:
name: cloudreve-service
namespace: cloudreve-ns # 命名空间记得和pod一样
spec:
selector: # 捕获包含标签app: cloudreve的pod
app: cloudreve
ports:
- protocol: TCP # 走TCP协议
port: 5212 # 通过端口
targetPort: 5212 # 进入到容器内该端口(本端口和你配置文件中监听的端口要一致)
这样就启动了一个service,此时,你集群中访问ClusterIP:targetPort应该就能访问到POD内的网页了
接着对接ingress,对接ingress前记得先导入你的证书(有就做,没有就不管)
命令如下
kubectl create secret tls <TLS证书名-自定义-请记住他> --cert=./<证书文件pem> --key=<证书文件key> -n cloudreve-ns
执行后,编写ingress资源文件
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: cloudreve-ingress
namespace: cloudreve-ns # 命名空间一致!
labels:
app: cloudreve
region: cq
annotations: # 这部分是绑定用户和POD的,可选,对于浏览器有效
nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/session-cookie-name: "cloudreve-cookie"
nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"
nginx.org/websocket-services: "cloudreve-service"
spec:
ingressClassName: nginx # 这里按照安装ingress时配置的名称来定(大型集群会有多个ingress,用这个区分),默认是nginx
rules:
- host: <域名> # 绑定域名
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: cloudreve-service # 对应service的名称,请填写正确
port:
number: 5212 # 对应端口(填写service的port(不是targetport))
tls:
- hosts:
- <域名> # 如果你一个ingress资源中包含多个网站,这里则填写多个即可。但是注意只有通配符证书才能这么搞,单域名证书老老实实一个一个来
secretName: <LS证书名-自定义-请记住他> # 对应刚才创建的TLS证书名
然后还是apply下资源文件就行,正常情况下应该不会报错
检查资源是否上线
你应该能看到下面这些资源
- 一个POD
- 一个Deployment
- 一个RS
- 一个Service
- 一个Secret
- 一个Ingress
具体如图
secret由于存在机密,就不展示了
此时打开网页,访问域名,应该就能够看到正常上线了
结语
下班下班,下期出个minio的对接教程