当前位置:首页 > Web开发 > 正文

Kubernetes的存储之Volume

2024-03-31 Web开发

标签:

在虚拟化的一系列解决方案中,数据的长期化都是需要我们非常关心的问题,dokcer是这样,Kubernetes也是这样。不过在Kubernetes中,有一个数据卷的观点。

一、Volume简介

我们经常城市说:容器、Pod都是很短暂的!其含义就是容器和Pod的生命周期都是很短暂的,会被频繁地销毁和创建。容器销毁时,生存在容器内部文件系统中的数据城市被断根。

Volume的生命周期独立于容器,Pod中的容器可能被销毁和重启,但Volume会被保存。

Kubernetes Volume主要解决了以下两个问题:
1)数据长期性:凡是情况下,容器运行起来后,写到其文件系统的文件是暂时性的。当容器瓦解后,kubelet会将这个容器不停的重启,当到达重启的次数后,,容器仍然不成用,那么就会将这个容器kill失,从头生成新的容器。此时,新运行的容器并没有原容器中的数据,因为容器是由镜像创建的;
2)数据共享:同一个Pod中运行的容器之间,经常会存在共享文件/共享文件夹的需求;

从根柢上来说,一个数据卷仅仅是一个可以被Pod访谒的目录或文件。这个目录是怎么来的,取决于该数据卷的类型。同一个Pod中的两个容器可以将一个数据卷挂载到差此外目录下。

Volume 供给了对各类 backend 的抽象,容器在使用 Volume 读写数据的时候不需要关心数据到底是存放在本地节点的文件系统中呢还是云硬盘上。对它来说,所有类型的 Volume 都只是一个目录。

二、Volume之emptyDir 1)emptyDir简介

emptyDir 是最根本的 Volume 类型。正如其名字所示,一个 emptyDir Volume 是 Host 上的一个空目录。

emptyDir Volume 对付容器来说是长期的,对付 Pod 则不是。当 Pod 从节点删除时,Volume 的内容也会被删除。但如果只是容器被销毁而 Pod 还在,则 Volume 不受影响。类似于docker数据长期化中的docker manager volume方法!

2)emptyDir使用示例 [[email protected] yaml]# vim emptyDir.yaml apiVersion: v1 kind: Pod metadata: name: producer-consumer #界说Pod的名称 spec: containers: - image: busybox name: producer #界说容器的名称 volumeMounts: - mountPath: /producer_dir #指定容器内的路径 name: shared-volume #暗示把shared-volume挂载到容器中 args: #当容器运行完成后,执行以下的写操纵 - /bin/sh - -c - echo "hello k8s" > /producer_dir/hello; sleep 30000 - image: busybox name: consumer #界说容器的名称 volumeMounts: - mountPath: /consumer_dir name: shared-volume #与上一个容器一样 args: - /bin/sh - -c - cat /consumer_dir/hello; sleep 30000 volumes: - name: shared-volume #界说数据卷的名称,必需与以上挂载的数据卷名称一致 emptyDir: {} #界说一个类型为emptyDir的数据卷,名称为shared-volume [[email protected] yaml]# kubectl apply -f emptyDir.yam #生成所需的Pod资源 [[email protected] yaml]# kubectl exec -it producer-consumer -c producer /bin/sh #进入第一个容器进行验证 / # cat /producer_dir/hello hello k8s [[email protected] yaml]# kubectl exec -it producer-consumer -c consumer /bin/sh #进行第二个容器进行验证 / # cat /consumer_dir/hello hello k8s

到此可以看出这个pod中的两个容器指定的目录内容都是一样的,具体是本地的阿谁目录还需进一步进行验证。

[[email protected] yaml]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES producer-consumer 2/2 Running 0 7m58s 10.244.2.2 node02 <none> <none> #可以看出这个pod是运行在node02上的 [[email protected] ~]# docker ps | grep busybox #由于容器较多,按照使用的镜像名称进行筛选 4fbd734e1763 busybox "/bin/sh -c ‘cat /co…" 8 minutes ago Up 8 minutes k8s_consumer_producer-consumer_default_003a002d-caec-4202-a020-1ae8d6ff7eba_0 b441c2ff2217 busybox "/bin/sh -c ‘echo \"h…" 8 minutes ago Up 8 minutes k8s_producer_producer-consumer_default_003a002d-caec-4202-a020-1ae8d6ff7eba_0 [[email protected] ~]# docker inspect 4fbd734e1763 #按照容器的ID检察容器的详细信息 #找到Mounts字段,如下: "Mounts": [ { "Type": "bind", "Source": "/var/lib/kubelet/pods/003a002d-caec-4202-a020-1ae8d6ff7eba/volumes/kubernetes.io~empty-dir/shared-volume", #此处指定的等于docker host本地的目录 "Destination": "/consumer_dir", #容器中的目录 "Mode": "", "RW": true, "Propagation": "rprivate" }, [[email protected] ~]# docker inspect b441c2ff2217 "Mounts": [ { "Type": "bind", "Source": "/var/lib/kubelet/pods/003a002d-caec-4202-a020-1ae8d6ff7eba/volumes/kubernetes.io~empty-dir/shared-volume", "Destination": "/producer_dir", "Mode": "", "RW": true, "Propagation": "rprivate" }, #可以看出这两个容器的源目录是一样,挂载的是docker host本地的同一个目录 [[email protected] ~]# cd /var/lib/kubelet/pods/003a002d-caec-4202-a020-1ae8d6ff7eba/volumes/kubernetes.io~empty-dir/shared-volume [[email protected] shared-volume]# cat hello hello k8s #验证内容

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/30473.html