【云原生之kubernetes实战】在k8s环境下部署go-file文件分享工具

时间:2024-10-05 18:37:09

【云原生之kubernetes实战】在k8s环境下部署go-file文件分享工具

  • 一、go-file介绍
    • 1.1 go-file简介
    • 1.2 go-file特点
    • 1.3 go-file使用场景
  • 二、本次实践介绍
    • 2.1 本次实践简介
    • 2.2 本次环境规划
    • 2.3 本次实践存储介绍
    • 2.4 k8s存储介绍
  • 三、检查k8s环境
    • 3.1 检查工作节点状态
    • 3.2 检查系统pod状态
  • 四、部署storageclass
    • 4.1 配置NFS服务器
    • 4.2 部署storageclass
  • 五、使用PVC
    • 5.1 创建部署目录
    • 5.2 创建命令空间
    • 8.3 创建PVC
    • 5.4 编辑文件
    • 5.5 部署项目
    • 5.6 查看pod状态
  • 六、访问项目
    • 6.1 访问go-file初始页
    • 6.2 登录go-file
    • 6.3 系统管理
    • 6.4 上传文档
    • 6.5 上传图片
    • 6.6 浏览上传图片
    • 6.7 上传视频文件
    • 6.8 浏览文件
    • 6.9 分享文件
  • 七、总结

一、go-file介绍

1.1 go-file简介

go-file是一款开源的文件分享工具,仅单个可执行文件,开箱即用,可用于局域网内分享文件和文件夹,直接跑满本地带宽 。

1.2 go-file特点

  • 无需配置环境,仅单个可执行文件,直接双击即可开始使用。
  • 自动打开浏览器,分享文件快人一步。
  • 提供二维码,可供移动端扫描下载文件,告别手动输入链接。
  • 支持分享本地文件夹。
  • 适配移动端。
  • 内置图床,支持直接粘贴上传图片,提供图片上传 API。
  • 内置视频播放页面,可用于在其他设备上在线博客自己电脑上的视频,轻松跨设备在线看视频。
  • 支持拖拽上传,拷贝上传。
  • 允许对不同类型的用户设置文件访问权限限制。
  • 访问频率限制。
  • 支持 Token API 验证,便于与其他系统整合。
  • 为不熟悉命令行的用户制作了启动器。
  • 支持 PicGo,插件搜索 gofile 即可安装。
  • 配套 CLI 工具,支持命令行上传文件,支持 P2P 模式文件分享

1.3 go-file使用场景

go-file可以在以下场景进行使用:

  • 团队协作:多人共享文件,可以用于团队内部的文件共享和交流。团队成员可以将文件上传至go-file,并通过生成的链接分享给其他人进行下载。

  • 学习资料分享:教师可以将课件、教材等学习资料上传到go-file,然后将链接分享给学生进行下载。学生也可以将学习资料上传至go-file与其他同学进行分享。

  • 个人文件备份:用户可以将重要的个人文件上传到go-file进行备份,以防止文件丢失或损坏。用户可以根据需要随时下载备份文件。

  • 客户文件共享:企业可以使用go-file来分享与客户合作的文件,如合同、报价单等。通过生成的链接,可以方便地与客户共享文件。

  • 程序代码分享:开发者可以将自己的程序代码上传到go-file,并通过链接分享给其他开发者,方便进行代码交流和共享。

二、本次实践介绍

2.1 本次实践简介

1.本次实践环境为个人测试学习环境,生产环境请谨慎使用;
2.本次实践是在k8s环境中部署go-file文件分享工具。

2.2 本次环境规划

本次实践规划环境介绍

hostname IP地址 操作系统版本 k8s版本 角色
k8s-master 192.168.3.201 centos7.6 v1.27.4 master节点
k8s-node01 192.168.3.202 centos7.6 v1.27.4 worker节点
k8s-node02 192.168.3.203 centos7.6 v1.27.4 worker节点

2.3 本次实践存储介绍

我们在部署yaml文件中指定本地/data/mikochi/data目录用于存储Mikochi数据,但是在 Kubernetes 中,Pod 默认是临时的,当 Pod 在不同的工作节点之间迁移时,它的本地数据将会丢失,本次实践通过StorageClass方式来保证数据的持久化存储。

