61·存储进阶

Kubernetes 存储概述

kubernetesstoragevolumeconcept

Kubernetes 存储概述

学习目标

  1. 理解 Kubernetes 为什么需要存储管理
  2. 掌握 Kubernetes 存储体系的整体架构
  3. 了解各类存储方案的适用场景

核心概念

容器存储的问题

容器默认行为:
┌──────────────┐
│   Pod        │
│   ┌────────┐ │
│   │ 容器   │ │  ← 写入的数据在容器重启后丢失
│   │ /data  │ │
│   └────────┘ │
└──────────────┘

问题:
1. 容器重启 → 数据丢失
2. Pod 调度到其他节点 → 数据丢失
3. 多容器需要共享数据 → 无法实现

Kubernetes 存储体系

┌─────────────────────────────────────────────────┐
│                Kubernetes 存储体系               │
│                                                  │
│  ┌──────────────┐    ┌──────────────┐           │
│  │ StorageClass │    │   Volume     │           │
│  │  存储类      │    │   卷         │           │
│  └──────┬───────┘    └──────┬───────┘           │
│         │                   │                    │
│         ▼                   ▼                    │
│  ┌──────────────┐    ┌──────────────┐           │
│  │   动态供给   │    │   静态供给   │           │
│  └──────┬───────┘    └──────┬───────┘           │
│         │                   │                    │
│         └─────────┬─────────┘                    │
│                   ▼                              │
│         ┌──────────────┐                        │
│         │     PVC      │                        │
│         │  存储声明    │                        │
│         └──────┬───────┘                        │
│                ▼                                 │
│         ┌──────────────┐                        │
│         │     Pod      │                        │
│         └──────────────┘                        │
└─────────────────────────────────────────────────┘

核心组件

组件说明作用
VolumePod 级别的存储抽象
PersistentVolume (PV)持久卷集群级别的存储资源
PersistentVolumeClaim (PVC)持久卷声明用户对存储的请求
StorageClass存储类定义存储的类型和供给方式

存储类型

类型说明生命周期示例
临时卷随 Pod 创建/销毁PodemptyDir, configMap
持久卷独立于 Pod 生命周期手动/自动管理PV + PVC
网络存储跨节点共享集群NFS, Ceph, Cloud

Volume 类型一览

本地存储:
├── emptyDir      - 临时目录,Pod 删除即丢
├── hostPath      - 映射宿主机目录
└── local         - 本地持久卷(需节点亲和)

网络存储:
├── nfs           - NFS 共享
├── cephfs        - Ceph 文件系统
├── rbd           - Ceph 块设备
└── iscsi         - iSCSI 存储

云存储:
├── awsElasticBlockStore - AWS EBS
├── gcePersistentDisk    - GCP PD
├── azureDisk            - Azure Disk
└── azureFile            - Azure File

配置/密钥:
├── configMap     - 配置文件
├── secret        - 敏感数据
└── projected     - 聚合多个卷源

存储决策流程

需要存储?
│
├─ 数据是否需要持久化?
│  ├─ 否 → emptyDir(缓存、临时文件)
│  └─ 是 ↓
│
├─ 是否需要跨节点共享?
│  ├─ 否 → hostPath / local PV
│  └─ 是 → 网络存储 (NFS / Ceph / 云存储)
│
├─ 是否需要动态供给?
│  ├─ 是 → StorageClass + PVC
│  └─ 否 → 手动创建 PV + PVC
│
└─ 完成

实践练习

练习 1:理解存储层次

画出以下关系图:

  • StorageClass → PV → PVC → Pod
  • 标注每个组件的职责

练习 2:场景分析

为以下场景选择合适的存储方案:

  1. Nginx 的静态文件(只读配置)
  2. MySQL 数据库(需要持久化)
  3. 多个 Pod 共享的日志目录
  4. 临时缓存数据

练习 3:查看集群存储

# 查看可用的存储类
kubectl get storageclass

# 查看已创建的 PV
kubectl get pv

# 查看 PVC
kubectl get pvc --all-namespaces

常见误解

1. Volume 不等于持久化

emptyDir 是 Volume,但 Pod 删除后数据就没了
只有 PV + PVC 才能保证数据持久化

2. hostPath 不适合生产环境

hostPath 绑定特定节点,Pod 调度到其他节点就无法访问
生产环境应使用网络存储或 local PV + 节点亲和

小结

要点说明
核心问题容器数据不持久
VolumePod 级别存储,生命周期跟随 Pod
PV + PVC集群级别持久存储,生命周期独立
StorageClass定义存储类型,支持动态供给
选型原则按需选择:临时 vs 持久、本地 vs 网络

练习编辑器

bash
Loading...

继续学习

完成本课后,建议继续学习下一课「PersistentVolume」 以巩固所学知识。