k8s存储介绍(三)valume概述与emptydir
目录
一、Kubernetes 中的 Volume 详解
基本概念
Volume 的主要类型(这里简单介绍,后续章节会详细介绍)
1. 本地存储类型
2. 网络存储类型
3. 云提供商存储
4. 特殊用途类型
PersistentVolume (PV) 和 PersistentVolumeClaim (PVC)
StorageClass
Volume 使用示例
Volume 的生命周期
二、Kubernetes 中的 emptyDir 卷详解
基本概念
关键特性
创建 emptyDir 卷
配置选项
使用内存作为存储介质的示例
典型使用场景
工作原理
内存介质 (tmpfs) 的特殊说明
大小限制 (sizeLimit)
示例:多容器共享 emptyDir
优缺点分析
优点
缺点
最佳实践
一、Kubernetes 中的 Volume 详解
Volume(卷)是 Kubernetes 中用于持久化存储的核心概念,它解决了容器文件系统临时性的问题。下面我将详细介绍 Kubernetes 中的 Volume。
基本概念
Volume 是 Pod 中能够被多个容器访问的共享目录,它与 Pod 的生命周期相同,但比其中的任何容器都持久。当容器重启时,Volume 中的数据会保留。
Volume 的主要类型(这里简单介绍,后续章节会详细介绍)
1. 本地存储类型
-
emptyDir: 临时目录,随 Pod 创建而创建,删除而删除
-
用途:容器间共享文件、临时缓存等
-
示例:
volumes: - name: shared-data emptyDir: {}
-
-
hostPath: 将主机节点上的文件或目录挂载到 Pod 中
-
用途:访问主机系统文件、开发测试环境等
-
示例:
volumes: - name: host-path-volume hostPath: path: /data type: Directory
-
2. 网络存储类型
-
NFS: 网络文件系统
-
示例:
volumes: - name: nfs-volume nfs: server: nfs-server.example.com path: /share
-
-
iSCSI: iSCSI 存储设备
-
GlusterFS: 分布式文件系统
-
CephFS: Ceph 文件系统
-
FC (Fibre Channel): 光纤通道存储
3. 云提供商存储
-
awsElasticBlockStore: AWS EBS 卷
-
azureDisk: Azure 磁盘
-
azureFile: Azure 文件存储
-
gcePersistentDisk: GCE 持久化磁盘
4. 特殊用途类型
-
secret: 用于将敏感信息(如密码)挂载到 Pod
-
示例:
volumes: - name: secret-volume secret: secretName: my-secret
-
-
configMap: 将配置数据挂载到 Pod
-
downwardAPI: 使 Pod 和容器的元数据可用作文件
-
persistentVolumeClaim: 使用持久卷声明(PVC)来动态提供存储
PersistentVolume (PV) 和 PersistentVolumeClaim (PVC)
这是 Kubernetes 中更高级的持久化存储方案:
-
PersistentVolume (PV): 集群中的存储资源,由管理员配置
-
PersistentVolumeClaim (PVC): 用户对存储的请求,类似于 Pod 消耗节点资源的方式
示例 PV:
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-volume
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: slow
nfs:
server: nfs-server.example.com
path: /exports
示例 PVC:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-claim
spec:
storageClassName: slow
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 3Gi
StorageClass
StorageClass 允许管理员描述他们提供的存储"类",可以动态配置 PV:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
fsType: ext4
Volume 使用示例
在 Pod 中使用 Volume 的完整示例:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mycontainer
image: nginx
volumeMounts:
- name: myvol
mountPath: /usr/share/nginx/html
volumes:
- name: myvol
persistentVolumeClaim:
claimName: pvc-claim
Volume 的生命周期
-
配置 - 管理员创建 PV 或 StorageClass
-
绑定 - 用户创建 PVC,系统将其绑定到合适的 PV
-
使用 - Pod 通过 PVC 使用 PV
-
释放 - 用户删除 PVC
-
回收 - 根据 PV 的回收策略(Retain/Delete/Recycle)处理
二、Kubernetes 中的 emptyDir 卷详解
emptyDir 是 Kubernetes 中最简单的 Volume 类型之一,它为 Pod 中的容器提供了一个临时的工作目录。下面我将全面介绍 emptyDir 的特性、用途和工作原理。
基本概念
emptyDir 是一个临时目录,它在 Pod 被分配到节点时创建,并随着 Pod 从节点上删除而被清除。它的生命周期与 Pod 的生命周期完全一致。
关键特性
-
临时性存储:数据不会持久化,Pod 删除后数据丢失
-
节点绑定:存储在 Pod 运行的节点本地
-
容器共享:可被 Pod 内的所有容器访问
-
初始为空:创建时目录为空,因此得名 emptyDir
创建 emptyDir 卷
在 Pod 定义中创建 emptyDir 的基本语法:
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: nginx
name: nginx-container
volumeMounts:
- mountPath: /cache
name: cache-volume
volumes:
- name: cache-volume
emptyDir: {}
配置选项
emptyDir 支持两个可选参数:
-
medium:存储介质类型
-
默认:"" (节点默认存储介质,通常是磁盘)
-
Memory
:使用 RAM 作为存储介质 (tmpfs)
-
-
sizeLimit:卷的大小限制
-
默认:nil (无限制)
-
示例:
sizeLimit: 500Mi
-
使用内存作为存储介质的示例
volumes:
- name: ram-volume
emptyDir:
medium: Memory
sizeLimit: 256Mi
典型使用场景
-
临时工作空间:作为应用程序的临时工作目录
-
容器间共享数据:同一 Pod 中多个容器共享文件
-
缓存数据:存储不需要持久化的缓存数据
-
检查点数据:保存应用程序的检查点数据以便从崩溃中恢复
-
日志收集:存储日志文件直到日志收集器处理它们
工作原理
-
创建时机:当 Pod 被分配到节点上时,kubelet 会在节点上创建一个空目录
-
挂载过程:该目录被挂载到 Pod 中指定的容器路径
-
生命周期:
-
Pod 删除 → 目录被删除
-
容器崩溃/重启 → 目录和数据保留
-
Pod 被调度到新节点 → 在新节点上创建新空目录
-
-
存储位置:通常位于节点的
/var/lib/kubelet/pods/<pod-uid>/volumes/kubernetes.io~empty-dir/
目录下
内存介质 (tmpfs) 的特殊说明
当设置 medium: Memory
时:
-
数据存储在 RAM 中而不是磁盘上
-
读写速度极快
-
节点重启会导致数据丢失
-
受限于节点内存资源
-
计入容器的内存使用量
大小限制 (sizeLimit)
-
当设置 sizeLimit 时,kubelet 会监控目录的空间使用
-
如果超过限制,Pod 可能会被驱逐 (Evicted)
-
对于内存介质,限制的是内存使用量
-
对于磁盘介质,限制的是磁盘使用量
示例:多容器共享 emptyDir
apiVersion: v1
kind: Pod
metadata:
name: shared-volumes
spec:
containers:
- name: writer
image: alpine
command: ["/bin/sh", "-c"]
args:
- while true; do
echo "$(date)" >> /data/log;
sleep 1;
done
volumeMounts:
- name: shared-data
mountPath: /data
- name: reader
image: alpine
command: ["/bin/sh", "-c"]
args:
- tail -f /data/log
volumeMounts:
- name: shared-data
mountPath: /data
volumes:
- name: shared-data
emptyDir: {}
优缺点分析
优点
-
简单易用,无需额外配置
-
访问速度快,特别是使用内存介质时
-
适合临时数据存储需求
-
同一 Pod 中容器间共享数据的便捷方式
缺点
-
数据不持久,Pod 删除后数据丢失
-
不适合存储重要数据
-
节点故障会导致数据丢失
-
内存介质受限于节点可用内存
最佳实践
-
仅用于临时数据:不要用它存储需要持久化的数据
-
合理设置大小限制:特别是使用内存介质时
-
考虑性能需求:对IO要求高的临时数据可使用内存介质
-
监控使用情况:避免占用过多节点资源
-
清理敏感数据:应用应负责清理敏感临时数据
emptyDir 是 Kubernetes 中轻量级的临时存储解决方案,理解它的特性和限制有助于在合适的场景中有效使用它。