2.4 k8s存储介绍

  • HostPath 类型的Volume允许将宿主机文件系统中的目录或文件直接挂载到容器中,这通常用于需要访问宿主机特定资源(如日志文件、配置文件等)的情况。HostPath 作为一种数据持久化的方式,将宿主机上的文件或目录映射到Pod中。

  • StorageClass 是一种用于定义持久卷(Persistent Volume, PV)创建策略的资源对象,它抽象出了存储的特性,如性能等级、复制策略等,使得管理员可以定义多种存储类型,用户则可以通过请求相应的StorageClass 来动态创建PV。StorageClass 不直接与宿主机的配置相关,而是与后端存储系统(如NFS、Ceph、云存储服务等)的特性绑定。

  • PersistentVolumeClaim (PVC) 则是一种由用户创建的对象,用于请求特定大小和特性的存储空间。当PVC与StorageClass 关联时,Kubernetes会自动根据PVC的要求创建一个合适的PV。PVC一旦被绑定到PV,就可以通过Pod中的Volume与Pod关联,从而为Pod提供持久化的存储能力。

总结:HostPath 类型的Volume用于将宿主机的目录或文件映射到Pod中,而StorageClass 定义了动态创建PV的策略,PersistentVolumeClaim (PVC) 则用于请求特定特性的存储空间,通过与PV绑定,为Pod提供持久化存储能力。在实际部署中,我们可以通过DaemonSetStatefulSet 控制器来确保每个节点上运行的Pod都能正确地访问到所需的存储资源,但这并不直接涉及对宿主机配置的修改。

三、检查k8s环境

3.1 检查工作节点状态

检查k8s的各工作节点状态

[root@k8s-master ~]# kubectl get nodes
NAME         STATUS   ROLES           AGE    VERSION
k8s-master   Ready    control-plane   198d   v1.27.4
k8s-node01   Ready    <none>          198d   v1.27.4
k8s-node02   Ready    <none>          198d   v1.27.4

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

3.2 检查系统pod状态

检查k8s集群中各系统组件的pod状态,确保都处于正常状态。

[root@k8s-master ~]#  kubectl get pods -n kube-system
NAME                                       READY   STATUS    RESTARTS       AGE
calico-kube-controllers-85578c44bf-8xg6x   1/1     Running   0              6h20m
calico-node-8tts7                          1/1     Running   15 (28m ago)   355d
calico-node-fx8mv                          1/1     Running   17 (27m ago)   355d
calico-node-n8rt4                          1/1     Running   18 (27m ago)   355d
coredns-7bdc4cb885-9dbfp                   1/1     Running   6 (27m ago)    6h20m
coredns-7bdc4cb885-g49qn                   1/1     Running   4 (28m ago)    6h20m
etcd-k8s-master                            1/1     Running   16 (28m ago)   355d
kube-apiserver-k8s-master                  1/1     Running   18 (28m ago)   355d
kube-controller-manager-k8s-master         1/1     Running   52 (16m ago)   355d
kube-proxy-6vvw5                           1/1     Running   15 (27m ago)   355d
kube-proxy-867jg                           1/1     Running   15 (28m ago)   355d
kube-proxy-lgsc8                           1/1     Running   15 (27m ago)   355d
kube-scheduler-k8s-master                  1/1     Running   51 (15m ago)   355d
metrics-server-5bb4678945-5dd4j            1/1     Running   6 (27m ago)    6h20m
metrics-server-5bb4678945-m8fn7            1/1     Running   35 (27m ago)   222d
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

四、部署storageclass

4.1 配置NFS服务器

在master节点上,我们将其作为NFS共享服务器,安装rpc和nfs服务。

yum -y install rpcbind nfs-utils
  • 1

创建目录并修改权限

mkdir -p /nfs/data && chmod 766 /nfs/data
  • 1

编辑/etc/exports 文件

echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports
  • 1

载入配置

exportfs -r
  • 1

启动nfs服务

systemctl enable rpcbind --now  && systemctl enable nfs --now
  • 1

检查nfs共享状态

[root@k8s-master mikochi]# showmount -e 192.168.3.201
Export list for 192.168.3.201:
/nfs/data *
  • 1
  • 2
  • 3

在工作节点k8s-node01和k8s-node02上安装NFS服务

yum -y install rpcbind nfs-utils
systemctl enable rpcbind --now  && systemctl enable nfs --now
  • 1
  • 2

在工作节点k8s-node01和k8s-node02上检查nfs共享状态,确保正常访问NFS服务器。

[root@k8s-node01 mikochi]# showmount -e 192.168.3.201
Export list for 192.168.3.201:
/nfs/data *
  • 1
  • 2
  • 3

4.2 部署storageclass

StorageClass是Kubernetes中的一个资源对象,用于定义持久卷的动态分配策略。StorageClass允许管理员在集群中定义不同类型的持久卷,并指定不同类型的存储类。当应用程序需要使用持久卷时,可以通过声明一个PersistentVolumeClaim(PVC)来请求一个动态分配的持久卷。Kubernetes将根据PVC的存储类选择一个合适的持久卷,并将其绑定到PVC上。

