当前位置: 首页 > news >正文

k8s存储介绍(六)StorangeClass

一、Kubernetes 存储类(StorageClass)详解

1. 什么是 StorageClass?

在 Kubernetes 中,StorageClass(存储类)是一种用于动态创建 PersistentVolume(PV)的资源对象。它允许管理员根据不同的存储需求创建不同的存储策略,用户只需要声明 PersistentVolumeClaim(PVC)并指定 StorageClass,Kubernetes 就能自动分配相应的存储。

2. 为什么需要 StorageClass?

在没有 StorageClass 的情况下,管理员需要手动创建 PersistentVolume,并与 PersistentVolumeClaim 进行匹配。这种方式适用于静态存储,但在大规模集群或云环境下,动态创建存储更加灵活。因此,StorageClass 解决了以下问题:

  • 自动化存储分配:无需手动创建 PV,而是由 Kubernetes 负责创建和管理。

  • 支持不同的存储后端:适用于 AWS EBS、Google Persistent Disk、Azure Disk、NFS、Ceph 等多种存储方案。

  • 提供不同的存储策略:支持不同的存储性能(高 IOPS、低延迟)、快照、备份等需求。

3. StorageClass 的关键字段

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast-storage
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true
主要字段解析:
  • provisioner:指定存储供应商,例如 AWS EBS(kubernetes.io/aws-ebs)、Google Cloud Persistent Disk(kubernetes.io/gce-pd)等。

  • parameters:存储类的参数,例如磁盘类型、性能级别等。

  • reclaimPolicy(回收策略):定义存储释放后的行为。

    • Delete(删除):删除 PV 和底层存储。

    • Retain(保留):数据仍然保留,需要手动清理。

    • Recycle(回收):(已废弃)清理数据后重新使用。

  • volumeBindingMode(卷绑定模式):

    • Immediate(立即绑定):PVC 创建时立即绑定。

    • WaitForFirstConsumer(等待首个消费者):只有 Pod 使用 PVC 时才会绑定 PV,适用于多可用区调度。

  • allowVolumeExpansion(允许扩容):是否允许存储动态扩展。

4. 常见存储供应商

存储后端Provisioner适用场景
AWS EBSkubernetes.io/aws-ebsAWS 云环境,块存储
GCE PDkubernetes.io/gce-pdGCP 云存储
Azure Diskkubernetes.io/azure-diskAzure 云存储
NFSkubernetes.io/nfs共享存储
Cephceph.com/rbd分布式存储

5. PVC 使用 StorageClass 示例

创建 PVC 时使用 StorageClass
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: example-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: fast-storage
Pod 挂载 PVC 示例
apiVersion: v1
kind: Pod
metadata:
  name: example-pod
spec:
  containers:
    - name: app-container
      image: nginx
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: storage
  volumes:
    - name: storage
      persistentVolumeClaim:
        claimName: example-pvc

6. StorageClass 的应用场景

  1. 自动化存储管理:减少手动创建 PV 的复杂性,适用于云环境。

  2. 多种存储策略:支持不同的存储性能需求,如 SSD、高吞吐磁盘等。

  3. 多可用区支持:结合 WaitForFirstConsumer 模式,提高存储调度灵活性。

  4. 动态扩展存储:支持 PVC 扩容,提高存储弹性。

7. 总结

  • StorageClass 允许 Kubernetes 动态创建 PV,简化存储管理。

  • 适用于云存储、分布式存储和本地存储等多种场景。

  • 通过 reclaimPolicyvolumeBindingModeallowVolumeExpansion 提供灵活的存储策略。

  • 在 CI/CD、数据库存储、日志存储等场景下广泛应用。

二、在 Kubernetes 中使用 NFS 作为存储类(StorageClass)

1. 部署 NFS 服务器与客户端

在 Kubernetes 集群的某个节点上安装 NFS 服务器。(但是在每个节点都要安装NFS客户端)

