关于nfs:k8s中使用nfs共享存储

42次阅读

共计 5770 个字符,预计需要花费 15 分钟才能阅读完成。

长久卷应用(nfs 存储数据)

Kubernetes 为了使应用程序及其开发人员可能失常申请存储资源,防止解决存储设施细节,引入了 PV 和 PVC。创立 PV 有两种形式:

  • 集群管理员通过手动形式 动态创立 利用所须要的 PV;
  • 用户手动创立 PVC 并由 Provisioner 组件 动态创建 对应的 PV。

搭建 nfs 服务器(ip:192.168.0.29)

找一台服务器搭建 nfs 服务端, 我以 centos7 为例

装置 nfs
yum -y install nfs-utils

#创立 nfs 目录
mkdir -p /nfs/data/

#批改权限
chmod -R 777 /nfs/data

#编辑 export 文件
vim /etc/exports
/nfs/data *(rw,no_root_squash,sync)(“*“代表所有人都能连贯,倡议换成具体 ip 或 ip 段,如 192.168.20.0/24)#配置失效
exportfs -r
#查看失效
exportfs

#启动 rpcbind、nfs 服务
systemctl restart rpcbind && systemctl enable rpcbind
systemctl restart nfs && systemctl enable nfs

#查看 RPC 服务的注册情况
rpcinfo -p localhost

#showmount 测试
showmount -e 192.168.92.56

#所有 node 节点装置 nfs 客户端
yum -y install nfs-utils
systemctl start nfs && systemctl enable nfs

1. 动态创立 PV 卷

增加 pv 卷对应目录, 这里创立 2 个 pv 卷,则增加 2 个 pv 卷的目录作为挂载点。

#nfs 服务器操作
#创立 pv 卷对应的目录
mkdir -p /nfs/data/pv001
mkdir -p /nfs/data/pv002

#配置 exportrs
vim /etc/exports
/nfs/data *(rw,no_root_squash,sync)
/nfs/data/pv001 *(rw,no_root_squash,sync)
/nfs/data/pv002 *(rw,no_root_squash,sync)

#配置失效
exportfs -r
#重启 rpcbind、nfs 服务
systemctl restart rpcbind && systemctl restart nfs

第一步:集群管理员创立 NFS PV,NFS 属于 K8s 原生反对的 in-tree 存储类型。yaml 文件如下:

# cat nfs-pv1.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv001
  labels:
    pv: nfs-pv001
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: nfs
  nfs:
    path: /nfs/data/pv001
    server: 192.168.0.29

# cat nfs-pv2.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv002
  labels:
    pv: nfs-pv002
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: nfs
  nfs:
    path: /nfs/data/pv002
    server: 192.168.0.29

配置阐明

配置阐明:① capacity 指定 PV 的容量为 1G。② accessModes 指定拜访模式为 ReadWriteOnce,反对的拜访模式有:ReadWriteOnce – PV 能以 read-write 模式 mount 到单个节点。ReadOnlyMany – PV 能以 read-only 模式 mount 到多个节点。ReadWriteMany – PV 能以 read-write 模式 mount 到多个节点。③ persistentVolumeReclaimPolicy 指定当 PV 的回收策略为 Recycle,反对的策略有: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@vm192-168-0-79 ~]# kubectl apply -f pv1.yaml
persistentvolume/nfs-pv001 created

[root@vm192-168-0-79 ~]# kubectl apply -f pv2.yaml
persistentvolume/nfs-pv002 created

[root@vm192-168-0-79 ~]# kubectl get pv
NAME        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
nfs-pv001   1Gi        RWO            Recycle          Available           nfs                     10m
nfs-pv002   1Gi        RWO            Recycle          Available           nfs                     3m2s

# STATUS 为 Available,示意 pv 就绪,能够被 PVC 申请。

第二步:用户创立 PVC,yaml 文件如下:

接下来创立一个名为 pvc001,pvc002 的 pvc

# cat nfs-pvc1.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc001
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: nfs
  selector:
    matchLabels:
      pv: nfs-pv001

# cat nfs-pvc2.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc002
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: nfs
  selector:
    matchLabels:
      pv: nfs-pv002
[root@vm192-168-0-79 ~]# kubectl apply -f pvc1.yaml
persistentvolumeclaim/nfs-pvc001 created

[root@vm192-168-0-79 ~]# kubectl apply -f pvc2.yaml
persistentvolumeclaim/nfs-pvc002 created

[root@vm192-168-0-79 ~]# kubectl get pv
NAME        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                STORAGECLASS   REASON   AGE
nfs-pv001   1Gi        RWO            Recycle          Bound    default/nfs-pvc001   nfs                     12m
nfs-pv002   1Gi        RWO            Recycle          Bound    default/nfs-pvc002   nfs                     5m

