【云原生之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提供持久化存储能力。在实际部署中,我们可以通过DaemonSet
或 StatefulSet
控制器来确保每个节点上运行的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可以快速将该工具部署到服务器中,界面简洁,操作也很简单,即使是新手也可以立即上手使用。