Kubernetes之十三---存储卷详解

2022/6/15 23:22:29

本文主要是介绍Kubernetes之十三---存储卷详解,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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)验证效果

[root@master volumes]# kubectl apply -f vol-emptyDir-demo.yaml
pod/pod-vol-demo created
[root@master volumes]# kubectl get pods -o wide
NAME                            READY   STATUS    RESTARTS   AGE     IP            NODE    NOMINATED NODE   READINESS GATES
myapp-deploy-798dc9b584-97qb9   1/1     Running   7          4d9h    10.244.1.61   node1   <none>           <none>
myapp-deploy-798dc9b584-qctz4   1/1     Running   7          4d9h    10.244.2.59   node2   <none>           <none>
myapp-deploy-798dc9b584-tww7g   1/1     Running   7          4d9h    10.244.2.60   node2   <none>           <none>
pod-vol-demo                    2/2     Running   0          7s      10.244.2.62   node2   <none>           <none>
tomcat-deploy-8f6c5dd96-jncvk   1/1     Running   3          3d21h   10.244.1.60   node1   <none>           <none>
tomcat-deploy-8f6c5dd96-pd7jf   1/1     Running   3          3d21h   10.244.2.61   node2   <none>           <none>
tomcat-deploy-8f6c5dd96-prlv8   1/1     Running   3          3d21h   10.244.1.62   node1   <none>           <none>
[root@master volumes]# curl 10.244.2.62
Sun Aug 2 12:20:27 UTC 2020
Sun Aug 2 12:20:29 UTC 2020
Sun Aug 2 12:20:31 UTC 2020
Sun Aug 2 12:20:33 UTC 2020
Sun Aug 2 12:20:35 UTC 2020
Sun Aug 2 12:20:37 UTC 2020
Sun Aug 2 12:20:39 UTC 2020
Sun Aug 2 12:20:41 UTC 2020

  

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.63   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 "welcome to shanghai" > /data/pod/volume1/index.html ---访问pod内服务,显示成功 [root@master volumes]# curl 10.244.1.63 welcome to shanghai

  

(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 welcome to shanghai

  

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集群服务和NFS服务器的hosts文件,使之能解析nfs服务器

[root@master ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.7.101 master
192.168.7.102 node1
192.168.7.103 node2
192.168.7.104 nfs

 

② 在k8s集群服务器以及需要共享的NFS主机上,都安装nfs-utils 工具,注意:如果k8s集群上也要使用nfs服务器,也需要安装,如果不需要就不需要安装

1 $ yum -y install nfs-utils

  

(2)在104服务器上提供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.7.0/24(rw,no_root_squash) # 共享挂载目录,一定要加上no_root_squash选项,否则K8s集群在root权限下,也无法下载镜像 [root@nfs ~]# systemctl start nfs

 

(3)需要在每个node节点上挂载nfs服务器进行测试,测试挂载效果:

[root@node2 ~]# mount -t nfs 192.168.7.104:/data/volumes /mnt  # 在node2上测试挂载,如果能挂载就OK
[root@node2 ~]# mount  # 可以查看挂载到哪个主机上的信息
nfs:/data/volumes on /mnt type nfs4 (rw,relatime,vers=4.1,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.7.103,local_lock=none,addr=192.168.7.104)
[root@node2 ~]# umount /mnt  # 挂载成功后,就取消挂载,此处只是为了试验挂载效果

  

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)验证,访问服务成功

[root@master ~]# kubectl get pods -o wide
NAME                            READY   STATUS    RESTARTS   AGE     IP            NODE    NOMINATED NODE   READINESS GATES
myapp-deploy-798dc9b584-97qb9   1/1     Running   7          4d10h   10.244.1.61   node1   <none>           <none>
myapp-deploy-798dc9b584-qctz4   1/1     Running   7          4d10h   10.244.2.59   node2   <none>           <none>
myapp-deploy-798dc9b584-tww7g   1/1     Running   7          4d10h   10.244.2.60   node2   <none>           <none>
pod-vol-demo                    2/2     Running   0          17m     10.244.2.62   node2   <none>           <none>
tomcat-deploy-8f6c5dd96-jncvk   1/1     Running   3          3d21h   10.244.1.60   node1   <none>           <none>
tomcat-deploy-8f6c5dd96-pd7jf   1/1     Running   3          3d21h   10.244.2.61   node2   <none>           <none>
tomcat-deploy-8f6c5dd96-prlv8   1/1     Running   3          3d21h   10.244.1.62   node1   <none>           <none>
vol-hostpath                    1/1     Running   0          12m     10.244.1.63   node1   <none>           <none>
vol-nfs                         1/1     Running   0          22s     10.244.2.63   node2   <none>           <none>
[root@master ~]# curl 10.244.2.63
<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。



这篇关于Kubernetes之十三---存储卷详解的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程