编辑文件

vim  
  • 1
apiVersion: storage./v1
kind: StorageClass
metadata:
 name: nfs-storage
 annotations:
   /is-default-class: "true"
provisioner: k8s-/nfs-subdir-external-provisioner
parameters:
 archiveOnDelete: "true"  ## 删除pv的时候,pv的内容是否要备份

---
apiVersion: apps/v1
kind: Deployment
metadata:
 name: nfs-client-provisioner
 labels:
   app: nfs-client-provisioner
 # replace with namespace where provisioner is deployed
 namespace: default
spec:
 replicas: 1
 strategy:
   type: Recreate
 selector:
   matchLabels:
     app: nfs-client-provisioner
 template:
   metadata:
     labels:
       app: nfs-client-provisioner
   spec:
     serviceAccountName: nfs-client-provisioner
     containers:
       - name: nfs-client-provisioner
         image: -/lfy_k8s_images/nfs-subdir-external-provisioner:v4.0.2
         # resources:
         #    limits:
         #      cpu: 10m
         #    requests:
         #      cpu: 10m
         volumeMounts:
           - name: nfs-client-root
             mountPath: /persistentvolumes
         env:
           - name: PROVISIONER_NAME
             value: k8s-/nfs-subdir-external-provisioner
           - name: NFS_SERVER
             value: 192.168.3.201 ## 指定自己nfs服务器地址
           - name: NFS_PATH
             value: /nfs/data  ## nfs服务器共享的目录
     volumes:
       - name: nfs-client-root
         nfs:
           server: 192.168.3.201
           path: /nfs/data
---
apiVersion: v1
kind: ServiceAccount
metadata:
 name: nfs-client-provisioner
 # replace with namespace where provisioner is deployed
 namespace: default
---
kind: ClusterRole
apiVersion: ./v1
metadata:
 name: nfs-client-provisioner-runner
rules:
 - apiGroups: [""]
   resources: ["nodes"]
   verbs: ["get", "list", "watch"]
 - apiGroups: [""]
   resources: ["persistentvolumes"]
   verbs: ["get", "list", "watch", "create", "delete"]
 - apiGroups: [""]
   resources: ["persistentvolumeclaims"]
   verbs: ["get", "list", "watch", "update"]
 - apiGroups: ["storage."]
   resources: ["storageclasses"]
   verbs: ["get", "list", "watch"]
 - apiGroups: [""]
   resources: ["events"]
   verbs: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: ./v1
metadata:
 name: run-nfs-client-provisioner
subjects:
 - kind: ServiceAccount
   name: nfs-client-provisioner
   # replace with namespace where provisioner is deployed
   namespace: default
roleRef:
 kind: ClusterRole
 name: nfs-client-provisioner-runner
 apiGroup: .
---
kind: Role
apiVersion: ./v1
metadata:
 name: leader-locking-nfs-client-provisioner
 # replace with namespace where provisioner is deployed
 namespace: default
rules:
 - apiGroups: [""]
   resources: ["endpoints"]
   verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: ./v1
metadata:
 name: leader-locking-nfs-client-provisioner
 # replace with namespace where provisioner is deployed
 namespace: default
subjects:
 - kind: ServiceAccount
   name: nfs-client-provisioner
   # replace with namespace where provisioner is deployed
   namespace: default
roleRef:
 kind: Role
 name: leader-locking-nfs-client-provisioner
 apiGroup: .

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125

安装storageclass

kubectl apply -f 
  • 1

查看storageclass状态

[root@k8s-master mikochi]# kubectl apply -f 
./nfs-storage unchanged
/nfs-client-provisioner created
serviceaccount/nfs-client-provisioner created
./nfs-client-provisioner-runner created
./run-nfs-client-provisioner created
./leader-locking-nfs-client-provisioner created
./leader-locking-nfs-client-provisioner created
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

五、使用PVC

5.1 创建部署目录

在master节点创建部署目录

mkdir -p /data/gofile   &&  cd /data/gofile/
  • 1

5.2 创建命令空间

创建gofile命名空间

[root@k8s-master mikochi]# kubectl create namespace gofile
namespace/mikochi created
  • 1
  • 2

8.3 创建PVC

编辑 文件,内容如下:

vim   
  • 1
apiVersion: v1
kind: PersistentVolumeClaim
#元数据
metadata:
  name: pvc-data
  namespace: gofile
#描述
spec:
    #访问类型
  accessModes:
    - ReadWriteOnce
  volumeMode: Filesystem   #存储类型 ,块存储Block
 #存储大小
  resources:
    requests:
      storage: 8Gi

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

