Kubernetes(9)数据管理

Kubernetes(9)数据管理

volume

首先我们会学习Volume,以及Kubernetes如何通过Volume为集群中的容器提供存储;然后我们会实践几种常用的Volume类型并理解它们各自的应用场景;最后,我们会讨论Kubernetes如何通过Persistent Volume和Persistent Volume Claim分离集群管理员与集群用户的职责,并实践Volume的静态供给和动态供给
在这里插入图片描述

Volume

Kubernetes 卷具有明确的生命周期——与包裹它的 Pod 相同。 因此,卷比 Pod 中运行的任何容器的存活期都长,在容器重新启动时数据也会得到保留。 当然,当一个 Pod 不再存在时,卷也将不再存在。也许更重要的是,Kubernetes 可以支持许多类型的卷,Pod 也能同时使用任意数量的卷。
卷的核心是包含一些数据的目录,Pod 中的容器可以访问该目录。 特定的卷类型可以决定这个目录如何形成的,并能决定它支持何种介质,以及目录中存放什么内容。
使用卷时, Pod 声明中需要提供卷的类型 (.spec.volumes 字段)和卷挂载的位置 (.spec.containers.volumeMounts 字段).
容器中的进程能看到由它们的 Docker 镜像和卷组成的文件系统视图。 Docker 镜像 位于文件系统层次结构的根部,并且任何 Volume 都挂载在镜像内的指定路径上。 卷不能挂载到其他卷,也不能与其他卷有硬链接。 Pod 中的每个容器必须独立地指定每个卷的挂载位置。

Kubernetes的存储模型Volume,学习如何将各种持久化存储映射到容器。
我们经常会说:容器和Pod是短暂的。其含义是它们的生命周期可能很短,会被频繁地销毁和创建。容器销毁时,保存在容器内部文件系统中的数据都会被清除。

为了持久化保存容器的数据,可以使用Kubernetes Volume.
Volume的生命周期独立于容器,Pod中的容器可能被销毁和重建,但Volume会被保留.
本质上,Kubernetes Volume是一个目录,这一点与Docker Volume类似。当Volume被mount到Pod,Pod中的所有容器都可以访问这个Volume.
Volume也支持多种backend类型,包括 emptyDir、hostPath、GCE Persistent Disk、AWS Elastic Block Store、NFS、Ceph等

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

Pod中的所有容器都可以共享Volume,它们可以指定各自的mount路径。

emptyDir

我们将从最简单的emptyDir开始学习Kubernetes Volume
emptyDir是最基础的Volume类型。正如其名字所示,一个emptyDir Volume是Host上的一个空目录

Volume对于容器来说是持久的,对于Pod则不是。当Pod从节点删除时,Volume的内容也会被删除。但如果只是容器被销
毁而Pod还在,则Volume不受影响。
也就是说:emptyDir Volume的生命周期与Pod一致

emptyDir 的一些用途:
缓存空间,例如基于磁盘的归并排序。
为耗时较长的计算任务提供检查点,以便 任务能方便 地从崩溃前状态恢复执行。
在 Web 服务器容器服务数据时,保存内容管理器容器获取的文件。

默认情况下, emptyDir 卷存储在支持该节点所使用的介质上;这里的介质可以是磁盘或 SSD 或网络存储,这取决于您的环境。 但是,您可以将 emptyDir.medium 字段设置为 “Memory”,以告诉 Kubernetes 为您安装 tmpfs(基于 RAM 的文件系统)。 虽然 tmpfs 速度非常快,但是要注意它与磁盘不同。 tmpfs 在节点重启时会被清除,并且您所写入的所有文件都会计入容器的内存消耗,受容器内存限制约束。

下面通过例子来实践emptyDir
[k8s@server1 ~]$ cat emptyDir.yml 
apiVersion: v1
kind: Pod
metadata:
 name: producer-consumer
spec:
  containers:
  - image: busybox
    name: producer
    volumeMounts:
    - mountPath: /producer_dir
      name: shared-volume
    args:
    - /bin/sh
    - -c
    - echo "hello world" > /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: {}


