knowledge-base

我的知识库 / Kubernetes / 使用 nfs 持久化存储

使用 nfs 持久化存储

一般云平台都会提供云存储服务,如 AWS EBS 服务,K8s 可以直接使用云存储服务创建 PV 和 PVC 作为 Volume 的存储后端。假设你没有使用到云存储,那么 NFS 可能会适合你。

NFS(Network File System),网络文件系统,允许计算机之间共享存储资源,这里也就不具体介绍了。

部署 nfs

以下命令需要root权限,示例中机器IP为192.168.115.137

  1. 安装 nfs
# Ubuntu & Debian
apt install nfs-kernel-server -y
# CentOS
yum install nfs-util -y
  1. 创建共享目录
mkdir /nfs/data -p
  1. 修改 nfs 的默认配置,在文末添加配置
vim /etc/exports
/nfs/data  *(rw,sync,no_root_squash)

其中:

  1. 重启 rpc,nfs 需要向 rpc 注册
systemctl restart rpcbind.service
systemctl enable rpcbind.service
  1. 重启 nfs 服务
systemctl restart nfs-kernel-server.service
systemctl enable nfs-kernel-server.service
  1. 挂载共享,在 fstab 文件中添加配置
vim /etc/fstab
192.168.115.137:/nfs/data /nfs/data               nfs    rw,tcp,soft  0  0

创建 PV

PersistentVolume 作为 K8s 的存储资源,我们需要为它定义 apacity(存储能力),accessModes(访问模式)persistentVolumeReclaimPolicy(回收策略),存储媒介等信息。

下面定义了一个 pv 资源,文件名为 pv1.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv1
spec:
  capacity:
    storage: 1Gi
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    path: /nfs/data
    server: 192.168.115.137

需要对 AccessModes 和 PersistentVolumeReclaimPolicy 做简单的枚举介绍:

AccessModes 访问模式

设置对 PV 存储资源的访问权限:

PersistentVolumeReclaimPolicy 回收策略

当挂载实例被删除时,设置对 PV 存储资源的回收策略:

现在创建 pv:

kubectl apply -f pv1.yaml

查看 pv,可以看到当前 pv1 的 STATUS 为 Available:

kubectl get pv
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pv1    1Gi        RWO            Recycle          Available                                   48s

这里也需要对 PV 的状态作下简单介绍:

Status

PV 的生命周期包含了四个阶段:

创建 PVC

下面定义了一个 pvc 资源,文件名为 pvc1.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc1
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi  

现在创建 pvc

kubectl apply -f pvc1.yaml

查看 PVC,可以看到 pvc1 已经处于 Bound 的状态,说明它已经绑定上了一个 PV,而我们目前只创建了一个名为 pv1 的 PV

NAME   STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc1   Bound    pv1      1Gi        RWO                           3s

再次查看 PV,看看是不是被 pvc1 绑定了。

NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM          STORAGECLASS   REASON   AGE
pv1    1Gi        RWO            Recycle          Bound    default/pvc1                           2m

确实如我们所想,pv1 被 pvc1 绑定,并且 pv1 的状态也更新成了 Bound。其实这是集群自动为我们的 PVC 寻找到的符合条件的 PV:

当然,我们也可以通过标签选择器为 PVC 指定绑定的 PV。

定义 PV:

...
kind: PersistentVolume
metadata:
  labels:
    app: pv1
....

定义 PVC:

...
kind: PersistentVolumeClaim
spec:
  selector:
    matchLabels:
      app: pv1
...      

Volume 使用 PVC

...
      volumes:
      - name: www
        persistentVolumeClaim:
          claimName: pvc1
...          

« Kubernetes 0-1 K8s自建LoadBalancer

» Kubernetes 0-1 了解 Pod