k8s的卷是pod的一个组成部分,和pod共享相同的生命周期,pod的新老容器都可以识别/使用卷的内容
卷用于实现容器间的数据共享
在这里插入图片描述

卷类型

  • emptyDir—用于存储临时数据的简单空目录,可以指定存储介质为内存
piVersion: v1
kind: Pod
metadata:
    name: fortune
spec:
  containers:
 - image: xxx
    name: xxx
    volumeMounts:
    - name: xxxx
      mountPath: /data/db
volumes:
 - name: xx
  emptyDir: {}
  • hostPath

  • 用于将目录从工作节点的文件系统挂载到pod中
    节点目录用于挂载(适用于系统级别的pod,通常是DaemonSet管理),不适用于持久化存储,也不能跨节点使用

  • gitRepo
    gitRepo—通过检查git仓库的内容来初始化卷(实质也是一个emptyDir,只不过预置了git仓库内容)
    每次pod重新创建时,会自动拉取最新代码
    在这里插入图片描述

  • nfs—挂载到pod的NFS共享卷

    • cinder、cephfs、iscsi、flocker、glusterfs、quobyte、rbd、flexVolume、vsphere-Volume、photonPersistentDisk、scaleIO—用于挂载其他类型的网络存储
  • persistentVolumClaim—一种使用预置或动态配置的持久存储类型

  • configMap、secret、downwardAPI—用于将k8s部分资源和集群信息公开给pod的特殊类型卷

持久化卷

需要满足以下两点:
①数据需要写到硬盘上
②不同节点间需要能共享数据

  • gcePersistentDisk(谷歌高性能存储磁盘卷)、awsElasticBlockStore(Amazon服务弹性块存储卷)、azureDisk(微软Azure磁盘卷)—用于挂载云服务提供的特定存储类型
    举例:创建一个MongoDB容器,该容器的数据必须持久化保存在磁盘上
gcloud container clusters list #查看集群所在区域
gcloud computer disks create --size=1GiB --zone=xxxx mongodb #创建1G的持久磁盘

创建一个使用GCE永久磁盘的pod

apiVersion: v1
kind: Pod
metadata:
    name: mongodb
spec:
  volumes: 
 - name: mongodb-data
    gcePersistentDisk:
      pdName: mongodb
      fsType: ext4
  containers:
 - image: mondb
    name: mongodb
    volumeMounts:
    - name: mongodb-data
      mountPath: /data/db
    ports:
    - containerPort: 27017
      protocol: TCP

在这里插入图片描述
持久卷和持久卷声明(PVC)
主要目的:从底层存储技术上解耦pod,无须向pod里添加卷,而是由集群管理员设置底层存储,然后通过k8s API服务器创建持久卷并注册,在创建持久卷时可以指定卷的大小和支持的访问模式。
在这里插入图片描述

  • 1、创建持久卷
apiVersion: v1
kind: PersistentVolume
metadata:
    name: mongodb-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
  - ReadWriteOnce #仅允许单个节点挂载读写
  - ReadOnlyMany #允许多个节点挂载只读
  - ReadWriteMany #允许多个节点挂载读写
  persistentVolumeReclaimPolicy: Retain #声明释放掉后,卷被保留,不删除
  gcePersistenDisk:
    pdNmae: mongodb
    fsType: ext4

注意最后那部分,与在pod中引用GCE持久磁盘完全相同
使用kubectl create创建后,可以看到持久卷了。
注意,持久卷不属于任何命名空间,它与节点一样,是集群层面的东西

kubectl get pv

在这里插入图片描述

  • 2、创建持久卷声明(用于获取持久卷)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
    name: mongodb-pvc
spec:
  resources:
    requests:
      storage: 1Gi
  accessModes:
  - ReadWriteOnce 
  storageClassName: "" #该参数,后面会提到,不希望置备程序干预(使其获得动态配置的持久卷)

当创建好持久卷声明后,k8s会自动找合适的持久卷并将其绑定到持久卷声明,持久卷的容量必须足够大且满足声明的需求大小,并且卷的访问访问须包含声明中指定的访问模式

kubectl get pvc #查看持久卷声明
  • 3、在pod中使用持久卷声明
apiVersion: v1
kind: Pod
metadata:
    name: mongodb
spec:
  containers:
 - image: mongo
    name: mongodb
    volumeMounts:
    - name: mongodb-data
      mountPath: /data/db
    ports:
    - containerPort: 27017
      protocol: TCP
  volumes:
 - name: mongodb-data
    persistentVolumeClaim:#在pod卷中通过名称引用持久卷声明
      claimName: mongodb-pvc
  • 4、卷的回收
    两种回收模式,通过设置persistentVolumeReclaimPolicy参数
    ①Recycle
    删除卷的内容,并使卷可以被再次声明,这种方式可以使得持久卷被不同的持久卷声明和pod反复使用
    ②Delete
    删除底层存储
    ③Retain
    持久卷声明释放后,扔保留卷和卷的数据
    在这里插入图片描述

持久卷的动态卷配置

主要目的:持久卷和持久卷声明可以获得持久化的存储资源,但需要一个集群管理员来支持实际的存储。进一步的,k8s支持动态配置存储卷来自动执行此任务

与管理预先准备持久卷不同,仅需要定义一个或多个StorageClass,并允许系统在每次通过持久卷声明请求时创建一个新的持久卷

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
    name: fast
provisioner: kubernetes.io/gce-pd #指定配置插件
parameters:
  type: pd-ssd
  zone: europe-west1-b

StorageClass资源指定持久卷声明请求此StorageClass时,应该使用哪种置备程序来提高持久卷,StorageClass将定义的参数传递给置备程序,并具体到每个提供者插件。
创建StorageClass后,此时用户可以在持久卷声明中安名字引用存储类

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
    name: mongodb-pvc
spec:
  StorageClassNmae: fast
  resources:
    requests:
      storage: 300Mi
  accessModes:
  - ReadWriteOnce 

注意:动态配置的持久卷的回收策略是Delete,也即当持久卷声明被删除时,持久卷也被删除

在这里插入图片描述

Logo

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

更多推荐