1.NFS服务器端安装NFS
服务器端安装NFS服务器。
sudo apt update
sudo apt install nfs-kernel-server -y # 对于 Debian/Ubuntu 系列
# 或
sudo yum install nfs-utils -y # 对于 CentOS/RHEL 系列
服务器端创建共享目录
sudo mkdir -p /nfssharedata
sudo chown nobody:nogroup /nfssharedata # 对于 Ubuntu/Debian
# 或
sudo chown nfsnobody:nfsnobody /nfssharedata # 对于 CentOS/RHEL
编辑/etc/exports
文件,添加共享配置信息
sudo vim /etc/exports
例如如下的配置,配置了允许3个IP可以进行访问,其中:rw 表示读写权限,sync 表示将数据同步写入磁盘,no_subtree_check 用于提高性能。
/nfssharedata ${ip1}(rw,sync,no_root_squash,no_subtree_check)
/nfssharedata ${ip2}(rw,sync,no_root_squash,no_subtree_check)
/nfssharedata ${ip3}(rw,sync,no_root_squash,no_subtree_check)
注意:需要配置no_root_squash
,并且保证没有all_squash
选项。
应用NFS服务器暴露的文件夹的配置。
sudo exportfs -ra # 应用配置
启动NFS服务器。
sudo systemctl start nfs-kernel-server # 对于 Ubuntu/Debian
# 或
sudo systemctl start nfs-server # 对于 CentOS/RHEL
设置NFS服务器开机自启动。
sudo systemctl enable nfs-kernel-server # Ubuntu/Debian
# 或
sudo systemctl enable nfs-server # CentOS/RHEL
安装RpcBind。
# 安装 rpcbind
sudo apt update
sudo apt install rpcbind -y # Ubuntu/Debian
sudo yum install rpcbind -y # CentOS/RHEL
# 启动 rpcbind 服务
sudo systemctl start rpcbind
sudo systemctl enable rpcbind
需要注意的是:nfs-server会在2049端口启动,rpcbind会在111端口启动,注意在防火墙当中放行这两个端口。
2.NFS客户端安装NFS
安装NFS客户端。
sudo apt install nfs-common -y # Ubuntu/Debian
# 或
sudo yum install nfs-utils -y # CentOS/RHEL
安装RpcBind。
# 安装 rpcbind
sudo apt update
sudo apt install rpcbind -y # Ubuntu/Debian
sudo yum install rpcbind -y # CentOS/RHEL
# 启动 rpcbind 服务
sudo systemctl start rpcbind
sudo systemctl enable rpcbind
在NFS客户端挂载NFS服务器文件夹。
sudo mkdir -p /nfssharedata
sudo mount <NFS服务器IP地址>:/nfssharedata /nfssharedata
取消挂载NFS服务器文件夹。
sudo umount /nfssharedata
3.通过K8S挂载NFS
3.1 创建PV
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv
spec:
capacity:
storage: 5Gi # 根据需要调整存储大小
accessModes:
- ReadWriteMany # NFS 通常使用 ReadWriteMany 访问模式
nfs:
path: /nfssharedata # NFS 服务器上共享的目录路径
server: ...... # NFS 服务器的 IP 地址
3.2 创建PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-pvc
namespace: wanna-project
spec:
accessModes:
- ReadWriteMany # 确保与 PV 的访问模式匹配
resources:
requests:
storage: 5Gi # 请求的存储大小
3.3 在Pod控制器当中声明PVC并挂载到Pod
kind: Deployment
apiVersion: apps/v1
metadata:
name: halo-dep
namespace: wanna-project
creationTimestamp: '2024-10-30T20:22:00Z'
labels:
app: halo-dep
annotations:
deployment.kubernetes.io/revision: '60'
kubesphere.io/alias-name: halo-dep
kubesphere.io/creator: admin
kubesphere.io/description: halo-dep
spec:
replicas: 3
selector:
matchLabels:
app: halo-dep
template:
metadata:
creationTimestamp: null
labels:
app: halo-dep
annotations:
kubesphere.io/creator: admin
kubesphere.io/imagepullsecrets: '{"halo-dep-riiqgv":"wanna-project-harbor"}'
kubesphere.io/restartedAt: '2024-11-01T19:47:02.315Z'
logging.kubesphere.io/logsidecar-config: '{}'
spec:
volumes:
- name: host-time
hostPath:
path: /etc/localtime
type: ''
- name: volume-nfs
persistentVolumeClaim:
claimName: nfs-pvc
containers:
- name: halo-dep-riiqgv
image: 'wanna1314y.top:1443/library/halo:latest'
ports:
- name: tcp-8090
containerPort: 8090
protocol: TCP
env:
- name: HALO_WORK_DIR
value: /halo/nfssharedata/.halo2
resources: {}
volumeMounts:
- name: host-time
readOnly: true
mountPath: /etc/localtime
- name: volume-nfs
mountPath: /halo/nfssharedata
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
imagePullPolicy: IfNotPresent
restartPolicy: Always
terminationGracePeriodSeconds: 30
dnsPolicy: ClusterFirst
serviceAccountName: default
serviceAccount: default
securityContext: {}
imagePullSecrets:
- name: wanna-project-harbor
schedulerName: default-scheduler
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 25%
maxSurge: 25%
revisionHistoryLimit: 10
progressDeadlineSeconds: 600
需要在spec.template.volumes
当中定义需要声明的卷,name
指定卷的名称,persistentVolumeClaim.claimName
指定需要挂载的持久卷声明PVC,PVC在之前已经介绍过。
- name: volume-nfs
persistentVolumeClaim:
claimName: nfs-pvc
接着需要在容器配置spec.template.containers.volumeMounts
下定义需要挂载的卷以及挂载路径,通过name
指定上面声明的卷名称(volume-nfs
),通过mountPath
指定需要挂在到容器的哪个位置,比如我配置/halo/nfssharedata
代表将卷挂载到/halo/nfssharedata
路径下。
volumeMounts:
- name: volume-nfs
mountPath: /halo/nfssharedata