在说剩余两种负载之前我们来说说K8s的持久化存储。在 Kubernetes 集群中,Pod 作为应用运行的载体具有临时性——Pod 重启、删除或调度到其他节点时,容器内的本地数据会彻底丢失。对于 MySQL、Redis 等需要持久化数据的应用,必须通过持久化存储将数据脱离 Pod 生命周期独立保存。本文将从核心概念入手,详解 EmptyDir、HostPath、NFS、PV/PVC 及 StorageClass 等主流存储方案的原理与实战配置。
一、K8s 持久化存储核心概念
在展开具体方案前,需要明确K8s存储体系的几个关键接口与组件,它们是实现持久化的基础:
-
CSI(Container Storage Interface):容器存储接口,标准化存储插件的接入方式(如 Ceph、GlusterFS 通过 CSI 与 K8s 集成);
-
CNI(Container Network Interface):容器网络接口,虽不直接关联存储,但负责 Pod 网络通信,确保存储访问的网络可达;
-
CRI(Container Runtime Interface):容器运行时接口,定义容器运行时(如 Docker、Containerd)与 K8s 的交互标准,存储卷挂载需依赖 CRI 协调;
-
Volume(存储卷):K8s 中抽象的存储单元,可挂载到 Pod 内的一个或多个容器,数据存储在 Volume 而非容器本地,实现数据与容器解耦。
二、主流持久化存储方案实战
K8s 支持多种 Volume 类型,不同类型适用于不同场景。以下按 “临时存储→节点级存储→共享存储→自动化存储” 的逻辑,逐一讲解核心方案。
1. EmptyDir:Pod 级临时存储
EmptyDir 是最简单的 Volume 类型,生命周期与 Pod 完全绑定——Pod 被调度到节点时自动创建,Pod 删除时数据永久删除,适用于临时数据存储(如容器间共享临时文件、应用缓存)。
1.1 核心特性
-
无需提前创建存储目录,K8s 自动在节点的
/var/lib/kubelet/pods/<Pod-UID>/volumes/kubernetes.io~empty-dir/路径生成目录; -
支持同一 Pod 内多个容器共享数据;
-
数据仅存于节点本地,Pod 调度到其他节点后,原数据无法访问。
1.2 实战配置
创建一个挂载 EmptyDir 的 Nginx Pod,将临时目录 /cache 挂载到容器内:
# emptydir.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-empty
spec:
containers:
- name: container-empty
image: nginx:latest
volumeMounts: # 容器内挂载配置
- mountPath: /cache # 容器内挂载路径
name: cache-volume # 关联下面的 Volume 名称
volumes: # 定义 Volume
- name: cache-volume # Volume 名称(需与上面一致)
emptyDir: {} # 类型为 EmptyDir
1.3 验证
- 创建 Pod 并查看调度节点:
kubectl apply -f emptydir.yaml
kubectl get pods -o wide pod-empty # 假设调度到节点 hd2
2.查看节点上的 EmptyDir 实际路径(需登录节点 hd2):
# 先获取 Pod 的 UID
kubectl get pods pod-empty -o yaml | grep uid
# 查看实际目录(替换 <Pod-UID> 为真实值)
ls /var/lib/kubelet/pods/<Pod-UID>/volumes/kubernetes.io~empty-dir/cache-volume/
2. HostPath:节点级持久存储
HostPath 直接挂载节点本地的目录或文件到 Pod,数据存储在节点磁盘上,Pod 删除后数据仍保留在节点中。适用于单节点场景(如测试环境、节点级日志存储),但不支持跨节点共享。
2.1 核心特性
- 数据生命周期与节点绑定,Pod 重新调度到其他节点后无法访问原数据;
- 支持预创建目录(
Directory)、自动创建目录(DirectoryOrCreate)等类型; - 同一节点上的多个 Pod 可通过 HostPath 共享节点本地数据。
2.2 实战配置
创建一个挂载 HostPath 的 Pod,同时运行 Nginx 和 Tomcat 容器,共享节点的 /data1 目录:
# hostpath.yaml
apiVersion: v1
kind: Pod
metadata:
name: test-hostpath
spec:
containers:
# Nginx 容器
- name: test-nginx
image: nginx:latest
volumeMounts:
- mountPath: /test-nginx # Nginx 容器内挂载路径
name: test-volume
# Tomcat 容器
- name: test-tomcat
image: tomcat:8.5-jre8-alpine
volumeMounts:
- mountPath: /test-tomcat # Tomcat 容器内挂载路径
name: test-volume
# 定义 HostPath Volume
volumes:
-

最低0.47元/天 解锁文章
90

被折叠的 条评论
为什么被折叠?



