kubernetes(k8s):volumes 配置管理(emptyDir、hostPath、nfs方式挂载卷)

文章目录

  • 1. 卷的作用,K8S中的volume挂载方式
  • 2. kubernetes支持的卷
  • 3. emptyDir卷
    • 3.1 一个pod内多容器之间的数据共享问题
  • 4. hostPath卷
    • 4.1 文件共享到本地盘,pod消失后,文件保存到本地
  • 5.Pod内直接挂载nfs服务器的共享目录

1. 卷的作用,K8S中的volume挂载方式

容器中的文件在磁盘上是临时存放的,这给容器中运行的特殊应用程序带来一些问题。首先,当容器崩溃时,kubelet 将重新启动容器,容器中的文件将会丢失,因为容器会以干净的状态重建。其次,当在一个 Pod 中同时运行多个容器时,常常需要在这些容器之间共享文件。 Kubernetes 抽象出 Volume 对象来解决这两个问题。

Kubernetes 卷具有明确的生命周期,与包裹它的 Pod 相同。 因此,卷比 Pod 中运行的任何容器的存活期都长,在容器重新启动时数据也会得到保留。 当然,当一个 Pod 不再存在时,卷也将不再存在。也许更重要的是,Kubernetes 可以支持许多类型的卷,Pod 也能同时使用任意数量的卷

卷不能挂载到其他卷,也不能与其他卷有硬链接。 Pod 中的每个容器必须独立地指定每个卷的挂载位置。

2. kubernetes支持的卷

awsElasticBlockStore 、azureDisk、azureFile、cephfs、cinder、configMap、csi
downwardAPI、emptyDir、fc (fibre channel)、flexVolume、flocker
gcePersistentDisk、gitRepo (deprecated)、glusterfs、hostPath、iscsi、local、
nfs、persistentVolumeClaim、projected、portworxVolume、quobyte、rbd
scaleIO、secret、storageos、vsphereVolume

3. emptyDir卷

当 Pod 指定到某个节点上时,首先创建的是一个 emptyDir 卷,并且只要 Pod 在该节点上运行,卷就一直存在。 就像它的名称表示的那样,卷最初是空的。 尽管 Pod 中的容器挂载 emptyDir 卷的路径可能相同也可能不同,但是这些容器都可以读写 emptyDir 卷中相同的文件。当 Pod 因为某些原因被从节点上删除时,emptyDir 卷中的数据也会永久删除

emptyDir 的使用场景:

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

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

3.1 一个pod内多容器之间的数据共享问题

文件共享,pod消亡后,生成的共享文件也会消亡

apiVersion: v1
kind: Pod
metadata:
  name: vol1
spec:
  containers:
  - name: vm1
    image: reg.westos.org/k8s/busyboxplus
    command: ["sleep","300"]
    volumeMounts:
    - mountPath: /cache      //vm1容器内卷挂载点
      name: cache-volume
  - name: vm2
    image: reg.westos.org/k8s/nginx
    volumeMounts:
    - mountPath: /usr/share/nginx/html       //vm2容器内卷挂载点
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir:
      medium: Memory    //告诉 Kubernetes 安装 tmpfs(基于内存的文件系统)
      sizeLimit: 100Mi

kubernetes(k8s):volumes 配置管理(emptyDir、hostPath、nfs方式挂载卷)_第1张图片一个容器内的添加数据,在另一个容器内部可以访问
kubernetes(k8s):volumes 配置管理(emptyDir、hostPath、nfs方式挂载卷)_第2张图片

4. hostPath卷

hostPath 卷能将主机节点文件系统上的文件或目录挂载到您的 Pod。 虽然这不是大多数 Pod 需要的,但是它为一些应用程序提供了强大的逃生舱。

hostPath 的一些用法有:

  • 运行一个需要访问 Docker 引擎内部机制的容器,挂载 /var/lib/docker 路径。
  • 在容器中运行 cAdvisor 时,以 hostPath 方式挂载 /sys。
  • 允许 Pod 指定给定的 hostPath 在运行 Pod 之前是否应该存在,是否应该创建以及应该以什么方式存在。