安装 NFS 服务器(以 Ubuntu 为例)
sudo apt update && sudo apt install -y nfs-kernel-server
sudo mkdir -p /mnt/nfs-share
sudo chmod 777 /mnt/nfs-share
sudo echo "/mnt/nfs-share *(rw,sync,no_root_squash,no_subtree_check)" | sudo tee -a /etc/exports
sudo exportfs -rav
sudo systemctl restart nfs-kernel-server

安装 NFS 客户端

sudo apt update && sudo apt install -y nfs-common

2. 创建 NFS StorageClass

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-storage
provisioner: nfs-provisioner
parameters:
  archiveOnDelete: "false"

3. 部署 NFS Provisioner(Dynamic Provisioning)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-provisioner
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nfs-provisioner
  template:
    metadata:
      labels:
        app: nfs-provisioner
    spec:
      containers:
      - name: nfs-provisioner
        image: quay.io/external_storage/nfs-client-provisioner:latest
        volumeMounts:
        - mountPath: /persistentvolumes
          name: nfs-volume
        env:
        - name: NFS_SERVER
          value: "<NFS服务器IP>"
        - name: NFS_PATH
          value: "/mnt/nfs-share"
      volumes:
      - name: nfs-volume
        nfs:
          server: "<NFS服务器IP>"
          path: "/mnt/nfs-share"

4. 创建 PersistentVolumeClaim (PVC)

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi
  storageClassName: nfs-storage

5. 在 Pod 中挂载 PVC

apiVersion: v1
kind: Pod
metadata:
  name: nfs-pod
spec:
  containers:
  - name: app-container
    image: nginx
    volumeMounts:
    - mountPath: "/usr/share/nginx/html"
      name: nfs-storage
  volumes:
  - name: nfs-storage
    persistentVolumeClaim:
      claimName: nfs-pvc

6. 验证 NFS 挂载是否成功

kubectl apply -f nfs-storageclass.yaml
kubectl apply -f nfs-provisioner.yaml
kubectl apply -f nfs-pvc.yaml
kubectl apply -f nfs-pod.yaml
kubectl get pods
kubectl exec -it nfs-pod -- df -h

如果成功,Pod 内 /usr/share/nginx/html 目录将会挂载到 NFS 服务器的 /mnt/nfs-share,多个 Pod 可以共享此存储。

相关文章:

  • Redis :command not allowed when used memory
  • a, b = map(int, input().split()) 从用户输入中读取两个整数
  • 耘想Docker LinNAS,颠覆传统存储体验!
  • muduo库的思路梳理
  • 前端使用WPS WebOffice 做在线文档预览与编辑
  • Redux,React-redux。基础
  • 【脏读、不可重复读、幻读区别】
  • 云端陷阱:当免费午餐变成付费订阅,智能家居用户如何破局?
  • 【48】指针:函数的“数组入口”与“安全锁”——数组参数传递
  • 【Linux】嵌入式Web服务库:mongoose
  • pytorch与其他ai工具
  • 什么是异步编程,如何在 JavaScript 中实现?
  • 亚马逊多账号风控防护体系构建指南
  • 设计模式类型
  • Android 简化图片加载与显示——使用Coil和Kotlin封装高效工具类
  • 【更新至2023年】各省数字经济相关指标数据集(20个指标)
  • 最长公共子序列问题
  • Spring笔记02-bean的生命周期
  • 传统应用容器化迁移实践
  • 关于matlab和python谁快的问题
  • 广东省中医院脾胃病科大科主任张北平病逝,年仅52岁
  • 山东枣庄同一站点两名饿了么骑手先后猝死,当地热线:职能部门正调查
  • 体坛联播|郑钦文收获红土赛季首胜,国际乒联公布财报
  • 上汽享道出行完成13亿元C轮融资,已启动港股IPO计划
  • 城管给商户培训英语、政银企合作纾困,上海街镇这样优化营商环境
  • 百济首次实现季度营业利润扭亏,泽布替尼销售额近57亿元