作者: 金华01

原文:https://blog.csdn.net/u014042372/article/details/80582287

1、存储卷概述

由于容器本身是非持久化的,因此需要解决在容器中运行应用程序遇到的一些问题。首先,当容器崩溃时,kubelet将重新启动容器,但是写入容器的文件将会丢失,容器将会以镜像的初始状态重新开始;第二,在通过一个Pod中一起运行的容器,通常需要共享容器之间一些文件。Kubernetes通过存储卷解决上述的两个问题。

在Docker有存储卷的概念卷,但Docker中存储卷只是磁盘的或另一个容器中的目录,并没有对其生命周期进行管理。Kubernetes的存储卷有自己的生命周期,它的生命周期与使用的它Pod生命周期一致。因此,相比于在Pod中运行的容器来说,存储卷的存在时间会比的其中的任何容器都长,并且在容器重新启动时会保留数据。当然,当Pod停止存在时,存储卷也将不再存在。在Kubernetes支持多种类型的卷,而Pod可以同时使用各种类型和任意数量的存储卷。在Pod中通过指定下面的字段来使用存储卷:

  • spec.volumes:通过此字段提供指定的存储卷
  • spec.containers.volumeMounts:通过此字段将存储卷挂接到容器中

2、存储卷类型和示例

当前Kubernetes支持如下所列这些存储卷类型,并以hostPath、nfs和persistentVolumeClaim类型的存储卷为例,介绍如何定义存储卷,以及如何在Pod中被使用。

  • awsElasticBlockStore
  • azureDisk
  • azureFile
  • cephfs
  • configMap
  • csi
  • downwardAPI
  • emptyDir
  • fc (fibre channel)
  • flocker
  • gcePersistentDisk
  • gitRepo
  • glusterfs
  • hostPath
  • iscsi
  • local
  • nfs
  • persistentVolumeClaim
  • projected
  • portworxVolume
  • quobyte
  • rbd
  • scaleIO
  • secret
  • storageos
  • vsphereVolume

2.1 hostPath

hostPath类型的存储卷用于将宿主机的文件系统的文件或目录挂接到Pod中,除了需要指定path字段之外,在使用hostPath类型的存储卷时,也可以设置type,type支持的枚举值由下表。另外在使用hostPath时,需要注意下面的事项:

  • 具有相同配置的Pod(例如:从同一个podTemplate创建的),可能会由于Node的文件不同,而行为不同。
  • 在宿主机上创建的文件或目录,只有root用户具写入的权限。您要么在容器中以root身份运行进程,要么在主机上修改的文件或目录的权限,以便具备写入内容到hostPath的存储卷中。
行为
  空字符串(默认)是用于向后兼容,这意味着在挂接主机路径存储卷之前不执行任何检查。
DirectoryOrCreate 如果path指定目录不存在,则会在宿主机上创建一个新的目录,并设置目录权限为0755,此目录与kubelet拥有一样的组和拥有者。
Directory path指定的目标必需存在
FileOrCreate 如果path指定的文件不存在,则会在宿主机上创建一个空的文件,设置权限为0644,此文件与kubelet拥有一样的组和拥有者。
File path指定的文件必需存在
Socket path指定的UNIX socket必需存在
CharDevice path指定的字符设备必需存在
BlockDevice 在path给定路径上必须存在块设备。

下面是使用hostPath作为存储卷的YAML文件,此YAML文件定义了一个名称为test-pd的Pod资源。它通过hostPath类型的存储卷,将Pod宿主机上的/data挂接到容器中的/teset-pd目录。

apiVersion: v1
kind: Pod
metadata:name: test-pd
spec:containers:- image: k8s.gcr.io/test-webservername: test-container# 指定在容器中挂接路径volumeMounts:- mountPath: /test-pdname: test-volume# 指定所提供的存储卷volumes:- name: test-volumehostPath:# 宿主机上的目录path: /data# this field is optionaltype: Directory

2.2 NFS

