大家好!今天,我们将探讨Kubernetes应用程序开发人员必须掌握的一个重要概念——卷(Volume)。Kubernetes的Pod是一个随时可能死亡并重新启动的“临时”存在。那么,存储在其中的数据会怎样呢?让我们在15分钟内掌握如何在Pod死亡后也能保存数据,以及如何高效管理临时数据的方法!

📑 目录
- 概述:为什么需要卷? (无状态 vs 有状态)
- 临时卷的代名词:emptyDir
- 持久数据的核心:PV(Persistent Volume)和PVC(Claim)
- 动态供给的魔力:StorageClass
- CKAD实战技巧:卷设置时常犯的错误
- 动手实践:实战练习题
0. 概述:为什么需要卷? 🤔
Kubernetes Pod内的容器本质上是**短暂的(Ephemeral)**。如果容器崩溃并重新启动,在运行期间创建的所有文件都将消失。
- 临时卷: 仅在Pod运行期间需要数据持久化的情况(例如:缓存、临时空间)。当Pod被删除时,数据也会随之删除。
- 持久卷: 即使Pod被删除,数据也必须安全地保存在集群外部(云存储、NFS等)的情况(例如:数据库、用户上传文件)。
1. 临时卷的代名词:emptyDir 🧹
emptyDir在Pod被分配到节点时首次创建,并且仅在该Pod在该节点上运行时存在。
- 特点: Pod内的所有容器都可以共享。常用于一个容器写入、另一个容器读取的“Sidecar”模式。
- 注意: 如果Pod从节点中移除(删除),emptyDir中的数据也将永久删除。
💡 emptyDir YAML示例
apiVersion: v1
kind: Pod
metadata:
name: sidecar-pod
spec:
containers:
- name: main-container
image: nginx
volumeMounts:
- name: shared-data
mountPath: /usr/share/nginx/html
- name: helper-container
image: busybox
command: ["/bin/sh", "-c", "while true; do date >> /data/index.html; sleep 5; done"]
volumeMounts:
- name: shared-data
mountPath: /data
volumes:
- name: shared-data
emptyDir: {} # 在这里设置!
2. 持久数据的核心:PV和PVC 💾
在大型企业环境或生产环境中,数据保存是必不可少的。为此,Kubernetes使用两种资源:PV(Persistent Volume)和PVC(Persistent Volume Claim)。
- PV (Persistent Volume): 定义实际的存储空间(SSD、NFS等)。它就像基础设施管理员预先准备好的“实际管道”。
- PVC (Persistent Volume Claim): 这是开发人员请求“我需要这么大容量的存储空间!”的“订单”。
💡 核心参数:AccessModes
- ReadWriteOnce (RWO): 只能从一个节点进行读写。
- ReadOnlyMany (ROX): 可以从多个节点只读。
- ReadWriteMany (RWX): 可以从多个节点同时读写(NFS等支持)。
3. 动态供给的魔力:StorageClass ✨
每次管理员都预先创建PV效率低下。因此,在实际工作中(特别是在大型企业或云环境中),会使用StorageClass。
当开发人员在PVC中指定特定的storageClassName并发出请求时,Kubernetes会向云提供商(AWS、GCP、Azure等)请求实时创建PV。这被称为**动态供给(Dynamic Provisioning)**。
4. CKAD实战技巧:节省时间和防止错误 ⏱️
考试中的卷问题通常涉及许多配置,容易出现拼写错误。
- 两处都填写: 必须在spec.volumes中定义卷,并且必须在容器内的spec.containers.volumeMounts中进行连接。如果缺少任何一个,Pod将无法从ContainerCreating状态继续。
- AccessMode一致: PV和PVC的accessModes必须相互匹配才能进行绑定(Binding)。
- 快速生成YAML: 卷设置很难完全通过命令行完成。提取一个基本的Pod YAML,然后手动输入卷部分。
5. 动手实践:实战练习题 🛠️
场景:
- 创建一个名为safedata-pvc的PVC。(容量:1Gi,模式:ReadWriteOnce,StorageClass:standard)
- 使用nginx镜像创建一个名为data-app的Pod。
- 将创建的PVC挂载到Pod的/var/www/html路径。
[解答指南]
# 1. 创建 PVC (pvc.yaml)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: safedata-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: standard
---
# 2. 创建 Pod (pod.yaml)
apiVersion: v1
kind: Pod
metadata:
name: data-app
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: storage-vol
mountPath: /var/www/html
volumes:
- name: storage-vol
persistentVolumeClaim:
claimName: safedata-pvc
总结 🏁
卷是Kubernetes架构中最酷的功能之一,它“将基础设施的复杂性从开发人员那里隐藏起来”。使用emptyDir创建高效的协作Pod,并使用PV/PVC构建安全的数据存储。
希望今天学习的内容能对您通过CKAD考试和提升实战能力大有帮助!🌟
发表回复