目录

1.安装nfs

2.配置 StorageClass 配置

3.创建 PV

4.创建PVC

5.挂载 PVC

6.验证挂载


我的配置如下:

hostnameip
master192.168.217.11
node01192.168.217.12
node02192.168.217.13
harbor192.168.217.20

主机名和IP自行配置即可,harbor是放镜像的仓库,如果可以直接拉下来可以不用配置,如果不好拉下来,建议把镜像直接放在仓库里。

前提要求:需要完成k8s集群

1.安装nfs

1.在三台主机都需要安装nfs

dnf install nfs-utils -y

2.在master上配置共享目录

 mkdir -p /data/nfs/{1..3}
 chmod -R 666 /data/nfs
 chown -R nobody /data/nfs

3.配置共享文件

vim /etc/exports
​
/data/nfs *(rw,no_root_squash,no_all_squash,sync)

4.配置nfs开机自启

systemctl enable --now nfs-server

5.目录立即生效

exportfs -a
​
showmount -e 192.168.217.11 #这里写自己的IP,后续的IP都改为自己的
输出内容如下:
/data/nfs *

验证操作:master输入内容,看其他节点是否可以查看到

 echo 1 > /data/nfs/index.html

切换至node01节点

创建一个目录,并进行挂载操作

mkdir /test
​
mount -t nfs 192.168.217.11:/data/nfs /test
#可以通过df -h看是否挂载成功,成功后看后续
cd /test 
ls #可以看见对应的index.html
cat index.html #输出结果是 1
​
#解除挂载
umount /test

2.配置 StorageClass 配置

创建文件nfs-storage-class.yaml ,来动态配置存储卷。通过 PVC 绑定现有的 NFS 存储。

vim nfs-storage-class.yaml 
​
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
    name: nfs-storage-class
provisioner: kubernetes.io/no-provisioner # NFS 不需要动态 provisioner
reclaimPolicy: Retain # 默认值是 Delete
volumeBindingMode: WaitForFirstConsumer # 等待 Pod 使用 PVC 时才绑定 PV,默认使用 Immediate 模式:立即绑定

应用nfs-storage-class.yaml 文件

kubectl apply -f nfs-storage-class.yaml

检查StorageClass状态

[root@master ~]# kubectl get storageclass
NAME                PROVISIONER                    RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
nfs-storage-class   kubernetes.io/no-provisioner   Retain          WaitForFirstConsumer   false                  68m

3.创建 PV

创建一个 nfs-pv.yaml 文件,将它指向 NFS 共享的目录。

vim nfs-pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 10Gi   # 定义 PV 的存储容量
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany   # 允许多个 Pod 同时访问此 PV
  persistentVolumeReclaimPolicy: Retain   # 释放 PVC 后保留 PV 数据
  storageClassName: nfs-storage-class   # 与 StorageClass 名称一致
  nfs:
    path: /data/nfs   # NFS 共享目录的路径
    server: 192.168.217.11 

应用 PV 配置

kubectl apply -f nfs-pv.yaml

检查PV状态

[root@master ~]# kubectl get pv
NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM             STORAGECLASS        VOLUMEATTRIBUTESCLASS   REASON   AGE
nfs-pv   10Gi       RWX            Retain            Available    default/nfs-pvc   nfs-storage-class   <unset>                          12s

4.创建PVC

创建一个 nfs-pvc.yaml 文件,它请求使用 NFS 存储。

vim nfs-pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  accessModes:
    - ReadWriteMany   # 允许多个 Pod 同时访问
  volumeMode: Filesystem
  resources:
    requests:
      storage: 3Gi   # 请求的存储容量,不能大于PV容量
  storageClassName: nfs-storage-class   # 与 StorageClass 名称一致

应用 PVC 配置文件:

kubectl apply -f nfs-pvc.yaml

检查 PVC 的状态:

[root@master ~]#  kubectl get pvc
NAME      STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS        VOLUMEATTRIBUTESCLASS   AGE
nfs-pvc   Pending   nfs-pv   10Gi       RWX            nfs-storage-class   <unset>                 2m

5.挂载 PVC

创建一个名为 nginx-deployment.yaml 的文件,将 PVC 挂载到 Pod 中。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1   # 部署 1 个副本(Pod)
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: hb.reg.com/k8s/nginx:1.27.4 #这里是我的仓库,如果有镜像直接写镜像的路径即可
        volumeMounts:
        - mountPath: /usr/share/nginx/html   # 将 PVC 挂载到此目录
          name: nfs-volume
      volumes:
      - name: nfs-volume
        persistentVolumeClaim:
          claimName: nfs-pvc   # 挂载 PVC

应用 Deployment 配置

kubectl apply -f nginx-deployment.yaml

检查所有PV,PVC,Pod的状态

[root@master ~]# kubectl get pod,pv,pvc
NAME                                    READY   STATUS    RESTARTS      AGE
pod/nginx-deployment-5c98f7bc49-2r7t8   1/1     Running   2 (58m ago)   73m

NAME                      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM             STORAGECLASS        VOLUMEATTRIBUTESCLASS   REASON   AGE
persistentvolume/nfs-pv   10Gi       RWX            Retain           Bound    default/nfs-pvc   nfs-storage-class   <unset>                          76m

NAME                            STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS        VOLUMEATTRIBUTESCLASS   AGE
persistentvolumeclaim/nfs-pvc   Bound    nfs-pv   10Gi       RWX            nfs-storage-class   <unset>                 75m

#可以看到这里的status都变为了Bound,这样显示则代表挂载成功,已经和Pod产生的关联

6.验证挂载

首先,通过 kubectl exec 命令进入 Pod,检查 /usr/share/nginx/html 目录,看看是否已挂载 NFS 存储

[root@master data]# kubectl exec -it nginx-deployment-5c98f7bc49-2r7t8 -- /bin/bash
#-it 后面是我的pod的名称,需要通过kubectl get pod 来获得
root@nginx-deployment-5c98f7bc49-2r7t8:/# cd /usr/share/nginx/html/
root@nginx-deployment-5c98f7bc49-2r7t8:/usr/share/nginx/html# echo "hello nginx" > index.html

接着,去到node01(任意节点,只要安装了nfs)挂载,并验证

[root@node01 ~]# mount -t nfs 192.168.217.11:/data/nfs  /test
[root@node01 ~]# cd /test/
[root@node01 test]# ls
index.html
[root@node01 test]# cat index.html 
hello nginx

可以看到在Pod里面创建的数据已经存储到NFS存储中。

至此,整个持久化存储的环境已经搭建完成。

更多推荐