编辑
2023-06-12
K8S
00
请注意,本文编写于 590 天前,最后修改于 590 天前,其中某些信息可能已经过时。

目录

1.卷 Volume
1.1 卷的类型
2.使用方式
3.常见类型
3.1 emptyDir
3.2 hostPath
3.3 nfs

1.卷 Volume

官网地址: https://kubernetes.io/zh-cn/docs/concepts/storage/volumes/

Container 中的文件在磁盘上是临时存放的,这给 Container 中运行的较重要的应用程序带来一些问题。 问题之一是当容器崩溃时文件丢失。 kubelet 会重新启动容器,但容器会以干净的状态重启。 第二个问题会在同一 Pod 中运行多个容器并共享文件时出现。 Kubernetes Volume 这一抽象概念能够解决这两个问题。

1.1 卷的类型

Kubernetes 支持很多类型的卷。 Pod 可以同时使用任意数目的卷类型。 临时卷类型的生命周期与 Pod 相同,但持久卷可以比 Pod 的存活期长。 当 Pod 不再存在时,Kubernetes 也会销毁临时卷;不过 Kubernetes 不会销毁持久卷。 对于给定 Pod 中任何类型的卷,在容器重启期间数据都不会丢失。

卷的核心是一个目录,其中可能存有数据,Pod 中的容器可以访问该目录中的数据。 所采用的不同卷的类型将决定该目录如何形成的、使用何种介质保存数据以及目录中存放的内容。常用的卷类型有 configMap、emptyDir、local、nfs、secret 等。

  • ConfigMap:可以将配置文件以键值对的形式保存到 ConfigMap 中,并且可以在 Pod 中以文件或环境变量的形式使用。ConfigMap 可以用来存储不敏感的配置信息,如应用程序的配置文件。
  • EmptyDir:是一个空目录,可以在 Pod 中用来存储临时数据,当 Pod 被删除时,该目录也会被删除。
  • Local:将本地文件系统的目录或文件映射到 Pod 中的一个 Volume 中,可以用来在 Pod 中共享文件或数据。
  • NFS:将网络上的一个或多个 NFS 共享目录挂载到 Pod 中的 Volume 中,可以用来在多个 Pod 之间共享数据。
  • Secret:将敏感信息以密文的形式保存到 Secret 中,并且可以在 Pod 中以文件或环境变量的形式使用。Secret 可以用来存储敏感信息,如用户名密码、证书等。

2.使用方式

使用卷时, 在 .spec.volumes 字段中设置为 Pod 提供的卷,并在 .spec.containers[*].volumeMounts 字段中声明卷在容器中的挂载位置。 容器中的进程看到的文件系统视图是由它们的容器镜像的初始内容以及挂载在容器中的卷(如果定义了的话)所组成的。 其中根文件系统同容器镜像的内容相吻合。 任何在该文件系统下的写入操作,如果被允许的话,都会影响接下来容器中进程访问文件系统时所看到的内容。

yml
apiVersion: v1 kind: Pod metadata: name: configmap-pod spec: containers: - name: test image: busybox:1.28 volumeMounts: .......... volumes: ............

3.常见类型

3.1 emptyDir

yml
apiVersion: v1 kind: Pod metadata: name: emptydir-example spec: containers: - name: writer image: busybox command: ["/bin/sh", "-c", "echo 'Hello World!' > /data/hello.txt ; sleep 3600"] volumeMounts: - name: shared-data #卷的名字要一致 mountPath: /data - name: reader image: busybox command: ["/bin/sh", "-c", "cat /data/hello.txt ; sleep 3600"] volumeMounts: - name: shared-data #卷的名字要一致 mountPath: /data volumes: - name: shared-data #卷的名字要一致 emptyDir: {}

相关信息

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

3.2 hostPath

yml
apiVersion: v1 kind: Pod metadata: name: busybox-hostpath spec: containers: - name: busybox image: busybox command: ["/bin/sh", "-c", "echo 'hello' > /data/data.txt && sleep 3600"] volumeMounts: - name: data mountPath: /data volumes: - name: data hostPath: path: /data/hostpath

相关信息

总结: 如果 Pod 被销毀了,hostPath 对应的目录还是会被保留,从这一点来看,hostPath 的持久性比emptyDir 强。不过一旦Host 崩溃,hostPath 也就无法访问了。但是这种方式也带来另外一个问题增加了 pod 与节点的耦合。

3.3 nfs

nfs: network filesystem : 网络文件存储系统

yml
apiVersion: v1 kind: Pod metadata: name: nfs-test spec: containers: - name: busybox image: busybox command: [ "/bin/sh", "-c", "echo 'niubi!' > /data/555.txt && sleep 3600" ] volumeMounts: - name: nfs-volume mountPath: /data volumes: - name: nfs-volume nfs: server: 192.168.24.131 #nfs服务器ip path: /root/nfs/data #nfs服务器挂载目录

相关信息

总结: 相对于 emptyDir 和 hostPath,这种 volume 类型的最大特点就是不依赖 Kuberees Volume 的底层基础设施由独立的存储系统管理,与 Kubernetes 集群是分离的。数据被持久化后,即使整个 Kubernetes 崩溃也不会受损。当然,运维这样的存储系统通常不是一项简单的工作,特别是对可靠性、可用性和扩展性 有较高要求的时候。

本文作者:松轩(^U^)

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

Document