【每日一个云原生小技巧 #17】Volume 和 Persistent Volume

2023-11-07 13:51:57 浏览数 (2)

在 Kubernetes 中,Volume 和 Persistent Volume 是与数据存储和管理相关的两个重要概念。

Volume

Volume 是一个属于 Pod 的存储单元,它可以被 Pod 中的容器所共享。Kubernetes Volume 的生命周期与 Pod 相同,当 Pod 被删除时,Volume 通常也会一同被清除。Volumes 支持多种数据源,包括本地存储、公共云存储服务等。

使用场景:

  • 共享数据,例如在一个多容器的 Pod 中
  • 保存临时数据,以便在重启容器时可以使用
  • 当你不需要持久化数据存储时

Persistent Volume (PV) 和 Persistent Volume Claim (PVC)

PV 是集群中的一块存储,其生命周期独立于任何单独的 Pod。这允许数据持久化,即使使用它的 Pod 不再存在。PVC 是对存储资源的请求,用户不需要了解后端存储的复杂性。它们让用户能以一种抽象的方式使用持久存储。

使用场景:

  • 持久化存储,保证关键数据在 Pod 重启后依然存在
  • 当应用程序需要稳定的存储时,比如数据库

使用技巧

  1. 理解不同类型的 Volumes:
    • 根据需要持久化数据或者是仅在 Pod 生命周期内使用数据,选择合适的 Volume 类型。
  2. 合理分配资源:
    • 在创建 PV 时,你需要指定存储大小。合理预估和请求所需的存储量。
  3. 配置访问模式:
    • PV 支持不同的访问模式,如 ReadWriteOnce、ReadOnlyMany 和 ReadWriteMany。选择适合你应用的访问模式。
  4. 数据备份:
    • 即使是持久化数据,也需要考虑备份策略,防止意外情况导致数据丢失。
  5. 使用 StorageClass:
    • 利用 StorageClass 动态创建 PV。可以预定义不同的存储类型(如 SSD、HDD)和配置,根据需要动态创建 PV。
  6. 安全性:
    • 对敏感数据加密,并确保只有授权的 Pod 可以访问相关的 PVC。

使用案例

假设我们有一个需要运行 MySQL 数据库的应用程序,数据库需要持久化存储来保存数据。

PersistentVolume (PV) 示例:

代码语言:javascript复制
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"

在这个配置中,我们创建了一个名为 mysql-pv 的持久卷,存储类型被设置为 manual,表示这是一个手动预先配置的存储类别,大小为 5Gi,并且指定访问模式为 ReadWriteOnce,表示该卷只能被一个节点以读写方式挂载。

PersistentVolumeClaim (PVC) 示例:

代码语言:javascript复制
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

此 PVC mysql-pvc 请求与 PV 匹配的存储类别和大小,也设置为 ReadWriteOnce 访问模式。

Pod 使用 PVC 示例:

代码语言:javascript复制
apiVersion: v1
kind: Pod
metadata:
  name: mysql-pod
spec:
  containers:
  - name: mysql
    image: mysql:5.7
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: "yourpassword"
    - name: MYSQL_DATABASE
      value:

 "mydatabase"
    volumes:
    - name: mysql-storage
      persistentVolumeClaim:
        claimName: mysql-pvc
  volumeMounts:
  - mountPath: /var/lib/mysql
    name: mysql-storage

在这个 Pod 配置中,我们将 mysql-pvc 挂载到了 MySQL 容器的 /var/lib/mysql 目录。这样,MySQL 中的数据就会被存储在 PV 上,并且即使 Pod 被删除,数据也会得到保留。

0 人点赞