Featured image of post K8s部署Cloudreve

K8s部署Cloudreve

基于K8s部署一个简单的Cloudreve服务

K8s部署Cloudreve

前置申明

本教程适用于将Cloureve安装到K8s集群中这一操作,至于各种高级操作(比如绑定unix、webdav等),是不支持的

数据库采用外置阿里云数据库,Ingress采用的Nginx,并通过hostNetwork模式安装Ingress container

准备工作

  1. 阿里云数据库的连接信息
  2. 一个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资源

具体是三个黄色框体部分

Clip_2024-04-20_23-20-57

确定他们都存在后继续

发布该服务(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下资源文件就行,正常情况下应该不会报错

Clip_2024-04-20_23-52-20

检查资源是否上线

你应该能看到下面这些资源

  • 一个POD
  • 一个Deployment
  • 一个RS
  • 一个Service
  • 一个Secret
  • 一个Ingress

具体如图

Clip_2024-04-20_23-53-50

secret由于存在机密,就不展示了

此时打开网页,访问域名,应该就能够看到正常上线了

Clip_2024-04-20_23-54-42

结语

下班下班,下期出个minio的对接教程

时间流逝中|构建版本:40|构建时间:2024-04-23 09:51|Jenkins自动构建正常运行中
Built with Hugo
主题 StackJimmy 设计