Kubernetes-存储卷Volume
作者: 金华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相关推荐
- kubernetes存储系统介绍(Volume、PV、dynamic provisioning,阿里云服务器nfs创建pv,hostpath创建pv)
全栈工程师开发手册 (作者:栾鹏) 架构系列文章 K8S存储系统 K8S的存储系统从基础到高级又大致分为三个层次:普通Volume,Persistent Volume 和动态存储供应(dynamic ...
- Kubernetes存储之volume
容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题,首先,当容器崩溃时,kubelet会重启它,但是容器的文件将丢失-容器以干净的状态(镜像最初的状态)重新启动,其次,在 ...
- 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. ...
- Kubernetes存储卷的使用
在Kubernetes中, 有这不同方式的内容挂载, 简单记录一下他们的配置方式. ConfigMap 配置内容 内容配置 apiVersion: v1 kind: ConfigMap metadat ...
- docker mysql volum_Docker 存储卷 Volume 删除和孤单 volume 清理
1 在删除容器时删除 volume 可以使用 docker rm -v 命令在删除容器时删除该容器的卷. [root@along ~]# docker run --name web2 -v /data ...
- Docker存储卷(Volume)
简介 想要了解Docker Volume,首先我们需要知道Docker的文件系统是如何工作的.Docker镜像是由多个文件系统(只读层)叠加而成.当我们启动一个容器的时候,Docker会加载只读镜像层 ...
- Kubernetes(K8s)基本概念:Volume(存储卷)、Persistent Volume
Kubernetes(K8s)基本概念:Volume(存储卷) 一.Volume(存储卷) Volume是Pod中能够被多个容器访问的共享目录. K8s中的Volume定义在Pod上,然后被一个Pod ...
- 课时 21:Kubernetes 存储架构及插件使用(阚俊宝)
本文将主要分享以下三方面的内容: Kubernetes 存储体系架构: Flexvolume 介绍及使用: CSI 介绍及使用. Kubernetes 存储体系架构 引例: 在 Kubernetes ...
- 从零开始入门 K8s | Kubernetes 存储架构及插件使用
作者 | 阚俊宝 阿里巴巴高级技术专家 本文整理自<CNCF x Alibaba 云原生技术公开课>第 21 讲. 关注"阿里巴巴云原生"公众号,回复关键词**&quo ...
- @kubernetes(k8s)数据持久化Volume存储卷(emptyDir、hostPath、NFS、StorageClass)
文章目录 kubernetes(k8s)数据持久化Volume 一.数据持久化 1.Vlolume概述 2.数据卷的分类 3.常用的四种数据卷 4.Pod使用Volume步骤: 5. volume基本 ...
最新文章
- Python第四章-字典
- 解决activiti中由模板转换的流程图连线名称缺失问题
- 80端口被system(pid=4)占用的解决方法
- eclipse(或者myeclipse)常用配置方法
- 北大出版社继续送书 | 附上周4位中奖的朋友信息
- jQuery find() 方法的使用总结
- POJ 1191 棋盘分割(区间DP)题解
- 使用Go构建区块链 第3部分:持久化和cli
- Collection与Arrays
- 操作系统课程设计之页面置换算法(流程模拟)
- Ubuntu20.04下安装nvidia驱动
- Epicor客制化 - RowRule使用示例
- jQuery便利多个相同的class,点击显示隐藏图标,显示及隐藏其下的内容
- 互联网快讯:猿辅导凭优质教学获好评;粉笔科技积极布局打造双核驱动;科创板上市公司突破400家
- Java程序员秋招面经大合集(BAT美团网易小米华为中兴等)
- location指令
- 深入理解JVM(一)
- 年度Java技术盘点,懂这些技术的程序员2019年薪资翻倍!
- 对于大量工控软件,IFIX 组态王等的深层解密分析,曲线
- 软件系统六大设计原则
热门文章
- 用c 语言写出五子棋的代码,C语言案例:控制台版本的五子棋游戏【代码】
- 数据库的字段属性(重点)
- python的turtle模块(海龟画图)
- python 无法调用turtle_新人求助,关于python 调用turtle《python简单turtle教程》
- matlab 创建批量文件夹_学会这12个批量操作,从此告别加班!
- 「非推广」为什么我说本是设计师专属的『数位板』,也是程序猿+科研狗的开会神器?
- hyperledger部署java_Hyperledger Fabric(超级账本) Java 开发区块链 部署运行智能合约
- antd的table遍历之后添加合计行_付费?是不可能的!20行Python代码实现一款永久免费PDF编辑工具...
- oracle机票,全球机票分销系统
- flex 发送到java_(转)java与flex通信