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

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 可以共享此存储。


http://www.kler.cn/a/619583.html

相关文章:

  • 小程序API —— 55页面处理函数 -上拉加载
  • MySQL基础语法DDLDML
  • 本地化智能运维助手:基于 LangChain 数据增强 和 DeepSeek-R1 的K8s运维文档检索与问答系统 Demo
  • Android设计模式之模板方法模式
  • 在 Unreal Engine 5 中制作类似《鬼泣5》这样的游戏时,角色在空中无法落地的问题可能由多种原因引起。
  • 3.26前端模拟面试
  • [Java微服务架构]4_服务通信之客户端负载均衡
  • 人工智能数据分析Python常用库 05 seaborn、pandas库绘图
  • 探究 CSS 如何在HTML中工作
  • 双非一本Java方向,学完感觉Java技术含量不高,考研换方向如何选择?
  • Rust Web开发新选择:探索轻量级框架Hyperlane的高效实践
  • 基于Java与Go的下一代DDoS防御体系构建实战
  • 在 i.MX8MP 上用 C++ 调用豆包 AI 大模型实现图像问答
  • 计算机网络复习(第二天)
  • 关于伽马变换小记
  • Kafka中的消息是如何存储的?
  • 汽车方向盘开关功能测试的技术解析
  • 人工智能与软件工程结合的发展趋势
  • VScode配置默认终端为Anaconda Prompt
  • Scala 基础语法