Kubernetes之Volume

容器和Pod是短暂的,会被频繁的销毁和创建。容器销毁时,保存在容器内部的文件系统的数据都会被清除。为了持久化保存容器的数据,这就要引入kubernetes volume

Kubernetes Volume

Volume的声明周期独立于容器,Pod中的容器可能被销毁和重建,但Volume被保留。本质上k8s Volume 是一个目录,当Volume被挂载到pod,pod中所有的容器都可以访问这个Volume,k8s volume支持多种backend类型,包括emptyDir、hostPath、GCE Persistent Disk、AWS Elastic Block Store、NFS、Ceph 等。

emptyDir Volume

  • 是host上的一个空目录。
  • 对于容器来说是持久的,对于pod则不是,pod从节点删除时,Volume的内容也会被删除。如果只是删除容器,Volume不受影响
    指定方法
    spec:
    containers:
    - image: busybox
    name: xxx
    volumeMounts:
    - mountPath: /producer_dir
     name: shared-volume
    volumes: //定义一个emptyDir类型的Volume
    -  name: shared-volume
    emptyDir:{}

    特点:

    1. 方便的为Pod中的容器提供共享存储
    2. 不具备持久性,Pod销毁,emptyDir随之灰飞烟灭,因为本质是host的一个空目录
    3. 适合场景:Pod中容器需要临时共享存储空间的场景。

hostPath

将Docker host 文件系统中已经存在的目录mount给Pod的容器。大部分场景不用此类型,这增加了Pod与节点的耦合,限制了Pod的使用。适合需要访问k8s或Docker内部数据的应用则需要使用hostPath。比如kube-apiserver、kube-controller-manager。
查看方式 kubectl edit --namespace=kube-system pod kube-apiserver-k8s-master 可以看到kube-apiserver Pod的配置

volumeMounts:
- mountPath: /etc/kubernetes
 name: k8s
 volumes:
 - hostPath:
      path: /etc/kubernetes

如果Pod被销毁了,hostPath对应的目录还是会被保留,Host崩溃的话,hostPath也就无法访问了

外部 Storage Provider

部署在AWS,GCE、Azure等公有云上

apiVersion: v1
kind: Pod
metadata:
  name: using-ebs
spec:
  containers:
  - image: busybox
   name: using-ebs
   volumeMounts:
   - mountPath: /test-ebs
    name: ebs-volume
 volumes:
 - name: ebs-volume
  awsElasticBlockStore:
    volumeID:<volume-id> //需要再AWS中创建,然后引用
    fsType: ext4
    ---
    ceph类型
     volumeMounts:
   - mountPath: /test-ceph
    name: ceph-volume
    volumes:
      - name: ceph-volume
       cephfs:
         path:/foo/bar/cephfs //目录会被mount到容器路径test-ceph
         monitors:"10.16.154.78:7689"
         secretFile: "/etc/ceph/admin/secret"

特点:

  1. 不依赖于k8s,底层由独立的存储系统管理
  2. 与k8s集群分离,数据被持久化后,整个k8s都炸了也不会受损

PersistentVolume 和 PersistentVolumeClaim

PersistentVolume(PV) 是外部存储系统中的一块存储空间,由管理员创建和维护。与Volume一样,PV具有持久性,生命周期独立于Pod。

PersistentVolumeClaim(PVC)是对PV的申请(claim),由普通用户创建和维护。需要为Pod分配存储资源时,用户可以创建一个PVC,知名存储资源的容量大小和访问模式等信息,k8s会查找并提供满足条件的PV

k8s支持多种PV,AWS EBS、Ceph、NFS等。

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mypv1
spec:
  capacity:
    storage: 1Gi //指定大小
  accessModes:
    - ReadWriteOnce // 以read-write模式mount到单个节点,ReadOnlyMany表示PV能以read-only mount到多个节点,ReadWriteMany表示PV能以read-write mount到多个节点
  persistentVolumeReclaimPolicy: Recycle //清除pv数据 retain 表示需要管理员手工回收;Delete 表示删除 Storage Provider上的对应存储资源 如AWS EBS,GCE PD
  storageClassName: nfs // 指定PV的class 为nfs
  nfs:
    path: /nfsdata/v1 //指定PV在NFS服务器上对应的目录
    server: 192.168.56.105

创建完PV之后就可以被PVC申请了

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

使用 kubectl get pvc 命令就能看到mypvc1 已经 Bound到mypv1.接下来就能在Pod中使用了。

Volumes:
  - name: mydata
   persistentVolumeClaim:
     claimName: mypvc1

回收PV

kubectl delete pvc mypvc1

清除之后就能被其他的PVC申请了,按照之前所述里面建立的文件也会被销毁。如果想保留,回收策略改成Retain。

先创建PV,然后通过PVC申请PV并在Pod中使用,这种方式叫 Static Provision 静态供给。

没有满足PVC条件的PV,会动态创建PV,这叫动态供给(Dynamic Provision),通过StorageClass实现。

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

这样就能使用了

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

总结:
1 介绍了k8s支持的几种volume(卷)的类型
2 内部和外部的使用配置方法
3 介绍了PV和PVC的概念和用法。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注