k8s 文件挂载

前言

一个运行中的容器,缺省情况下,对文件系统的写入,都是发生在其分层文件系统的可写层的,一旦容器运行结束,所有写入都会被丢弃。因此需要对持久化支持。Kubernetes 中通过 Volume 的方式提供对存储的支持。

1. PV、PVC 概念梳理

图解漫画,写的很好
PV和PVC的理解

2 k8s volumes 类型

2.1 文件挂载的四种方式

  1. configMap
  • 将想要挂载的文件内容在tpl中进行define (helm chart),然后载入到configmap.yaml文件中
  • 使用卷使用configmap,挂载的方式得到要执行的文件内容

格式为:

spec:
  containers:
  - name: 
    image: 
    volumeMounts:
    - name: nova-conf
      mountPath: /etc/nova/nova.conf
      subPath: nova.conf
  volumes:
  - name: nova-conf
    configMap:
      name: {{ tuple . "nova" |include "nova-name" }}-configmap

注意

1、mountPath会覆盖掉挂载路径下的所有文件,即删除所有文件,只保留挂载的文件
2、subpath只使用在configMap情况下,添加subpath时,表示不会覆盖掉原本的路径下的文件,subpath的值必须是configMap中data下的key值。
具体使用详解

  1. hostPath
  • 将node节点(主机)的本地文件挂载到容器中,比如实现本地时间的同步功能
  • 这种卷一般和DaemonSet搭配使用,用来操作主机文件,例如进行日志采集的 FLK 中的 FluentD 就采用这种方式,加载主机的容器日志目录,达到收集本主机所有日志的目的。
spec:
  containers:
  - name: httpd-deployment
    imagePullPolicy: IfNotPresent
    image: nginx:1.1.1
    volumeMounts:
    - name: host-root
      mountPath: /etc/nova/nova.conf
      subPath: nova.conf
  volumes:
  - name: host-root
    hostPath:
      path: /
      type: Directory

注意

1、hostPath不用subPath这一项,直接就是选择挂载的路径;不会覆盖原有文件夹下的文件
2、不提供pod的亲和性,即host path映射的目录在node1,而pod可能被调度到node2,导致原来的在node1的数据不存在,pod一直无法启动起来;
3、能够提供pv/pvc/storage class的方式使用;
4、数据能持久化。

  1. gitRepo
  • 可以挂载git性质的文件或者目录
apiVersion: v1
kind: Pod
metadata:
  name: gitrepo-volume-pod
spec:
  containers:
  - image: nginx:alpine
    name: web-server
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
      readOnly: true
    ports:
    - containerPort: 80
      protocol: TCP
  volumes:
  - name: html
    gitRepo:
      repository: https://github.com/luksa/kubia-website-example.git
      revision: master
      directory: .
  1. emptyDir
  • 顾名思义,EmptyDir是一个空目录,他的生命周期和所属的 Pod 是完全一致的,可能读者会奇怪,那还要他做什么?EmptyDir的用处是,可以在同一 Pod 内的不同容器之间共享工作过程中产生的文件(类似于共享内存,但这里默认是共享吃磁盘空间的,看下面2)。
  • 缺省情况下,EmptyDir 是使用主机磁盘进行存储的(共享磁盘空间),也可以设置emptyDir.medium 字段的值为Memory,来提高运行速度(共享内存的方式),但是这种设置,对该卷的占用会消耗容器的内存份额。
apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
  - image: busybox
    name: test-emptydir
    command: [ "sleep", "3600" ]
    volumeMounts:
    - mountPath: /data
      name: data-volume
  volumes:
  - name: data-volume
    emptyDir: {}

注意:

1.需要使用内存作为emptyDir的可用存储资源也是可以的,只需要在创建emptyDir卷时增加一个emptyDir.medium字段的定义,并赋值为"Memory"即可;

2.在使用tmpfs文件系统作为emptyDir的存储后端时,如果遇到node节点重启,则emptyDir中的数据也会全部丢失。同时,你编写的任何文件也都将计入Container的内存使用限制,即empty dir方式保存的数据不能持久化。

2.2 挂载到 nfs

看这里

参考

kubernetes学习总结之文件挂载
k8s-volume类型

posted @   MeiyangLi  阅读(9861)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示