[CKAD] 我的数据很宝贵!持久卷(PV/PVC)和临时卷(emptyDir)的完美整理

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


📑 目录

  1. 概述:为什么需要卷? (无状态 vs 有状态)
  2. 临时卷的代名词:emptyDir
  3. 持久数据的核心:PV(Persistent Volume)和PVC(Claim)
  4. 动态供给的魔力:StorageClass
  5. CKAD实战技巧:卷设置时常犯的错误
  6. 动手实践:实战练习题

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实战技巧:节省时间和防止错误 ⏱️

考试中的卷问题通常涉及许多配置,容易出现拼写错误。

  1. 两处都填写: 必须在spec.volumes中定义卷,并且必须在容器内的spec.containers.volumeMounts中进行连接。如果缺少任何一个,Pod将无法从ContainerCreating状态继续。
  2. AccessMode一致: PV和PVC的accessModes必须相互匹配才能进行绑定(Binding)。
  3. 快速生成YAML: 卷设置很难完全通过命令行完成。提取一个基本的Pod YAML,然后手动输入卷部分。

5. 动手实践:实战练习题 🛠️

场景:

  1. 创建一个名为safedata-pvc的PVC。(容量:1Gi,模式:ReadWriteOnce,StorageClass:standard)
  2. 使用nginx镜像创建一个名为data-app的Pod。
  3. 将创建的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考试和提升实战能力大有帮助!🌟


Comments

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注