在Kubernetes中,可以通过nfs类型的存储卷将现有的NFS(网络文件系统)到的挂接到Pod中。在移除Pod时,NFS存储卷中的内容被不会被删除,只是将存储卷卸载而已。这意味着在NFS存储卷总可以预先填充数据,并且可以在Pod之间共享数据。NFS可以被同时挂接到多个Pod中,并能同时进行写入。需要注意的是:在使用nfs存储卷之前,必须已正确部署和运行NFS服务器,并已经设置了共享目录。

下面是一个redis部署的YAML配置文件,redis在容器中的持久化数据保存在/data目录下;存储卷使用nfs,nfs的服务地址为:192.168.8.150,存储路径为:/k8s-nfs/redis/data。容器通过volumeMounts.name的值确定所使用的存储卷。

apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:name: redis
spec:selector:matchLabels:app: redisrevisionHistoryLimit: 2template:metadata:labels:app: redisspec:containers:# 应用的镜像- image: redisname: redisimagePullPolicy: IfNotPresent# 应用的内部端口ports:- containerPort: 6379name: redis6379env:- name: ALLOW_EMPTY_PASSWORDvalue: "yes"- name: REDIS_PASSWORDvalue: "redis"   # 持久化挂接位置,在docker中 volumeMounts:- name: redis-persistent-storagemountPath: /datavolumes:# 宿主机上的目录- name: redis-persistent-storagenfs:path: /k8s-nfs/redis/dataserver: 192.168.8.150

2.3 persistentVolumeClaim

persistentVolumeClaim类型存储卷将PersistentVolume挂接到Pod中作为存储卷。使用此类型的存储卷,用户并不知道存储卷的详细信息。

此处定义名为busybox-deployment的部署YAML配置文件,使用的镜像为busybox。基于busybox镜像的容器需要对/mnt目录下的数据进行持久化,在YAML文件指定使用名称为nfs的PersistenVolumeClaim对容器的数据进行持久化。

# This mounts the nfs volume claim into /mnt and continuously
# overwrites /mnt/index.html with the time and hostname of the pod.
apiVersion: v1
kind: Deployment
metadata:  name: busybox-deployment
spec:  replicas: 2  selector:    name: busybox-deploymenttemplate:    metadata:      labels:        name: busybox-deployment    spec:      containers:      - image: busybox        command:          - sh          - -c          - 'while true; do date > /mnt/index.html; hostname >> /mnt/index.html; sleep $(($RANDOM % 5 + 5)); done'        imagePullPolicy: IfNotPresent        name: busybox        volumeMounts:          # name must match the volume name below          - name: nfs            mountPath: "/mnt"     volumes:      - name: nfs        persistentVolumeClaim:          claimName: nfs-pvc

