K8S学习笔记|08- Volume数据挂载

Kubernetes

Posted by Claire on September 4, 2023

Volume 存储卷

通过挂载存储卷,可以将应用的数据持久化和共享,在本机测试中,我们通常会将数据挂载到宿主机的目录来保存应用的数据

存储卷的类型有:

  • EmptyDir
    • 最基础的Volume类型,就是Host上的一个空目录
    • 和Pod的生命周期一致,Pod在他就在,Pod如果删除了目录数据就没有了
    • 是Host上创建的临时目录,可以当变得为Pod中容器提供共享存储,但是生命周期跟随Pod
  • HostPath
    • 是将Docker Host文件系统中已经存在的一个目录,如果需要访问Docker内部的资源配置可以使用。
    • Pod销毁 hostPath还是能够保留,但是Docker Host如果异常退出了,hostPath将无法访问
  • 外部StorageProvider
    • k8s主流的分布式存储有:Ceph\GlusterFS,主要解决存储单点故障问题,在正式的生产中必须要考虑这一点
    • Ceph的配置有:
spec:
  volumes:
    - name: ceph-test
    cephfs:
      path: /somepathinsideceph
      monitor: "ip:port"
      secretfile: "/etc/admin.secret"
    containers:
      - image: busybox
      name: busytest
      volumnMountes:  
        name: ceph-test
        mountPath: /testdemo

将Ceph的目录/somepathinsideceph 挂载到容器的/testdemo下 由于这个是外部存储,所以不受Pod Docker和K8S的影响,保障数据的持久性,分布式能够进一步保障数据的安全性

PV & PVC

数据可以持久化之后,出现了对数据的划分和管控的问题:是否一个人管所有的数据,所有容器细节都需要知晓?是否所有的数据都开给各自管辖,如何控制各个容器对资源的申请与使用?

因此诞生了PV和PVC的概念,将对持久卷PersistentVolume的管理和申请Claim分离,产生了PersistentVolume和

PersistentVolumeClaim

有了PVC,用户只需要说明需要什么样的存储资源,而不需要知道真实数据挂载在什么目录上 管理员会将目录划分好,提供到应用侧进行使用

此外还有的文件方案有:nfs\aws ebs

NFS适合在开发与测试环境使用,以低廉的成本来实现共享存储卷

  • 搭建一个nfs服务器
  • 创建一个nfsdata共享目录
  • 创建指定目录、资源、策略
apiVersion: v1
kind: PersisentVolume
metadata:
  name: mypv1
spec: 
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: nfs
  nfs:
    path: /nfsdata
    sever: 127.0.0.1  
kubectl apply -f pv.yaml
kubectl get pv
kubectl get pvc

创建Pod并确认Bound挂载上后,通过手动创建文件或目录进行验证

kubectl exec podname touch /insidedatapath/newdir 通过 ls /nfsdata/newdir 确认是否挂载操作正确

通过YAML文件或者名称直接删除 kubectl delete pvc pvcname

回收策略persistentVolumeReclaimPolicy:

  • Recycle: 数据会被清除
  • Retain: 保留
  • Delete: 删除

PV的分配有两种模式:静态供给(Static Provision)和动态供给(Dynamical Provision):

  • 静态供给:手动创建PV,通过PVC申请PV在Pod中使用
  • 动态供给:即如果没有满足需求的PV,就动态创建PV,不需要提前创建PV,减少管理员的工作量

动态供给是通过StorageClass实现的 StorageClass standard

kind: StorageClass
apiVersion: stoage.k8s.io/v1
metadata:
  name: standard
provisioner:  kubernetes.io/aws-ebs
parameters:
  type: gp2
reclaimPolicy: Retain

StorageClass slow

kind: StorageClass
apiVersion: stoage.k8s.io/v1
metadata:
  name: slow
provisioner:  kubernetes.io/aws-ebs
parameters:
  type: io1
  zones: s-east-1d,us-east-1c
  iopsPerGB: "10"

StorageClass支持Delete和Retain两种reclaimPolicy,默认是Delete