Kubernetes 持久化存储:核心方案与实战指南

在说剩余两种负载之前我们来说说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 验证
  1. 创建 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:
  - 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值