NFS服务器安装

1.NFS服务器端安装NFS 服务器端安装NFS服务器。 sudo apt update sudo apt install nfs-kernel-server -y # 对于 Debian/Ubuntu 系列 # 或 sudo yum install nfs-utils -y #

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
Comment