k8s-7:Volumes(1)中的临时卷与持久卷(PV,PVC,SC)及NFS配置

1. Volumes配置管理

  • 容器中的文件在磁盘上是临时存放的,这给容器中运行的特殊应用程序带来一些问题。首先,当容器崩溃时,kubelet将重新启动容器,容器中的文件将会丢失,因为容器会以干净的状态重建。其次,当在一个Pod中运行多个容器时,常常需要在这些容器之间共享文件。Kubernetes抽象出Volume对象来解决这两个问题
  • Kubernetes卷具有明确的生命周期,与包裹它的Pod相同。因此,卷比Pod中运行的任何容器的存活周期都长,在容器重新启动时数据也会得到保留。当然,当一个Pod不再存在时,卷也将不再存在。也许更重要的是,Kubernetes可以支持许多类型的卷,Pod也能同时使用任意数量的卷
  • 卷不能挂载到其他卷,也不能与其他卷有硬链接。Pod中的每个容器必须独立地指定每个卷的挂载位置。

2. 临时卷

2.1 emptyDir卷

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

使用场景:

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

默认情况下,emptyDir卷存储在支持该节点所使用的介质上;这里的介质可以是磁盘或ssd或网络存储,这取决于环境。也可以使用内存,速度虽然快,但是节点重启时就会被清楚,并且写入的所有文件都会计入容器的内存消耗,受容器内存限制约束。

此处新建一个pod,包含两个容器,两个容器均挂载了相同的卷,只不过各自内部挂载目录不同。

vim emptydir.yaml

apiVersion: v1
kind: Pod
metadata:
  name: vol1
spec:
  containers:
  - image: busyboxplus
    name: vm1
    stdin: true
    tty: true
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  - name: vm2
    image: myapp:v1
    volumeMounts:
    - mountPath: /usr/share/nginx/html
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir:
      medium: Memory
      sizeLimit: 100Mi

启动后可看到两容器均成功挂载:
请添加图片描述
进入busybox容器内部:kubectl attach vol1 -c vm1 -it
可以看到Pod内部各容器共享Pod的IP地址
请添加图片描述
请添加图片描述

busybox本身不带任何其他功能,在共享目录中写入文件后,解析本地回环地址可看到内容:
请添加图片描述
这说明,共享目录挂载至vm2的mapp上的发布页时,自动的将首页内容通过80端口发布出去,所以能解析到,pod外部也可解析到:
请添加图片描述
文件大小超过限制后,不会立马被驱逐,过一段时即(1-2min)才会被kubelet evict掉。这是由于kubelet时定期检查,所以会有时间差。

emptydir缺点:

  • 不能及时禁止用户使用内存,虽然kubelet evict会延迟1-2min,但是该延迟时间内,对node的风险较大
  • 影响kubernetes调度,因为empty dir并不涉及node的resources,这样会造成Pod使用node内存,但是调度器并知道
  • 用户不能及时感知内存不足

2.2 HostPath卷

hostpath卷能将主机节点文件系统上的文件或目录挂载到Pod中,虽然这不是大多数pod需要的,但是可以为一些应用程序提供强大的应急保障

hostPath的一些用法:

  • 运行一个需要访问Dokcer引擎内部机制的容器,挂载/var/lib/docker路径(挂载的是主机路径)
  • 在容器中运行cAdvisor(google的一个监控应用)时,以hostPath方式挂载/sys
  • 允许Pod指定给定的hostPath在运行Pod之前是否应该存在,是否应该建立以及应该以什么方式存在
    请添加图片描述

需要小心的地方:

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

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: myapp:v1
    name: vm1
    volumeMounts:
    - mountPath: /usr/share/nginx/html
      name: test-volume
  volumes:
  - name: test-volume
    hostPath:
      # 宿主上目录位置
      path: /webdata
      # 此字段为可选
      type: DirectoryOrCreate

此时,解析该pod IP会403,
请添加图片描述
已知在node节点,也就是server3上挂载

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值