「KUBERNETES-OBJECTS」- StorageClass, PersistentVolumeClaim

认识

Storage Class
针对管理员来说,定义各种所需的存储类,而不再需要参与 PV 的创建。
针对开发人员来说,Storage Class 可以抽象存储类型,并方便开发人员直接使用 PVC,而无需关心存储本身。

组成

on Minnikube

在 minikube 中,存在默认的存储类,该存储类定义了一个默认的 PV provisioner,这意味这当 PVC 创建时,k8s 会为 PVC 自动创建一个相应的 PV。

查看 minikube 的默认存储类:kubectl get storageclass,该存储类使用的存储 provisioner 会创建 hostPath 类型的 PV。

直接定义一个 PVC,然后使用 kubectl get pv 命令查看自动创建的 PV。因此,即使 Pod 死亡,或者被删除,数据依旧会保存下来。

性质

常用参数解释(parameters)

nfs-client-provisioner 源码分析 · Kubernetes 学习笔记
Persistent Volumes | Kubernetes
Storage Classes | Kubernetes

reclaimPolicy

Retain,将进行保留,后面能够重新使用。

Delete,仅进行删除。而 archiveOnDelete 能够控制在删除时是进行归档还是实际删除;

archiveOnDelete

字面意思为“删除时是否存档”:

1)false,表示不存档,即删除数据,

2)true,表示存档,即重命名路径。默认值。表明需要删除时存档,即将 oldPath 重命名,命名格式为 oldPath 前面增加 archived- 的前缀;

云商存储类文档

Dynamically Provisioning Persistent Storage on GKE

Alibaba Cloud | Storage Class | https://help.aliyun.com/zh/ack/serverless-kubernetes/user-guide/storageclasses

针对阿里云存储类特性,请参考官方文档,我们这里仅作简单记录。

申请云盘时,请遵循如下容量限制:高效云盘:最小 20 GiB。SSD 云盘:最小 20 GiB。ESSD 云盘:最小 20 GiB。

云盘不支持跨可用区使用,为非共享存储,且只能同时被一个 Pod 挂载。

使用云盘静态存储卷:所谓静态是指在阿里云控制台通过 Web 界面创建的 PV 并绑定 PVC。

使用云盘动态存储卷:通过 StorageClass 实现 PV 的动态分配。

云盘存储类:
适用于单可用区集群:
alibaba-disk-auto:ESSD AutoPL 云盘

alicloud-disk-efficiency:高效云盘

alicloud-disk-ssd:SSD 云盘

alicloud-disk-essd:ESSD 云盘
适用于多可用区集群:
  • alicloud-disk-topology:使用延迟绑定的方式创建云盘。
    • 延迟绑定与 Pod 的首次创建有关。如果先分配 PV,但是 Pod 被强制调度到其他可用区,则会出现 Pod 与 PV 可用区不同的问题,进而会的导致挂载失败。所以,通过该存储类,等确定 Pod 所在之后再分配存储,以规避问题。
    • 如果 Pod 已创建,那么每次 Pod 调度时,不要调度在存储所在的可用区,也不需要延迟绑定。
  • alicloud-disk-topology-alltype:依次尝试创建指定的存储类型,并且使用 WaitForFirstConsumer 模式,可以兼容多可用区集群。

Huawei Cloud | Storage Class |

指定存储类型:或通过 PVC everest.io/disk-volume-type: SAS 注解,或创建 StorageClass 增加该注解。

应用

1)参考 StorageClass + PersistentVolumeClaim 笔记,获取驱动配置示例。

2)在 PVC 中,使用存储类来自动分配存储:

cat > storageclass-testing.yaml <<EOF
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: test-claim
spec:
  storageClassName: nfs-client
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Mi
---
apiVersion: v1
kind: Pod
metadata:
  name: task-pv-pod
spec:
  volumes:
  - name: task-pv-storage
    persistentVolumeClaim:
      claimName: test-claim
  initContainers:
  - name: touch-file
    image: busybox
    command: ["touch", "/srv/pv-test/test-file.txt"]
    volumeMounts:
    - mountPath: "/srv/pv-test/"
      name: task-pv-storage
  containers:
  - name: busybox
    image: busybox
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']
    volumeMounts:
    - mountPath: "/srv/pv-test/"
      name: task-pv-storage
EOF

kubectl apply -f storageclass-testing.yaml

# 检查 NFS 存储是否存在 test-file.txt 文件