Volume介绍

Volume存在的意义

容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题,首先,当容器崩溃时,kubelet会重启它,但是容器中的文件将丢失——容器以干净的状态(镜像最初的状态)重新启动。其次,在Pod中运行多个容器时,这些容器之间通常需要共享文件。kubernetes中的Volume抽象就很好的解决了这些问题

背景

kubernetes中的卷有明确的寿命 —— 与封装它的Pod相同。所以,卷的生命比Pod中所有的容器要长,当这个容器重启时数据仍然得以保存。当然,当Pod不再存在,卷也就不复存在。也许,更重要的是kubernetes支持多种类型的卷,Pod可以同时使用任意数量的卷

卷的类型

Kubernetes常用卷类型:

  • 非持久性存储

    • emptyDir
    • hostPath
  • 网络连接性存储
    • SAN:iSCSI
    • NFS:nfs,cfs
  • 分布式存储
    • glusterfs、rbd、cephfs
  • 云端存储
    • EBS、Azure、Disk、阿里云、gieRepo

kubectl explain pod.spec.volumes  #查询k8s支持的所有volume类型

常用卷演示

1、emptyDir

当Pod被分配到节点时,首先创建 emptyDir 卷,并且只要该Pod在该节点运行,改卷就会存在,正如名字所述,它最初是空的,Pod中的容器可以读取和写入 emptyDir 中的文件,尽管该卷可以挂在到每个容器相同或者不同的路径上,当Pod在该节点被删除后,emptyDir 中的数据也将会被永久删除

注意:容器崩溃不会将Pod在此节点移除,所有数据不会丢失

示例:

创建带有 emptyDir 的 Pod

vim emptydir.yaml
...
apiVersion: v1
kind: Pod
metadata:
name: emptydir
namespace: default
spec:
containers:
- name: em-container-1
image: hub.vfancloud.com/test/myapp:v1
imagePullPolicy: IfNotPresent
volumeMounts:
- mountPath: /test1 # 挂载到/test1下
name: em-volume
- name: enecontainer-2
image: mysql:master
imagePullPolicy: IfNotPresent
command: ['/bin/sh','-c','sleep 666666']
volumeMounts:
- mountPath: /test2 # 挂载到/test2下
name: em-volume
volumes:
- name: em-volume
emptyDir: {}
...
kubectl create -f emptydir.yaml ## 进入容器内,是空目录
[root@Centos8 volume]# kubectl exec -it emptydir -c em-container-1 -- /bin/sh
/ # cd test1/
/test1 # ls ## 创建一个文件
/test1 # date > index.html
/test1 # cat index.html
Fri Jun 5 09:58:21 UTC 2020 ## 进入第二个容器内,前往挂载的目录查看是否同步此文件
[root@Centos8 volume]# kubectl exec -it emptydir -c enecontainer-2 -- /bin/sh
# cd /test2
# ls
index.html
# cat index.html
Fri Jun 5 09:58:21 UTC 2020 ## 同时 再添加一条信息到文件中
# date >> index.html
# cat index.html
Fri Jun 5 09:58:21 UTC 2020
Fri Jun 5 17:59:30 CST 2020 ## 此时再返回第一个容器中,查看是否同步文件内容
/test1 # cat index.html
Fri Jun 5 09:58:21 UTC 2020
Fri Jun 5 17:59:30 CST 2020

2、hostPath

hostPath 卷将主机节点的文件系统中的文件或目录挂载到集群中

hostPath的用途如下:

运行需要访问Docker内部的容器;使用 /var/lib/docker 的 hostPath

在容器中运行cAdvisor;使用 /dev/cgroups 的 hostPath

除了所需的 Path 属性之外;用户还可以为 hostPath 卷指定 type

行为

空字符串(默认)用于向后兼容,这意味着在挂载hostPath卷之前不会进行任何检查

DirectoryOrCreate

如果给定的路径没有任何东西存在,那将根据需要在此创建一个空目录,权限设置为0755,与kubelet拥有相同的用户与组

Directory

指定路径下必须存在此目录

FileOrCreate

如果给定的路径没有任何东西存在,那将根据需要在此创建一个空文件,权限设置为0644,与kubelet拥有相同的用户与组

File

给定的路径下必须存在文件

Socket

给定的路径下必须存在Unix套接字

CharDevice

给定的路径下必须存在字符设备

BlockDevice

给定的路径下必须存在块设备

使用这种卷类型时请注意:

  • 由于每个节点上的文件不同,具有相同配置(例如从 podTemplate创建的)的pod在不同节点上的行为可能会有所不同
  • 当Kubernetes按照计划添加资源感知调度时,将无法考虑hostPath使用的资源
  • 在底层主机上创建的文件或目录只能由root写入。必须在特权容器中以root身份运行进程,或修改主机上文件权限以便写入 hostPath 卷
vim dir-volume.yaml
...
apiVersion: v1
kind: Pod
metadata:
name: hostpath-volume
namespace: default
spec:
containers:
- name: hostpath-container
image: hub.vfancloud.com/test/myapp:v1
imagePullPolicy: IfNotPresent
volumeMounts:
- mountPath: /test-volume
name: dir-volume
volumes:
- name: dir-volume
hostPath:
path: /opt
type: Directory # volume类型
...
kubectl create -f dir-volume.yaml ### 进入容器内查看,可以看到,pod的node节点下/opt的所有文件及目录已挂载
[root@Centos8 volume]# kubectl exec -it hostpath-volume -- /bin/sh
/ # ls /test-volume/
cni containerd es-data es-log metricbeat rh

