云计算、AI、云原生、大数据等一站式技术学习平台

网站首页 > 教程文章 正文

k8s 安装使用nfs 当做存储卷,永久存储数据

jxf315 2025-07-28 17:36:27 教程文章 4 ℃

一、安装NFS服务:

1.1 服务器端

yum install -y nfs-utils rpcbind
sudo mkdir -p /data/nfs  # 创建共享目录
sudo chmod 755 /data/nfs
sudo chown nfsnobody:nfsnobody /data/nfs  # 设置权限
sudo vim /etc/exports
/data/nfs 192.168.1.0/24(rw,sync,no_root_squash,no_all_squash)

参数说明:

rw:读写权限。

sync:数据同步写入磁盘。

no_root_squash:允许 root 用户访问。

192.168.1.0/24:允许访问的客户端 IP 段。

systemctl enable --now rpcbind nfs-server
exportfs -ra  # 重新加载配置
showmount -e  # 显示共享目录

1.2 nfs客户端

dnf install -y nfs-utils
mount 192.168.1.100:/data/nfs /mnt  # 服务器IP:共享路径 本地挂载点
编辑/etc/fstab 添加
192.168.1.100:/data/nfs /mnt nfs defaults 0 0
systemctl daemon-reload
mount -a  # 挂载所有 fstab 中配置的文件系统

二、创建 NFS StorageClass

步骤 1:部署 NFS Client Provisioner

helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
helm install nfs-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
  --set nfs.server=192.168.1.100 \
  --set nfs.path=/data/nfs

步骤 2:创建 StorageClass

# sc-nfs.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-storage
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner
parameters:
  pathPattern: "${.PVC.namespace}/${.PVC.name}"
  onDelete: retain  # 保留数据

kubectl apply -f sc-nfs.yaml

创建完成

三、创建nginx应用

3.1、声明pvc

# cat nginx-pvc.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nginx-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: nfs-client

kubectl apply -f nginx-pvc.yaml

会发现NFS服务器会自动创建一个文件夹

3.2 创建nginx应用关联使用nginx-pvc

# cat nginx-pvc.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nginx-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: nfs-client
[root@master lap]# cat nginx-deploy.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
        volumeMounts:
        - name: nginx-data
          mountPath: /usr/share/nginx/html  # 将PVC挂载到Nginx的网页文件目录
      volumes:
      - name: nginx-data
        persistentVolumeClaim:
          claimName: nginx-pvc  # 关联之前创建的PVC

kubectl apply -f nginx-deploy.yaml

测试:

由上述可以知道 nginx容器内的 /usr/share/nginx/html 是挂载到nignx-pvc的

进入容器:

kubectl exec -it nginx-deployment-65f9b944d4-th6fz -- bash
cd   /usr/share/nginx/html  
touch 111.txt  //创建文件等,可以到nfs 服务器查看目录是否有对应文件。

Tags:

最近发表
标签列表