kubernetes资源对象介绍及常用命令(五)-(NFS&PV&PVC)

存储抽象(NFS&PV&PVC)

kubernetes通过NFS网络文件系统,将每个节点的挂载数据进行同步,那么就保证了pod被故障转移等情况,依然能读取到被存储的数据。

安装NFS

所有节点执行

yum install -y nfs-utils

nfs主节点执行

echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports  # 暴露了目录/nfs/data/,`*`表示所有节点都可以访问。
mkdir -p /nfs/data
systemctl enable rpcbind --now
systemctl enable nfs-server --now
# 配置生效
exportfs -r
# 检查验证
[root@k8s-master ~]# exportfs
/nfs/data     	<world>
[root@k8s-master ~]#

从节点执行

# 展示172.31.0.2有哪些目录可以挂载
showmount -e 172.31.0.2  # ip改成自己的主节点ip

mkdir -p /nfs/data
# 将本地目录和远程目录进行挂载
mount -t nfs 172.31.0.2:/nfs/data /nfs/data
# 写入一个测试文件
echo "hello nfs server" > /nfs/data/test.txt

实战测试

  1. 原生方式数据挂载
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-pv-demo
  name: nginx-pv-demo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-pv-demo
  template:
    metadata:
      labels:
        app: nginx-pv-demo
    spec:
      containers:
      - image: nginx
        name: nginx
        volumeMounts:
        - name: html
          mountPath: /usr/share/nginx/html
      volumes:
        - name: html
          nfs:
            server: 172.31.0.2
            path: /nfs/data/nginx-pv
[root@k8s-master ~]# kubectl apply -f nfsdata.yml 
deployment.apps/nginx-pv-demo created
[root@k8s-master ~]#

说明:在部署之前首先在节点中创建目录mkdir -p /nfs/data/nginx-pv。通过上面的方法,就实现了将容器内的/usr/share/nginx/html目录挂载到了nfs文件系统的/nfs/data/nginx-pv目录,后期修改非常方便。

  1. PV&PVC

PV:持久卷(Persistent Volume),将应用需要持久化的数据保存到指定位置。

PVC:持久卷申明(Persistent Volume Claim),申明需要使用的持久卷规格。

  • 创建PV池

静态供应

# nfs主节点执行
[root@k8s-master data]# mkdir -p /nfs/data/01
[root@k8s-master data]# mkdir -p /nfs/data/02
[root@k8s-master data]# mkdir -p /nfs/data/03
[root@k8s-master data]# ls
01  02  03  nginx-pv  test.txt
[root@k8s-master data]# pwd
/nfs/data
[root@k8s-master data]# 
  • 创建PV,pv.yml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv01-10m
spec:
  capacity:
    storage: 10M
  accessModes:
    - ReadWriteMany
  storageClassName: nfs
  nfs:
    path: /nfs/data/01
    server: 172.31.0.2
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv02-1gi
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  storageClassName: nfs
  nfs:
    path: /nfs/data/02
    server: 172.31.0.2
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv03-3gi
spec:
  capacity:
    storage: 3Gi
  accessModes:
    - ReadWriteMany
  storageClassName: nfs
  nfs:
    path: /nfs/data/03
    server: 172.31.0.2

说明:将ip修改为自己nfs的主节点ip。这里将我们上面的3个文件夹创建成为3个PV,并且设定了大小storage。形成一个PV池。注意name不能有大写字母。

[root@k8s-master ~]# kubectl apply -f pv.yml 
persistentvolume/pv01-10m created
persistentvolume/pv02-1gi created
persistentvolume/pv03-3gi created
[root@k8s-master ~]# kubectl get persistentvolume
NAME       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pv01-10m   10M        RWX            Retain           Available           nfs                     45s
pv02-1gi   1Gi        RWX            Retain           Available           nfs                     45s
pv03-3gi   3Gi        RWX            Retain           Available           nfs                     45s
[root@k8s-master ~]# 
  • 创建PVC与PV绑定,pvc.yml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: nginx-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 200Mi
  storageClassName: nfs

创建了pvc,使用的大小为200Mi。这里注意storageClassName需要和pv的保持一致,相当于使用同一个标签才能找得到。

[root@k8s-master ~]# kubectl apply -f pvc.yml 
persistentvolumeclaim/nginx-pvc created
[root@k8s-master ~]# kubectl get pvc,pv
NAME                              STATUS   VOLUME     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/nginx-pvc   Bound    pv02-1gi   1Gi        RWX            nfs            14m

NAME                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM               STORAGECLASS   REASON   AGE
persistentvolume/pv01-10m   10M        RWX            Retain           Available                       nfs                     17m
persistentvolume/pv02-1gi   1Gi        RWX            Retain           Bound       default/nginx-pvc   nfs                     17m
persistentvolume/pv03-3gi   3Gi        RWX            Retain           Available                       nfs                     17m
[root@k8s-master ~]# 

可以发现使用200Mi的PVC,会在PV池中绑定最佳的1Gi大小的pv02-1gi的PV去使用,使资源利用最大化。同时看到pv池中pv02-1gi的PV已经被使用,状态为Bound。

  • 创建Pod绑定PVC,podpvc.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-deploy-pvc
  name: nginx-deploy-pvc
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-deploy-pvc
  template:
    metadata:
      labels:
        app: nginx-deploy-pvc
    spec:
      containers:
      - image: nginx
        name: nginx
        volumeMounts:
        - name: html
          mountPath: /usr/share/nginx/html
      volumes:
        - name: html
          persistentVolumeClaim:
            claimName: nginx-pvc

思路梳理:Pod–>PVC–>PV

[root@k8s-master ~]# kubectl apply -f podpvc.yml 
deployment.apps/nginx-deploy-pvc created
[root@k8s-master ~]# 

这时我们修改文件同样能和pod内进行同步。

小结

上面我们说的PV池是静态供应。就是提前在nfs中创建好了相应的文件目录,并且设定了大小等,供PVC进行绑定使用。还有一种动态供应,提前不需要创建PV,而是根据PVC的要求动态创建PV,这样资源利用更加合理有效。

本文由mdnice多平台发布

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

傻啦猫@_@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值