[root@vm192-168-0-79 ~]# kubectl get pvc
NAME         STATUS   VOLUME      CAPACITY   ACCESS MODES   STORAGECLASS   AGE
nfs-pvc001   Bound    nfs-pv001   1Gi        RWO            nfs            15s
nfs-pvc002   Bound    nfs-pv002   1Gi        RWO            nfs            15s

从 kubectl get pvc 和 kubectl get pv 的输入能够看到 pvc001 和 pvc002 别离绑定到 pv001 和 pv002,申请胜利。留神 pvc 绑定到对应 pv 通过 labels 标签形式实现,也能够不指定,将随机绑定到 pv。

第三步:用户创立利用,并应用第二步创立的 PVC。

# cat pod1.yaml
kind: Pod
apiVersion: v1
metadata:
  name: nfs-pod001
spec:
  containers:
    - name: myfrontend
      image: nginx:latest
      volumeMounts:
      - mountPath: "/var/www/html"
        name: nfs-pv001
  volumes:
    - name: nfs-pv001
      persistentVolumeClaim:
        claimName: nfs-pvc001

# cat pod2.yaml
kind: Pod
apiVersion: v1
metadata:
  name: nfs-pod002
spec:
  containers:
    - name: myfrontend
      image: nginx:latest
      volumeMounts:
      - mountPath: "/var/www/html"
        name: nfs-pv002
  volumes:
    - name: nfs-pv002
      persistentVolumeClaim:
        claimName: nfs-pvc002

与应用一般 Volume 的格局相似,在 volumes 中通过 persistentVolumeClaim 指定应用 nfs-pvc001 和 nfs-pvc002 申请的 Volume。

[root@vm192-168-0-79 ~]# kubectl apply -f pod1.yaml
pod/nfs-pod001 created

[root@vm192-168-0-79 ~]# kubectl apply -f pod2.yaml
pod/nfs-pod002 created

[root@vm192-168-0-79 ~]# kubectl get po
NAME         READY   STATUS    RESTARTS   AGE
nfs-pod001   1/1     Running   0          62s
nfs-pod002   1/1     Running   0          7s

[root@vm192-168-0-79 ~]# kubectl exec nfs-pod001 touch /var/www/html/index001.html
[root@vm192-168-0-79 ~]# kubectl exec nfs-pod002 touch /var/www/html/index002.html

# 在 nfs 服务器验证
[root@vm192-168-0-29 pv001]# ls /nfs/data/pv001
index001.html
[root@vm192-168-0-29 pv001]# ls /nfs/data/pv002
index002.html

进入 pod 查看挂载状况

[root@vm192-168-0-79 ~]#  kubectl exec -ti nfs-pod001 /bin/bash
root@nfs-pod001:/# df -h
...
192.168.0.29:/nfs/data/pv001  197G  2.8G  186G   2% /var/www/html
...

删除 pv

删除 pod,pv 和 pvc 不会被删除,nfs 存储的数据不会被删除。

[root@vm192-168-0-79 ~]# kubectl delete -f pod1.yaml
pod "nfs-pod001" deleted

[root@vm192-168-0-79 ~]# kubectl get pv
NAME        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                STORAGECLASS   REASON   AGE
nfs-pv001   1Gi        RWO            Recycle          Bound    default/nfs-pvc001   nfs                     38m
nfs-pv002   1Gi        RWO            Recycle          Bound    default/nfs-pvc002   nfs                     31m
[root@vm192-168-0-79 ~]# kubectl get pvc
NAME         STATUS   VOLUME      CAPACITY   ACCESS MODES   STORAGECLASS   AGE
nfs-pvc001   Bound    nfs-pv001   1Gi        RWO            nfs            26m
nfs-pvc002   Bound    nfs-pv002   1Gi        RWO            nfs            26m

# nfs 服务器查看
[root@vm192-168-0-29 pv001]# ls /nfs/data/pv001
index001.html

持续删除 pvc,pv 将被开释,处于 Available 可用状态,并且 nfs 存储中的数据被删除。

[root@vm192-168-0-79 ~]# kubectl delete -f pvc1.yaml
persistentvolumeclaim "nfs-pvc001" deleted

[root@vm192-168-0-79 ~]# kubectl get pv
NAME        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                STORAGECLASS   REASON   AGE
nfs-pv001   1Gi        RWO            Recycle          Available                        nfs                     40m
nfs-pv002   1Gi        RWO            Recycle          Bound       default/nfs-pvc002   nfs                     32m

# nfs 服务器查看
[root@vm192-168-0-29 pv001]# ls /nfs/data/pv001
[root@vm192-168-0-29 pv001]#

持续删除 pv

[root@vm192-168-0-79 ~]# kubectl delete -f pv1.yaml
persistentvolume "nfs-pv001" deleted

动态创建 pv

我的项目地址:https://github.com/kubernetes-incubator/external-storage/tree/master/nfs-client

正文完
 0