Kubernetes 中配置基于NFS的持久卷

建议将Pod的数据放入某个持久卷中,以便即使Pod终止后也可以使用这些数据。在Kubernetes(k8s)中,可以在Pod中使用基于NFS的持久卷。在本文中,我们将学习如配置持久卷和持久卷声明,然后我们将讨论如何通过k8s pod中的声明名称使用持久卷。

我假设我们有一个功能正常的k8s集群和NFS Server。以下是设置的详细信息: 

  • NFS服务器IP = 192.168.179.102

  • NFS共享目录 = /opt/k8s-pods/data

  • K8s群集 = 一个主节点和两个工作节点

注意: 确保可以从worker节点访问NFS服务器,并尝试在每个worker节点上安装nfs共享以进行测试。 

 

 NFS环境准备


NFS   192.168.179.102  提供共享目录

#在nfs共享中创建一个index.html文件,因为我们将在本文后面的nginx pod中挂载该共享。
[root@localhost ~]# yum -y install nfs-utils
[root@localhost ~]# mkdir -p /opt/k8s-pods/data/
[root@localhost ~]# echo "Hello, NFS Storage NGINX" > /opt/k8s-pods/data/index.html
[root@localhost ~]# vim /etc/exports
[root@localhost ~]# cat /etc/exports
/opt/k8s-pods/data  192.168.0.0/16(rw,no_root_squash)
[root@localhost ~]# exportfs -avr
exporting 192.168.0.0/16:/opt/k8s-pods/data

 Master Node 安装驱动设备

[root@k8s-master ~]# mount -t nfs 192.168.179.102:/opt/k8s-pods/data /mnt
mount: wrong fs type, bad option, bad superblock on 192.168.179.102:/opt/k8s-pods/data,
       missing codepage or helper program, or other error
       (for several filesystems (e.g. nfs, cifs) you might
       need a /sbin/mount.<type> helper program)

#可以看到不支持,要安装驱动存储设备,所有节点都需要安装 master node
[root@k8s-master ~]# yum install nfs-utils -y 
[root@k8s-master ~]# mount -t nfs 192.168.179.102:/opt/k8s-pods/data /mnt
[root@k8s-master ~]# cd /mnt/
[root@k8s-master mnt]# ls
index.html
[root@k8s-master mnt]# cat index.html 
Hello, NFS Storage NGINX

[root@k8s-master ~]# umount /mnt

 

配置持久卷声明


要在Pod内挂载持久卷,我们必须指定其持久卷声明。因此,让我们使用以下YAML文件创建持久卷声明:

[root@k8s-master mnt]# cat nfs-pv.yml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 2Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: nfs
  mountOptions:
    - hard
    - nfsvers=4.1
  nfs:
    path: /opt/k8s-pods/data
    server: 192.168.179.102

① capacity 指定 PV 的容量为 2G。 

② accessModes 指定访问模式为 ReadWriteOnce,支持的访问模式有:
ReadWriteOnce – PV 能以 read-write 模式 mount 到单个节点。
ReadOnlyMany – PV 能以 read-only 模式 mount 到多个节点。
ReadWriteMany – PV 能以 read-write 模式 mount 到多个节点。

③ PersistentVolumes 可以有多种回收策略,包括 “Retain”、”Recycle” 和 “Delete”。对于动态配置的 PersistentVolumes 来说,默认回收策略为 “Delete”。这表示当用户删除对应的 PersistentVolumeClaim 时,动态配置的 volume 将被自动删除。如果 volume 包含重要数据时,这种自动行为可能是不合适的。那种情况下,更适合使用 “Retain” 策略。使用 “Retain” 时,如果用户删除 PersistentVolumeClaim,对应的 PersistentVolume 不会被删除。相反,它将变为 Released 状态,表示所有的数据可以被手动恢复。

  • Retain – 需要管理员手工回收。
  • Recycle – 清除 PV 中的数据,效果相当于执行 rm -rf /thevolume/*
  • Delete – 删除 Storage Provider 上的对应存储资源,例如 AWS EBS、GCE PD、Azure Disk、OpenStack Cinder Volume 等。

④ storageClassName 指定 PV 的 class 为 nfs。相当于为 PV 设置了一个分类,PVC 可以指定 class 申请相应 class 的 PV。 

 ⑤ 指定 PV 在 NFS 服务器上对应的目录。

[root@k8s-master mnt]# kubectl apply -f nfs-pv.yml 
[root@k8s-master mnt]# kubectl get pv
NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                       STORAGECLASS   REASON   AGE
nfs-pv   2Gi        RWX            Recycle          Available                               nfs                     2m44s

 以上输出确认PV已成功创建并且可用。STATUS 为 Available,表示 nfs-pv就绪,可以被 PVC 申请。

 

配置持久卷声明


接下来创建 PVC,要在Pod内挂载持久卷,我们必须指定其持久卷声明。因此,让我们使用以下YAML文件创建持久卷声明:

[root@k8s-master mnt]# cat nfs-pvc.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  storageClassName: nfs
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 2Gi

 PVC 就很简单了,只需要指定 PV 的容量,访问模式和 class。

[root@k8s-master mnt]# kubectl apply -f nfs-pvc.yaml 
persistentvolumeclaim/nfs-pvc created

#执行完上述操作后,控制平面将使用相同的存储类名称查找满足声明要求的持久卷,然后将声明绑定到持久卷,示例如下所示:
[root@k8s-master mnt]# kubectl get pvc
NAME      STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
nfs-pvc   Bound    nfs-pv   2Gi        RWX            nfs            3m37s
[root@k8s-master mnt]# kubectl get pv
NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS        CLAIM                       STORAGECLASS   REASON   AGE
nfs-pv   2Gi        RWX            Recycle          Bound         default/nfs-pvc             nfs                     15m

以上输出确认声明(nfs-pvc)与持久卷(nfs-pv)绑定。现在我们准备在pod中使用基于nfs的持久卷。

 

在Pod中使用基于NFS的持久卷


在yaml文件下面创建一个nginx pod,它将在/usr/share/nginx/html上挂载持久卷声明。

[root@k8s-master mnt]# cat  nfs-pv-pod.yml 
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pv-pod
spec:
  volumes:
  - name: nginx-pv-storage
    persistentVolumeClaim:
      claimName: nfs-pvc
  containers:
  - name: nginx
    image: nginx
    ports:
    - name: http
      containerPort: 80
    volumeMounts:
    - name: nginx-pv-storage
      mountPath: /usr/share/nginx/html

与使用普通 Volume 的格式类似,在 volumes 中通过 persistentVolumeClaim 指定使用 nfs-pvc 申请的 Volume。 

注意:要获取有关pod的更多详细信息,可使用 kubectl describe pod <pod-name>命令。

以上命令输出确认已成功创建容器。现在尝试使用curl命令访问nginx页面:

[root@k8s-master mnt]# kubectl get pod -o wide | awk 'NR==1 || $1=="nginx-pv-pod"'
NAME                            READY   STATUS    RESTARTS   AGE     IP            NODE         NOMINATED NODE   READINESS GATES
nginx-pv-pod                    1/1     Running   0          5m42s   10.244.0.22   k8s-master   <none>           <none>
[root@k8s-master mnt]# curl 10.244.0.22
Hello, NFS Storage NGINX

完美,上面curl命令的输出确认了持久卷已正确挂载到pod中,因为我们可以获取NFS共享上index.html文件的内容。如果不再需要使用 PV,可用删除 PVC 回收 PV。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值