Kubernetes-13:存储卷Volume介绍及使用的更多相关文章

  1. 利用nfs-client-provisioner动态提供Kubernetes后端存储卷

    原文:https://www.kubernetes.org.cn/3894.html 利用NFS client provisioner动态提供Kubernetes后端存储卷 本文翻译自nfs-clie ...

  2. nfs-client-provisioner 利用NFS动态提供Kubernetes后端存储卷

    nfs-client-provisioner 利用NFS动态提供Kubernetes后端存储卷     一.选一个节点安装nfsserver 服务   yum install nfs-common n ...

  3. Rancher 2:添加 NFS client provisioner 动态提供 Kubernetes 后端存储卷

    一.前提说明 1.说明: NFS client provisioner 利用 NFS Server 给 Kubernetes 作为持久存储的后端,并且动态提供PV. 默认 rancher 2 的存储类 ...

  4. 8、kubernetes之存储卷资源

    一.存储卷的类型 emptyDir:在宿主机上分一块内存空间给pod当做存储空间 hostPath:在宿主机上分一块磁盘空间给pod当做存储空间 网络存储: SAN:iSCSI,FC NAS:nfs, ...

  5. kubernetes之NFS动态提供Kubernetes后端存储卷

    StorageClass作为对存储资源的抽象定义, 对用户设置的NFS申请屏蔽后端存储的细节, 一方面减少了用户对于存储资源细节的关注, 另一方面减轻了管理员手工管理pv的工作, 由系统自动完成pv的 ...

  6. Kubernetes Pod的数据卷Volume

    概述 由于容器本身是非持久化的,因此需要解决在容器中运行应用程序遇到的一些问题.首先,当容器崩溃时,kubelet将重新启动容器,但是写入容器的文件将会丢失,容器将会以镜像的初始状态重新开始:第二,在 ...

  7. kubernetes管理存储

    一.Kubernetes 如何管理存储资源: 理解volume 首先我们学习 Volume,以及 Kubernetes 如何通过 Volume 为集群中的容器提供存储:然后我们会实践几种常用的 Vol ...

  8. Docker存储卷篇

    Docker存储卷篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.    一.写时复制(COW)机制 所谓写时复制的效果如上图所示: Docker镜像由多个只读层叠加而成,启动容器 ...

  9. kubernetes系列10—存储卷详解

    本文收录在容器技术学习系列文章总目录 1.认识存储卷 1.1 背景 默认情况下容器中的磁盘文件是非持久化的,容器中的磁盘的生命周期是短暂的,这就带来了一系列的问题:第一,当一个容器损坏之后,kubel ...

  10. k8s volume存储卷(四)

    介绍 volume存储卷是Pod中能够被多个容器访问的共享目录,kubernetes的volume概念,用途和目的与docker的volume比较类似,但两者不能等价,首先,kubernetes中的v ...

随机推荐

  1. Codeforces Round 955 (Div. 2, with prizes from NEAR!) codeforces div2 955

    A. Soccer ------------------------题解--------------- 给你开始比分和结束比分问你中间两队比分有没有相等过有可能就是YES不可能就是NO 结束时两队比分 ...

  2. Sql Server 创建用户并限制权限

    创建登录名 使用sa或者Windows身份验证登录,[安全性]-[登录名],右键[新建登录名] 设置登录名属性 设置数据库权限 db owner --拥有数据库全部权限,包括删除数据库权限 db ac ...

  3. 傻瓜式Java操作MySQL数据库备份(使用mysqldump命令)

    傻瓜式Java操作MySQL数据库备份(使用mysqldump命令) 注释都是由chatGPT生成,有什么问题可以评论交流 @Value("${backup.sql.database}&qu ...

  4. Kubernetes 存储概念之Volumes介绍

    Volumes 默认情况下容器中的磁盘文件是非持久化的,对于运行在容器中的应用来说面临两个问题,第一:当容器挂掉,K8S重启它时,文件将会丢失:第二:当Pod中同时运行多个容器,容器之间需要共享文件时 ...

  5. Django 实现文件上传下载API

    Django 实现文件上传下载API by:授客 QQ:1033553122 欢迎加入全国软件测试交流QQ群7156436 开发环境   Win 10   Python 3.5.4   Django- ...

  6. php 后台执行进程

    一些业务需要长期在后台执行进程 下面用thinkphp5.1做演示 在command文件夹下建立进程 cd 到 lunar_php项目根目录 执行 php think hello 如果想后台执行 no ...

  7. Codeforces Round 953 (Div. 2)

    Codeforces Round 953 (Div. 2) 闲来无事水题解. A . B . C 显然 \(k\) 是偶数.考虑 \(k\) 的上界,\(p_{1}=n,p_{n}=1\),产生 \( ...

  8. 1、SpringMVC简介

    1.1.MVC 概述 MVC:是一种软件架构的思想,将软件按照模型.视图.控制器来划分: M( Model ):模型层,指工程中的 JavaBean ,作用是处理数据: V( View ):视图层,指 ...

  9. 【Kafka】01 基于Docker环境的单例Kafka搭建

    安装参考: https://www.cnblogs.com/vipsoft/p/13233045.html 环境安装需要 Zookeeper + Kafka 要学习Kafka还需要繁琐的安装配置,所以 ...

  10. 在计算机论文中suppose suggest assume 用法上的区别

    ChatGPT3.5的答案: 在计算机论文中,"suppose," "suggest," 和 "assume" 有不同的用法和含义.它们在表 ...