kubernetes系列10—存储卷详解
kubernetes系列10—存储卷详解
1、认识存储卷
1.1 背景
默认情况下容器中的磁盘文件是非持久化的,容器中的磁盘的生命周期是短暂的,这就带来了一系列的问题:第一,当一个容器损坏之后,kubelet 会重启这个容器,但是文件会丢失-这个容器会是一个全新的状态;第二,当很多容器在同一Pod中运行的时候,很多时候需要数据文件的共享。Kubernete Volume解决了这个问题。
1.2 介绍
Docker有一个Volumes的概念,虽然这个Volume有点宽松和管理性比较小。在Docker中,一个 Volume 是一个简单的所在主机的一个目录或者其它容器中的。生命周期是没有办法管理,直到最近才有 local-disk-backed 磁盘。Docker现在提供了磁盘驱动,但是功能非常有限(例如Docker1.7只能挂在一个磁盘每个容器,并且无法传递参数)
从另外一个方面讲,Kubernetes volume,拥有明确的生命周期,与所在的Pod的生命周期相同。因此,Kubernetes volume独立与任何容器,与Pod相关,所以数据在重启的过程中还会保留,当然,如果这个Pod被删除了,那么这些数据也会被删除。更重要的是,Kubernetes volume 支持多种类型,任何容器都可以使用多个Kubernetes volume。
它的核心,一个 volume 就是一个目录,可能包含一些数据,这些数据对pod中的所有容器都是可用的,这个目录怎么使用,什么类型,由什么组成都是由特殊的volume 类型决定的。
要使用Volume,pod需要指定Volume的类型和内容(spec.volumes字段),和映射到容器的位置(spec.containers.volumeMounts字段)。
容器中的进程可以看成由Docker镜像和卷组成的文件系统视图。Docker镜像位于文件系统层次结构的根目录下,任何卷都安装在图像中的指定路径上。卷无法装入其他卷或具有到其他卷的硬链接。Pod中的每个容器必须独立指定每个卷的安装位置。
1.3 存储卷常用类型
- 非持久性存储
- emptyDir
- hostPath
- 网络连接性存储
- SAN:iSCSI
- NFS:nfs,cfs
- 分布式存储
- glusterfs、rbd、cephfs
- 云端存储
- EBS、Azure Disk、阿里云、gitRepo
1
|
$ kubectl explain pod.spec.volumes 查询k8s支持的所有类型存储卷
|
2、emptyDir存储卷
2.1 emptyDir介绍
使用emptyDir,当Pod分配到Node上时,将会创建emptyDir,并且只要Node上的Pod一直运行,Volume就会一直存。当Pod(不管任何原因)从Node上被删除时,emptyDir也同时会删除,存储的数据也将永久删除。
常用于作为临时目录、或缓存使用。
2.2 演示:创建emptyDir存储卷
(1)编写yaml文件,并创建
先创建一个名为html的存储卷;再由2个pod都挂载此存储卷;
pod1基于此存储卷作为nginx的主目录;pod2向此存储卷目录写入东西;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
[root@master volumes] # vim vol-emptyDir-demo.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-vol-demo
namespace: default
labels:
app: myapp
tier: frontend
annotations:
along.com /created-by : "cluster admin"
spec:
volumes:
- name: html
emptyDir: {}
containers:
- name: myapp
image: ikubernetes /myapp :v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html/
- name: busybox
image: busybox:latest
imagePullPolicy: IfNotPresent
volumeMounts:
- name: html
mountPath: /data/
command :
- "/bin/sh"
- "-c"
- "while true; do echo $(date) >> /data/index.html; sleep 2; done"
[root@master volumes] # kubectl apply -f vol-emptyDir-demo.yaml
pod /pod-vol-demo created
|
(2)验证
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
---pod创建成功
[root@master ~] # kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
pod-vol-demo 2 /2 Running 0 13s 10.244.1.106 node1
---访问业务,输出是pod2的输入
[root@master ~] # curl 10.244.1.106
Tue Jan 29 07:19:13 UTC 2019
Tue Jan 29 07:19:15 UTC 2019
Tue Jan 29 07:19:17 UTC 2019
Tue Jan 29 07:19:19 UTC 2019
Tue Jan 29 07:19:21 UTC 2019
Tue Jan 29 07:19:23 UTC 2019
Tue Jan 29 07:19:25 UTC 2019
Tue Jan 29 07:19:27 UTC 2019
Tue Jan 29 07:19:29 UTC 2019
|
3、hostPath存储卷
3.1 emptyDir介绍
hostPath允许挂载Node(宿主机)上的文件系统到Pod里面去。如果Pod需要使用Node上的文件,可以使用hostPath。
3.2 hostPath类型
值 | 行为 |
---|---|
空 | 空字符串(默认)用于向后兼容,这意味着在安装hostPath卷之前不会执行任何检查。 |
DirectoryOrCreate
|
如果给定路径中不存在任何内容,则将根据需要创建一个空目录,权限设置为0755,与Kubelet具有相同的组和所有权。 |
Directory
|
目录必须存在于给定路径中 |
FileOrCreate
|
如果给定路径中不存在任何内容,则会根据需要创建一个空文件,权限设置为0644,与Kubelet具有相同的组和所有权。 |
File
|
文件必须存在于给定路径中 |
Socket
|
UNIX套接字必须存在于给定路径中 |
CharDevice
|
字符设备必须存在于给定路径中 |
BlockDevice
|
块设备必须存在于给定路径中 |
3.2 演示:创建hostPath存储卷
(1)编写yaml文件,并创建
创建存储卷,使用DirectoryOrCreate类型,node节点不存在会自动创建
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
[root@master volumes] # vim vol-hostpath-demo.yaml
apiVersion: v1
kind: Pod
metadata:
name: vol-hostpath
namespace: default
spec:
volumes:
- name: html
hostPath:
path: /data/pod/volume1/
type : DirectoryOrCreate
containers:
- name: myapp
image: ikubernetes /myapp :v1
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html/
[root@master volumes] # kubectl apply -f vol-hostpath-demo.yaml
pod /vol-hostpath created
|
(2)查询验证
1
2
3
4
5
6
|
[root@master volumes] # kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
vol-hostpath 1 /1 Running 0 3s 10.244.1.111 node1
---在node1上查询是否生产目录
[root@node1 ~] # ll -d /data/pod/volume1/index.html
-rw-r--r-- 1 root root 17 Sep 21 14:44 /data/pod/volume1/index .html
|
(3)验证存储卷功能
1
2
3
4
5
|
---在node1上生成文件
[root@node1 ~] # echo "node01.along.com" > /data/pod/volume1/index.html
---访问pod内服务,显示成功
[root@master volumes] # curl 10.244.1.111
node01.along.com
|
(4)就算pod被删除再重建,只要node还在,存储卷就还在
1
2
3
4
5
6
7
8
9
|
[root@master volumes] # kubectl delete -f vol-hostpath-demo.yaml
pod "vol-hostpath" deleted
[root@master volumes] # kubectl apply -f vol-hostpath-demo.yaml
pod /vol-hostpath created
[root@master volumes] # kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
vol-hostpath 1 /1 Running 0 3s 10.244.1.112 node1
[root@master volumes] # curl 10.244.1.112
node01.along.com
|
4、共享存储NFS存储卷
4.1 NFS存储卷介绍
NFS 是Network File System的缩写,即网络文件系统。Kubernetes中通过简单地配置就可以挂载NFS到Pod中,而NFS中的数据是可以永久保存的,同时NFS支持同时写操作。Pod被删除时,Volume被卸载,内容被保留。这就意味着NFS能够允许我们提前对数据进行处理,而且这些数据可以在Pod之间相互传递。
4.2 演示:创建NFS存储卷
4.2.1 在一台服务器搭建NFS
(1)事前准备
① 修改k8s集群服务的hosts文件,使之能解析nfs服务器
1
2
3
4
5
|
[root@master volumes] # vim /etc/hosts
192.168.130.103 master
192.168.130.104 node1
192.168.130.105 node2
192.168.130.106 nfs
|
② 在k8s集群服务器,安装nfs-utils 工具
1
|
$ yum -y install nfs-utils
|
(2)在106服务器上提供nfs服务
1
2
3
4
5
6
7
|
[root@nfs ~] # yum -y install nfs-utils
[root@nfs ~] # mkdir /data/volumes -p
[root@nfs ~] # vim /data/volumes/index.html
<h1>NFS stor< /h1 >
[root@nfs ~] # vim /etc/exports
/data/volumes 192.168.130.0 /24 (rw,no_root_squash)
[root@nfs ~] # systemctl start nfs
|
4.2.1 创建NFS存储卷
(1)编写yaml文件,并创建
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
[root@master volumes] # vim vol-nfs-demo.yaml
apiVersion: v1
kind: Pod
metadata:
name: vol-nfs
namespace: default
spec:
volumes:
- name: html
nfs:
path: /data/volumes
server: nfs
containers:
- name: myapp
image: ikubernetes /myapp :v1
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html/
[root@master volumes] # kubectl apply -f vol-nfs-demo.yaml
pod /vol-nfs created
|
(2)验证,访问服务成功
1
2
3
4
5
|
[root@master ~] # kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
vol-nfs 1 /1 Running 0 9s 10.244.1.115 node1
[root@master ~] # curl 10.244.1.115
<h1>NFS stor< /h1 >
|
删除pod,再创建,也还存在数据。
5、一些不常用的存储卷
5.1 gitRepo
(1)介绍
gitRepo volume将git代码下拉到指定的容器路径中
(2)示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
apiVersion: v1
kind: Pod
metadata:
name: server
spec:
volumes:
- name: git-volume
gitRepo:
repository: "git@github.com:alonghub/my-git-repository.git"
revision: "22f1d8406d464b0c0874075539c1f2e96c253775"
containers:
- name: myapp
image: ikubernetes /myapp :v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
volumeMounts:
- name: git-volume
mountPath: /usr/share/nginx/html/
|
5.2 glusterfs
glusterfs,允许将Glusterfs(一个开源网络文件系统)Volume安装到pod中。不同于emptyDir,Pod被删除时,Volume只是被卸载,内容被保留。味着glusterfs能够允许我们提前对数据进行处理,而且这些数据可以在Pod之间“切换”。
注意::必须先运行自己的GlusterFS安装,然后才能使用它。
有关更多详细信息,请参阅GlusterFS示例。
5.3 RBD
RBD允许Rados Block Device格式的磁盘挂载到Pod中,同样的,当pod被删除的时候,rbd也仅仅是被卸载,内容保留,rbd能够允许我们提前对数据进行处理,而且这些数据可以在Pod之间“切换”。
有关更多详细信息,请参阅RBD示例。
5.4 cephfs
cephfs Volume可以将已经存在的CephFS Volume挂载到pod中,与emptyDir特点不同,pod被删除的时,cephfs仅被被卸载,内容保留。cephfs能够允许我们提前对数据进行处理,而且这些数据可以在Pod之间“切换”。
提示:可以使用自己的Ceph服务器运行导出,然后在使用cephfs。
有关更多详细信息,请参阅CephFS示例
转载于:https://www.cnblogs.com/dengbingbing/p/10399203.html
kubernetes系列10—存储卷详解相关推荐
- Kubernetes K8S之存储Volume详解
K8S之存储Volume概述与说明,并详解常用Volume示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS7.7 2C ...
- Kubernetes K8S之存储Secret详解
Kubernetes K8S之存储Secret详解 Secret概述 Secret类型 Service Account Opaque Secret 创建secret 将Secret挂载到Volume中 ...
- Kubernetes K8S之存储PV-PVC详解
K8S之存储PV-PVC概述与说明,并详解常用PV-PVC示例 概述 与管理计算实例相比,管理存储是一个明显的问题.PersistentVolume子系统为用户和管理员提供了一个API,该API从如何 ...
- kubernetes系列—PV和PVC详解
1.认识PV/PVC/StorageClass 1.1 介绍 管理存储是管理计算的一个明显问题.该PersistentVolume子系统为用户和管理员提供了一个API,用于抽象如何根据消费方式提供存储 ...
- k8s学习笔记(10)--- kubernetes核心组件之controller manager详解
kubernetes核心组件之controller manager详解 一.Controller Manager简介 1.1 Replication Controller 1.2 Node Contr ...
- java源码系列:HashMap底层存储原理详解——4、技术本质-原理过程-算法-取模具体解决什么问题
目录 简介 取模具体解决什么问题? 通过数组特性,推导ascii码计算出来的下标值,创建数组非常占用空间 取模,可保证下标,在HashMap默认创建下标之内 简介 上一篇文章,我们讲到 哈希算法.哈希 ...
- 大型网站架构系列:负载均衡详解(4)
原文:大型网站架构系列:负载均衡详解(4) 本文是负载均衡详解的第四篇,主要介绍了LVS的三种请求转发模式和八种负载均衡算法,以及Haproxy的特点和负载均衡算法.具体参考文章,详见最后的链接. 三 ...
- zabbix 5系列之snmp监控详解
更多精彩Zabbix文章.技术交流.免费技术培训加微号NateIT,免费获取zabbix安装.配置.优化技术培训视频 官网:http://ywzs.hanyunintel.com 首先,谢谢原作者: ...
- Mysql存储引擎详解(MyISAM与InnoDB的区别)
Mysql存储引擎详解(MyISAM与InnoDB的区别) 存储引擎 MySQL中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平 ...
最新文章
- 普华永道的2011年全球信息安全调查
- STM32堆栈大小及位置
- mysql linux err2003_远程连接linux下的mysql Err1045 Err2003解决办法
- 最后关于nginx+passenger+ror+mysql的安装部署过程
- [蓝桥小记]蓝桥杯参赛经历分享
- 使用WebDeployment Project改善VS2005发布网站问题
- Java读取指定目录下的所有文件名
- 次世代角色建模的学习流程,软件学习顺序
- 08-Elasticsearch的配置(1)
- 《Spring Security3》第四章第一部分翻译下(自定义的UserDetailsServic
- word 文字超出表格边框怎么办
- 关于oracle的物理dg,单机上创建物理DG(Oracle 10g单实例)
- Chrome扩展程序开发文档(中文译文)
- 香港十大黄金投资公司排名榜单(2022最新版)
- centos 7 安装时忘记打开网络导致开机网络无法自启动解决办法
- 高中数学基础-2.3幂函数
- 联想p720工作站安装linux,联想发布ThinkStation P920和P720工作站 采用至强处理器
- 华为交换机eth口作用_华为的交换机有什么用
- 校园兼职平台(三层架构)
- IOS QQ第三方登陆提交AppleStore 被拒解决
热门文章
- linux 4.4内核特性,Linux Kernel 4.4.19 LTS长期支持版发布
- mysql排序加权_mysql多关键词查询相关匹配加权排序
- 根据年月日判断第多少天,星期几
- Toad for Oracle 导入MIP.dmp文件时:报内存不足时的解决办法:
- redis——数据库
- 做了nginx反向代理之后常见问题汇总
- Git(6)-Git配置文件、底层操作命令
- 在Ubuntu上安装Git
- python求小于n的所有素数_用python求出2000000内所有素数的和?不知怎么写?
- vuex 最简单、最详细的入门文档