Kubernetes 存储概述
学习目标
- 理解 Kubernetes 为什么需要存储管理
- 掌握 Kubernetes 存储体系的整体架构
- 了解各类存储方案的适用场景
核心概念
容器存储的问题
容器默认行为:
┌──────────────┐
│ Pod │
│ ┌────────┐ │
│ │ 容器 │ │ ← 写入的数据在容器重启后丢失
│ │ /data │ │
│ └────────┘ │
└──────────────┘
问题:
1. 容器重启 → 数据丢失
2. Pod 调度到其他节点 → 数据丢失
3. 多容器需要共享数据 → 无法实现
Kubernetes 存储体系
┌─────────────────────────────────────────────────┐
│ Kubernetes 存储体系 │
│ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ StorageClass │ │ Volume │ │
│ │ 存储类 │ │ 卷 │ │
│ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ 动态供给 │ │ 静态供给 │ │
│ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │
│ └─────────┬─────────┘ │
│ ▼ │
│ ┌──────────────┐ │
│ │ PVC │ │
│ │ 存储声明 │ │
│ └──────┬───────┘ │
│ ▼ │
│ ┌──────────────┐ │
│ │ Pod │ │
│ └──────────────┘ │
└─────────────────────────────────────────────────┘
核心组件
| 组件 | 说明 | 作用 |
|---|---|---|
| Volume | 卷 | Pod 级别的存储抽象 |
| PersistentVolume (PV) | 持久卷 | 集群级别的存储资源 |
| PersistentVolumeClaim (PVC) | 持久卷声明 | 用户对存储的请求 |
| StorageClass | 存储类 | 定义存储的类型和供给方式 |
存储类型
| 类型 | 说明 | 生命周期 | 示例 |
|---|---|---|---|
| 临时卷 | 随 Pod 创建/销毁 | Pod | emptyDir, 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:场景分析
为以下场景选择合适的存储方案:
- Nginx 的静态文件(只读配置)
- MySQL 数据库(需要持久化)
- 多个 Pod 共享的日志目录
- 临时缓存数据
练习 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 + 节点亲和
小结
| 要点 | 说明 |
|---|---|
| 核心问题 | 容器数据不持久 |
| Volume | Pod 级别存储,生命周期跟随 Pod |
| PV + PVC | 集群级别持久存储,生命周期独立 |
| StorageClass | 定义存储类型,支持动态供给 |
| 选型原则 | 按需选择:临时 vs 持久、本地 vs 网络 |
练习编辑器
bash
Loading...