创建一个pvc

 kubectl apply -f  
  • 1

查看pvc状态

[root@k8s-master gofile]#  kubectl get pvc -n gofile
NAME       STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-data   Bound    pvc-9e58f97b-6797-4cba-87ed-604eed6b27a2   8Gi        RWO            nfs-storage    8s
  • 1
  • 2
  • 3

查看pv状态

 kubectl get pv
  • 1

在这里插入图片描述

5.4 编辑文件

编辑文件,内容如下:

########################## Aplication#####################################################
---
#apiVersion: v1
#kind: Namespace
#metadata:
#  name: gofile
---

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: gofile
  name: gofile
  namespace: gofile
spec:
  replicas: 2
  selector:
    matchLabels:
      app: gofile
  template:
    metadata:
      labels:
         app: gofile
    spec:
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: pvc-data
#      - name: data
#        hostPath:
#         path:  /data/gofile/data/
#      securityContext:
#        runAsUser: 0
#      initContainers:
#      - name: volume-permissions
#        image: busybox:1.28
#        imagePullPolicy:  IfNotPresent
#        command:
#          - sh
#          - -c
#          - chmod -R 777 /data/gofile/data/
#        volumeMounts:
#          - name: data
#            mountPath: /data/gofile/data/

      containers:
      - image:  -/jeson/go-file:latest
        name: my-gofile
        ports:
        - name:  web
          protocol: "TCP"
          containerPort: 3000

        env:
        - name: TZ
          value: "Asia/Shanghai"
#        - name:  DATA_DIR
#          value: "/data"
#        - name: USERNAME
#          value: admin
#        - name: PASSWORD
#          value: admin




#        resources:
#         requests:
#             cpu: 0.1
#             memory: 0.1G
#         limits:
#             cpu: 1
#             memory:  0.5G
        volumeMounts:
        - name: data
          mountPath: /data
          readOnly: false
#        - name: config
#          mountPath: /etc/

---
apiVersion: v1
kind: Service
metadata:
  name: my-gofile
  namespace: gofile
spec:
  ports:
      - name: web
        protocol: TCP
        targetPort: 3000
        port: 3000
        nodePort: 30050

  selector:
      app: gofile
  type: NodePort
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98

5.5 部署项目

[root@k8s-master gofile]# kubectl apply -f 
/gofile created
service/my-gofile created
  • 1
  • 2
  • 3

5.6 查看pod状态

查看pod状态

[root@k8s-master gofile]# kubectl get pods -n gofile
NAME                      READY   STATUS    RESTARTS   AGE
gofile-74f89f9885-mb8ds   1/1     Running   0          76s
gofile-74f89f9885-scx8s   1/1     Running   0          76s
  • 1
  • 2
  • 3
  • 4

查看service状态

[root@k8s-master gofile]#  kubectl get service -n  gofile
NAME        TYPE       CLUSTER-IP    EXTERNAL-IP   PORT(S)          AGE
my-gofile   NodePort   10.97.33.76   <none>        3000:30050/TCP   89s
  • 1
  • 2
  • 3

六、访问项目

6.1 访问go-file初始页

访问地址:http://192.168.3.202:30050/,将IP替换为工作节点IP地址。

在这里插入图片描述

6.2 登录go-file

用户名为 admin,密码为 123456

在这里插入图片描述
在这里插入图片描述

6.3 系统管理

点击系统管理,分别有系统状况、账户管理、文件管理、系统设置四个选项。

在这里插入图片描述

6.4 上传文档

点击首页菜单栏的文件模块,点击“上传”,将本地文档上传到go-file。

在这里插入图片描述
在这里插入图片描述

6.5 上传图片

点击图床选项,将图片复制到图床中。

在这里插入图片描述

6.6 浏览上传图片

将图床中图片链接复制到浏览器中,可以正常打开。

在这里插入图片描述

6.7 上传视频文件

点击右上角的“上传”选项,上传视频文件。

在这里插入图片描述

点击菜单栏的视频模块,选择视频文件进行播放。

在这里插入图片描述

6.8 浏览文件

在首页上传的文档文件可以在线浏览

在这里插入图片描述
在这里插入图片描述

6.9 分享文件

点击首页上传文件的的复制图标,将复制的分享文件链接粘贴到其余浏览器即可访问。

在这里插入图片描述
在这里插入图片描述

七、总结

总体而言,go-file文件分享工具在使用上非常不错。它可以方便地分享文件、图片、视频等各种类型的文件,并且打开速度非常快。使用Docker可以快速将该工具部署到服务器中,界面简洁,操作也很简单,即使是新手也可以立即上手使用。