kubernetes系列10—存储卷详解

今天药忘吃喽~ 2021-12-24 09:49 308阅读 0赞

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

发表评论

表情:
评论列表 (有 0 条评论,308人围观)

还没有评论,来说两句吧...

相关阅读

    相关 kubernetes存储

    一、存储卷的概念和类型 为了保证数据的持久性,必须保证数据在外部存储在`docker`容器中。在宿主机和容器内做映射,可以保证在容器的生命周期结束时,数据依旧可以实现...

    相关 kubernetes存储详解

    1. Volumes 1.1. volume概述 容器上的文件生命周期同容器的生命周期一致,即容器挂掉之后,容器将会以最初镜像中的文件系统内容启动,之前容器运