这里我们模拟了一个producer-consumer场景。Pod有两个容器
producer和consumer,它们共享一个Volume。producer负责往Volume中写数据,consumer则是从Volume读取数据

1.文件最底部volumes定义了一个emptyDir类型的Volume shared-volume
2.producer容器将shared-volume mount到/producer_dir目录
3.producer通过echo将数据写到文件hello里
4.consumer容器将shared-volume mount到/consumer_dir目录
5.consumer通过cat从文件hello读数据

[k8s@server1 ~]$ kubectl get pod
NAME                READY   STATUS    RESTARTS   AGE
producer-consumer   2/2     Running   0          76s
[k8s@server1 ~]$ kubectl logs producer-consumer consumer 
hello world

[root@server3 shared-volume]# docker ps -a
1a7d3-b35f-452c-90c1-52adf2e5f532_3
f293c268929e        busybox                "/bin/sh -c 'cat /co…"    8 minutes ago       Up 8 minutes                                       k8s_consumer_producer-consumer_default_f42e8fc1-59d8-4359-9b6a-65b95b06c762_0
8de1260fdd5a        busybox                "/bin/sh -c 'echo \"h…"   8 minutes ago       Up 8 minutes                                       k8s_producer_producer-consumer_default_f42e8fc1-59

[root@server3 shared-volume]# docker inspect 8de1260fdd5a | grep Source
                "Source": "/var/lib/kubelet/pods/f42e8fc1-59d8-4359-9b6a-65b95b06c762/volumes/kubernetes.io~empty-dir/shared-volume",
                "Source": "/var/lib/kubelet/pods/f42e8fc1-59d8-4359-9b6a-65b95b06c762/volumes/kubernetes.io~secret/default-token-jvzv6",
                "Source": "/var/lib/kubelet/pods/f42e8fc1-59d8-4359-9b6a-65b95b06c762/etc-hosts",
                "Source": "/var/lib/kubelet/pods/f42e8fc1-59d8-4359-9b6a-65b95b06c762/containers/producer/6376847f",
[root@server3 shared-volume]# docker inspect f293c268929e | grep Source
                "Source": "/var/lib/kubelet/pods/f42e8fc1-59d8-4359-9b6a-65b95b06c762/volumes/kubernetes.io~empty-dir/shared-volume",
                "Source": "/var/lib/kubelet/pods/f42e8fc1-59d8-4359-9b6a-65b95b06c762/volumes/kubernetes.io~secret/default-token-jvzv6",
                "Source": "/var/lib/kubelet/pods/f42e8fc1-59d8-4359-9b6a-65b95b06c762/etc-hosts",
                "Source": "/var/lib/kubelet/pods/f42e8fc1-59d8-4359-9b6a-65b95b06c762/containers/consumer/76141b24",

因为emptyDir是Docker Host文件系统里的目录,其效果相当于执
行了docker run -v/producer_dir和docker run -v /consumer_dir。通过docker inspect查看容器的详细配置信息,我们发现两个容器都mount了同一个目录

#这里/var/lib/kubelet/pods/f42e8fc1-59d8-4359-9b6a-65b95b06c762/volumes/kubernetes.io~empty-dir/shared-volume 就是emptyDir在Host上的真正路径
[root@server3 default-token-jvzv6]# cd /var/lib/kubelet/pods/f42e8fc1-59d8-4359-9b6a-65b95b06c762/volumes/kubernetes.io~empty-dir/shared-volume
[root@server3 shared-volume]# ls
hello
[root@server3 shared-volume]# cat hello 
hello world

"""
emptyDir是Host上创建的临时目录,其优点是能够方便地为Pod
中的容器提供共享存储,不需要额外的配置。它不具备持久性,如果
Pod不存在了,emptyDir也就没有了。根据这个特性,emptyDir特别
适合Pod中的容器需要临时共享存储空间的场景
"""

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值