一、临时存储

  当pod的存储方案设定为emptydir的时候,pod启动时就会在pod所在节点的磁盘空间开辟出一块空卷,pod启动后容器产生的数据会存放到那个空卷中,供pod内的容器读取和写入数据,一旦pod容器消失,节点上开辟出的这个临时空间就会随着pod销毁。

二、半持久化存储

hostpath类型则是映射node文件系统中的文件或者目录到pod里。因为在k8s中pod会漂移,当pod漂移到其他node节点的时候,pod不会跨节点的去读取目录。所以说是一种半持久化的存储方式

三、持久化存储

PV是集群中的一块存储,是集群资源,是持久化存储,对存储资源进行抽象。和普通的 Volume 一样,也是使用卷插件来实现的,只是它们拥有独立于任何使用 PV 的 Pod 的生命周期。

PVC是用户对存储的请求。概念上与 Pod 类似。 Pod 会耗用节点资源,而 PVC 申领会耗用 PV 资源。Pod 可以请求特定数量的资源(CPU 和内存);同样 PVC 可以请求特定的大小和访问模式。

PV、PVC生命周期
Provisioning ——-> Binding ——–>Using——>Releasing——>Recycling

PV和PVC是最常见的使用存储的方式。

k8s PV 是什么?

PersistentVolume(PV)是群集中的一块存储,由管理员配置或使用存储类动态配置。 它是集群中的资源,就像 pod 是 k8s 集群资源一样。 PV 是容量插件,如 Volumes,其生命周期独立于使用 PV 的任何单个 pod。

k8s PVC 是什么?

PersistentVolumeClaim(PVC)是一个持久化存储卷,我们在创建 pod 时可以定义这个类型的存储卷。 它类似于一个 pod。 Pod 消耗节点资源,PVC 消耗 PV 资源。 Pod 可以请求特定级别的资源(CPU 和内存)。 pvc 在申请 pv 的时候也可以请求特定的大小和访问模式(例如,可以一次读写或多次只读)。

创建一个使用PV和PVC的Pod
  • 配置nfs服务:
[root@k8s-master ~]# yum install nfs-utils rpcbind –y
[root@k8s-master ~]# mkdir /pv-pvc
[root@k8s-master ~]# vi /etc/exports
[root@k8s-master ~]# cat /etc/exports
/pv-pvc *(rw,sync,no_root_squash)
/cloud-demo *(rw,sync,no_root_squash)

注意,K8s集群的各个节点都需要安装nfs-utils: yum install nfs-utils,要不然会导致wrong fs type, bad option, bad superblock异常。

/etc/exports文件参数:

/cloud-demo:共享目录
  *:所有主机能访问
  rw:读写权限
  ro:只读
  sync:同步
  no_root_squash:不降低root的权限
  • nfs服务自检

    exportfs -arv

    如果配置有问题,则会有提示报错信息,根据提示解决问题即可:

    [root@k8s-master StorageClass]# exportfs -arv
    exporting *:/data/volumes
    exportfs: Failed to stat /data/volumes: No such file or directory
    exporting *:/cloud-demo
    exporting *:/pv-pvc

    正常提示:

    [root@k8s-master volumes]# exportfs -arv
    exporting *:/data/volumes
    exporting *:/cloud-demo
    exporting *:/pv-pvc
  • 重启nfs服务:

    [root@k8s-master ~]# systemctl restart rpcbind
    [root@k8s-master ~]# systemctl restart nfs
    [root@k8s-master ~]# systemctl restart nfs-server
  • 查看nfs服务:

    [root@k8s-master ~]# showmount
    Hosts on k8s-master:
    [root@k8s-master ~]# showmount -e
    Export list for k8s-master:
    /cloud-demo *
    /pv-pvc *
  • 开放端口:
    另外,特别注意,开放端口,不然其他主机不能访问

    tcp    111
    udp 111
    tcp 2049
    udp 4046
  • 进入挂载目录创建 pv1 目录

    [root@master ~]# cd /pv-pvc/
    [root@master pv-pvc]# mkdir pv1
    [root@master pv-pvc]# ls
    pv1
  • 创建PV

    [root@master tmp]# vi pv1.yaml
    [root@master tmp]# kubectl apply -f pv1.yaml
    persistentvolume/mypv created
    [root@master tmp]# cat pv1.yaml
    apiVersion: v1
    kind: PersistentVolume #注意类型
    metadata:
    name: mypv #PVC要调用
    spec:
    capacity: #指定PV容量
    storage: 1Gi
    accessModes: #指定访问模式
    - ReadWriteMany
    persistentVolumeReclaimPolicy: Recycle #指定回收策略
    nfs: #配置nfs服务器信息
    path: /cloud-demo/data1
    server: 10.100.57.178

    ————————————————————————————————————————————————

    accessModes
    ReadWriteOnce: 该卷能够以读写模式被加载到一个节点上。
    ReadOnlyMany: 该卷能够以只读模式加载到多个节点上。
    ReadWriteMany: 改卷能够以读写模式加载到多个节点上。
    persistentVolumeReclaimPolicy
    Retain(保留) :不删除,需手动回收
    Recycle(回收):基本擦除,类似rm -rf ,使它可供其他PVC申请。
    Delete(删除) :关联存储将被删除。
  • 查看PV

[root@master tmp]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
mypv 1Gi RWX Recycle Available 22s
  • 创建 PVC
    [root@master tmp]# vi pvc1.yaml
    [root@master tmp]# kubectl apply -f pvc1.yaml
    persistentvolumeclaim/mypvc created
    [root@master tmp]# cat pvc1.yaml
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
    name: mypvc
    spec:
    accessModes:
    - ReadWriteMany
    volumeName: mypv
    resources:
    requests:
    storage: 1Gi
  • 对比查看PV的状态从Avilable变为Bound,pvc的状态也是Bound。
[root@master tmp]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mypvc Bound mypv 1Gi RWX 47s
[root@master tmp]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
mypv 1Gi RWX Recycle Bound default/mypvc 30m
  • 创建Pod,使用该PVC
    [root@master tmp]# vi testpod.yaml
    [root@master tmp]# kubectl apply -f testpod.yaml
    pod/pvc-pod created
    [root@master tmp]# cat testpod.yaml
    apiVersion: v1
    kind: Pod
    metadata:
    name: pvc-pod
    spec:
    containers:
    - name: pvc-pod
    args:
    - /bin/sh
    - -c
    - sleep 30000;
    image: centos
    volumeMounts:
    - mountPath: /pv-pvc
    name: pvc-volume
    volumes:
    - name: pvc-volume
    persistentVolumeClaim:
    claimName: mypvc
  • 另一个使用PVC示例:
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: newshomebg
    namespace: mod
    labels:
    app: newshomebg
    spec:
    replicas: 1
    selector:
    matchLabels:
    app: newshomebg
    template:
    metadata:
    labels:
    app: newshomebg
    spec:
    containers:
    - name: newshomebg
    image: xxx
    ports:
    - containerPort: 8080
    env:
    - name: SPRING_DATASOURCE_USERNAME
    value: 'root'
    volumeMounts:
    - name: nfs-volume #设置的名称,和下面的name要一样的
    mountPath: /home/uploads #需要挂载的目录
    subPath: newshomebg #卷的子目录,也就是在nfs服务目录里生成这个子目录
    volumes:
    - name: nfs-volume #这个卷的名称,和上面的name要一样的
    nfs: #这里是nfs挂载
    server: 192.168.1.2 #nfs服务器的ip或者域名
    path: "/data" #nfs服务配置的挂载目录
    imagePullSecrets:
    - name: xxx