Kubernetes-存储卷Volume相关推荐

  1. kubernetes存储系统介绍(Volume、PV、dynamic provisioning,阿里云服务器nfs创建pv,hostpath创建pv)

    全栈工程师开发手册 (作者:栾鹏) 架构系列文章 K8S存储系统 K8S的存储系统从基础到高级又大致分为三个层次:普通Volume,Persistent Volume 和动态存储供应(dynamic ...

  2. Kubernetes存储之volume

    容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题,首先,当容器崩溃时,kubelet会重启它,但是容器的文件将丢失-容器以干净的状态(镜像最初的状态)重新启动,其次,在 ...

  3. Docker存储卷volume(V18.X)

    文章目录 1. 简介 1.1 介绍 1.2 作用 1.3 分类 2. 存储卷使用 2.1 设置卷的命令 2.1.1 -v或`--volume`选项指定卷 2.1.2 `--mount`指定卷 2.1. ...

  4. Kubernetes存储卷的使用

    在Kubernetes中, 有这不同方式的内容挂载, 简单记录一下他们的配置方式. ConfigMap 配置内容 内容配置 apiVersion: v1 kind: ConfigMap metadat ...

  5. docker mysql volum_Docker 存储卷 Volume 删除和孤单 volume 清理

    1 在删除容器时删除 volume 可以使用 docker rm -v 命令在删除容器时删除该容器的卷. [root@along ~]# docker run --name web2 -v /data ...

  6. Docker存储卷(Volume)

    简介 想要了解Docker Volume,首先我们需要知道Docker的文件系统是如何工作的.Docker镜像是由多个文件系统(只读层)叠加而成.当我们启动一个容器的时候,Docker会加载只读镜像层 ...

  7. Kubernetes(K8s)基本概念:Volume(存储卷)、Persistent Volume

    Kubernetes(K8s)基本概念:Volume(存储卷) 一.Volume(存储卷) Volume是Pod中能够被多个容器访问的共享目录. K8s中的Volume定义在Pod上,然后被一个Pod ...

  8. 课时 21:Kubernetes 存储架构及插件使用(阚俊宝)

    本文将主要分享以下三方面的内容: Kubernetes 存储体系架构: Flexvolume 介绍及使用: CSI 介绍及使用. Kubernetes 存储体系架构 引例: 在 Kubernetes ...

  9. 从零开始入门 K8s | Kubernetes 存储架构及插件使用

    作者 | 阚俊宝 阿里巴巴高级技术专家 本文整理自<CNCF x Alibaba 云原生技术公开课>第 21 讲. 关注"阿里巴巴云原生"公众号,回复关键词**&quo ...

  10. @kubernetes(k8s)数据持久化Volume存储卷(emptyDir、hostPath、NFS、StorageClass)

    文章目录 kubernetes(k8s)数据持久化Volume 一.数据持久化 1.Vlolume概述 2.数据卷的分类 3.常用的四种数据卷 4.Pod使用Volume步骤: 5. volume基本 ...

最新文章

  1. Python第四章-字典
  2. 解决activiti中由模板转换的流程图连线名称缺失问题
  3. 80端口被system(pid=4)占用的解决方法
  4. eclipse(或者myeclipse)常用配置方法
  5. 北大出版社继续送书 | 附上周4位中奖的朋友信息
  6. jQuery find() 方法的使用总结
  7. POJ 1191 棋盘分割(区间DP)题解
  8. 使用Go构建区块链 第3部分:持久化和cli
  9. Collection与Arrays
  10. 操作系统课程设计之页面置换算法(流程模拟)
  11. Ubuntu20.04下安装nvidia驱动
  12. Epicor客制化 - RowRule使用示例
  13. jQuery便利多个相同的class,点击显示隐藏图标,显示及隐藏其下的内容
  14. 互联网快讯:猿辅导凭优质教学获好评;粉笔科技积极布局打造双核驱动;科创板上市公司突破400家
  15. Java程序员秋招面经大合集(BAT美团网易小米华为中兴等)
  16. location指令
  17. 深入理解JVM(一)
  18. 年度Java技术盘点,懂这些技术的程序员2019年薪资翻倍!
  19. 对于大量工控软件,IFIX 组态王等的深层解密分析,曲线
  20. 软件系统六大设计原则

热门文章

  1. 用c 语言写出五子棋的代码,C语言案例:控制台版本的五子棋游戏【代码】
  2. 数据库的字段属性(重点)
  3. python的turtle模块(海龟画图)
  4. python 无法调用turtle_新人求助,关于python 调用turtle《python简单turtle教程》
  5. matlab 创建批量文件夹_学会这12个批量操作,从此告别加班!
  6. 「非推广」为什么我说本是设计师专属的『数位板』,也是程序猿+科研狗的开会神器?
  7. hyperledger部署java_Hyperledger Fabric(超级账本) Java 开发区块链 部署运行智能合约
  8. antd的table遍历之后添加合计行_付费?是不可能的!20行Python代码实现一款永久免费PDF编辑工具...
  9. oracle机票,全球机票分销系统
  10. flex 发送到java_(转)java与flex通信