一. 前言

卷不是独立的k8s对象,它是pod的一部分,和pod同生命周期(共享),不能单独创建和销毁,即跟随pod启动时创建,删除时销毁。当重启容器时,卷可以保持不变,新的容器可以识别上一个容器写入卷的所有文件,这样就可以卡点继续工作。所有容器使用卷的前提是将卷挂载在每个需要访问它的容器中,当然,这个操作可以在容器文件系统的任意位置挂载。不过,容器可以装载也可以选择不装载卷。

二. 卷的分类

1. emptyDir卷

当 Pod 指定到某个节点上时,首先创建的是一个 emptyDir 卷,并且只要 Pod 在该节点上运行,卷就一直存在。 就像它的名称表示的那样,卷最初是空的。 尽管Pod 中的容器挂载 emptyDir 卷的路径可能相同也可能不同,但是这些容器都可以读写 emptyDir 卷中相同的文件。 当 Pod 因为某些原因被从节点上删除时,emptyDir 卷中的数据也会永久删除 ---- emptyDir卷同pod的生命周期,pod生,emptyDir卷生,pod亡,emptyDir卷亡。

2. hostPath卷

1)hostPath卷指向节点文件系统上的特定文件或目录,某些系统级别的pod可以通过挂载hostPath卷去读取节点的文件或使用节点文件系统对节点进行访问。在同一个节点上运行并在其hostPath卷中使用相同路径的pod可以看到相同的文件。hostPath卷属于持久性存储,删除pod后,卷里面的文件继续保持,不丢失,新的pod如果使用了指向主机相同路径的hostPath卷,则新的pod就能够发现旧pod留下的文件和数据(前提,新pod能够被调度到和旧pod相同的节点)---- hostPath卷同host的生命周期,pod的生存与死亡同hostPath没有关系。
2)基于这种前提,因为卷的内容存储在特定节点的文件系统,所以pod被重新调度到其他节点时,就无法访问到原数据,hostPath卷, 不适合作为存储数据库数据的目录。hostPath卷通常用于尝试单节点集群中的持久化存储,仅当需要在节点上读取或写入系统文件时才会使用hostPath,不用做持久化跨pod的数据。
在这里插入图片描述

3. 持久卷PV/持久卷声明PVC

1)持久卷: pv,persistentVolume,不属于任何命名空间,和节点一样属于集群层面的资源,管理员通过k8s API Server创建pv时,需要告知k8s:容量需求、访问模式(RWO/ROX/RWX)、处理ov逻辑(pvc绑定删除后的逻辑)、存储类型、存储位置等属性。
2)持久卷声明: pvc,persistentVolumeClaim,pvc可以当做pod中的一个卷来使用,其他用户不能使用相同的持久卷pv,但可以通过删除pvc绑定来释放出pv。虽然pv不在特定的命名空间下创建,但pvc只能在特定的命名空间下创建,所以pvc和pv只能被同一个命名空间内的pod创建使用。

三. 搭建NFS

1)master上创建数据目录:/data/k8s/

 mkdir -p /data/k8s/

2)master上安装配置 nfs

 yum -y install nfs-utils rpcbind

3)master上设置权限共享目录

chmod 777 /data/k8s/

4)master上配置 nfs,nfs 的默认配置

vi /etc/exports
添加:
/data/k8s  *(rw,sync,no_root_squash)

5)使配置生效

exportfs -a

6)master上启用 rpc 注册

systemctl start rpcbind.service
systemctl enable rpcbind
systemctl status rpcbind

执行结果:
在这里插入图片描述

7)master上启用nfs服务

systemctl start nfs.service
systemctl enable nfs
systemctl status nfs

执行结果:
在这里插入图片描述

8)master上确定rpc 和 nfs 已经关联

rpcinfo -p|grep nfs

执行结果:
在这里插入图片描述

9)查看挂在情况

showmount -e

在这里插入图片描述

四. 创建PV

1)创建nf-pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: nfs
  nfs:
    path: /data/k8s
    server: 192.168.214.132
  1. 执行
kubectl apply -f nf-pv.yaml

执行结果:
在这里插入图片描述
说明:
a. Capacity(存储能力):一个 PV 对象都要指定一个存储能力,通过 PV 的 capacity属性来设置,目前只支持存储空间的设置
b. AccessModes(访问模式):ReadWriteOnce(RWO)-- 读写权限,但是只能被单个节点挂载 ReadOnlyMany(ROX)–
只读权限,可以被多个节点挂载 ReadWriteMany(RWX)-- 读写权限,可以被多个节点挂载。
c. persistentVolumeReclaimPolicy(回收策略): PV 支持的策略有三种: Retain(保留),Recycle(回收),Delete(删除)。
目前只有 NFS 和 HostPath 两种类型支持回收策略。当然一般来说还是设置为 Retain
d. 状态: Available(可用) Bound(已绑定)Released(已释放)Failed(失败)
e. storageClassName 指定 PV 的 class 为 nfs。相当于为 PV 设置了一个分类,PVC 可以指定 class 申请相应 class 的 PV

五. 创建PVC

1) 创建nf-pvc.yaml

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

2) 执行

kubectl apply -f nf-pvc.yaml
kubectl get pv
kubectl get pvc

在这里插入图片描述

六. 使用pvc

1) 创建nfs-pvc-deploy.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-pvc
spec:
  selector:
    matchLabels:
      app: nfs-pvc
  replicas: 1
  template:
    metadata:
      labels:
        app: nfs-pvc
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.8
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
      volumes:
      - name: www
        persistentVolumeClaim:
          claimName: pvc-nfs   #使用pvc

---

apiVersion: v1
kind: Service
metadata:
  name: nfs-pvc
  labels:
    app: nfs-pvc
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: web
    nodePort: 31179
  selector:
    app: nfs-pvc

2)页面访问

在这里插入图片描述
ps: 因为关联的nfs内容没有,所以直接403

3) 在nfs目录中添加index.html文件

在这里插入图片描述

4)访问页面

在这里插入图片描述
如果这时删除了PV和PVC,共享目录中的文件也同时被删除了,这跟设置的回收版本有关系,回收策略是 Recycle,PVC 给删除掉了,然后回收了数据。上次说的PV和PVC的各种策略一定要注意。不然一不小心就把数据搞丢了

参考:https://www.cnblogs.com/benjamin77/p/9944268.html

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