除了必需的 path 属性之外,用户可以选择性地为 hostPath 卷指定 type。
kubernetes(k8s):volumes 配置管理(emptyDir、hostPath、nfs方式挂载卷)_第3张图片当使用这种类型的卷时要小心,因为:

  • 具有相同配置(例如从podTemplate创建)的多个Pod会由于节点上文件的不同而在不同节点上有不同的行为。
  • 当Kubernetes按照计划添加资源感知的调度时,这类调度机制将无法考虑由hostPath使用的资源。
  • 基础主机上创建的文件或目录只能由root用户写入。您需要在特权容器中以root身份运行进程,或者修改主机上的文件权限以便容器能够写入hostPath卷。

4.1 文件共享到本地盘,pod消失后,文件保存到本地

apiVersion: v1
kind: Pod
metadata:
  name: hostpath-pod
spec:
  containers:
  - name: test-container
    image: reg.westos.org/k8s/nginx
    volumeMounts:
    - mountPath: /test-pd
      name: myhostpath
  volumes:
  - name: myhostpath
    hostPath:
      path: /data                     //主机节点文件系统目录
      type: DirectoryOrCreate        //hostpath类型

查看pod调度节点是否创建目录
kubernetes(k8s):volumes 配置管理(emptyDir、hostPath、nfs方式挂载卷)_第4张图片kubernetes(k8s):volumes 配置管理(emptyDir、hostPath、nfs方式挂载卷)_第5张图片
Pod内挂载点创建文件,成功同步之调度节点端本地目录中
kubernetes(k8s):volumes 配置管理(emptyDir、hostPath、nfs方式挂载卷)_第6张图片kubernetes(k8s):volumes 配置管理(emptyDir、hostPath、nfs方式挂载卷)_第7张图片

5.Pod内直接挂载nfs服务器的共享目录

(1)配置安装NFS服务

server4上配置nfs
kubernetes(k8s):volumes 配置管理(emptyDir、hostPath、nfs方式挂载卷)_第8张图片

[root@server4]#yum install -y nfs-utils
[root@server4]#mkdir /nfsdata
[root@server4]#cd /nfsdata
[root@server4 /nfsdata]#cat /etc/exports
/nfs 	*(rw,no_root_squash)
[root@server4 /nfsdata]#systemctl enable --now rpcbind
[root@server4 /nfsdata]#systemctl enable --now nfs
[root@server4 /nfsdata]#systemctl start nfs
[root@server4 /nfsdata]#showmount -e
Export list for server1:
/nfs *

(2)将镜像nginx中的默认发布目录挂载到了/nfsdata目录中
实现了两个目录中数据的同步

apiVersion: v1
kind: Pod
metadata:
  name: nfs-pd
spec:
  containers:
  - name: test-container
    image: reg.westos.org/k8s/nginx
    volumeMounts:
    - mountPath: /usr/share/nginx/html
      name: test-volume
  volumes:
  - name: test-volume
    nfs:
      server: 172.25.254.4
      path: /nfsdata

kubernetes(k8s):volumes 配置管理(emptyDir、hostPath、nfs方式挂载卷)_第9张图片kubernetes(k8s):volumes 配置管理(emptyDir、hostPath、nfs方式挂载卷)_第10张图片kubernetes(k8s):volumes 配置管理(emptyDir、hostPath、nfs方式挂载卷)_第11张图片kubernetes(k8s):volumes 配置管理(emptyDir、hostPath、nfs方式挂载卷)_第12张图片kubernetes(k8s):volumes 配置管理(emptyDir、hostPath、nfs方式挂载卷)_第13张图片kubernetes(k8s):volumes 配置管理(emptyDir、hostPath、nfs方式挂载卷)_第14张图片完全实现了nfs服务器端和pod内数据的同步更新。

你可能感兴趣的:(kubernetes)