Kubernetes教程FG062-Kubernetes存储类(StorageClass)配置与实战
内容简介
本篇文章主要介绍Kubernetes中存储类(StorageClass)的配置与使用方法。风哥教程参考Kubernetes官方文档存储相关内容,结合生产环境实际操作场景,详细讲解StorageClass的配置方法、动态存储供应以及最佳实践。
目录大纲
Part01-基础概念与理论知识
1.1 存储类概述
存储类(StorageClass)是Kubernetes中用于定义存储类型的资源,它可以:
- 定义存储类型:指定存储的类型、性能和特性
- 动态创建存储:根据PVC的需求自动创建PV
- 管理存储生命周期:控制存储的创建、使用和删除
1.2 动态存储供应
动态存储供应是指根据PVC的需求自动创建PV的过程,它的优点包括,风哥提示:。
- 自动化:无需手动创建PV
- 灵活性:根据实际需求创建存储
- 标准化:通过StorageClass统一管理存储配置
Part02-生产环境规划与建议
2.1 存储类设计原则
,风哥提示:。
- 分层设计:根据性能和成本创建多个存储类
- 标准化命名:使用清晰、一致的命名规则
- 默认存储类:设置一个默认存储类,方便用户使用
- 参数优化:根据存储后端的特性优化参数配置
2.2 存储类类型选择
- 高性能存储类:
- 适用场景:数据库、缓存等对性能要求高的应用
- 存储后端:SSD、NVMe等
- 特点:高IOPS、低延迟
- 标准存储类:
- 适用场景:一般应用、中间件等
- 存储后端:SAS、混合存储等
- 特点:平衡性能和成本
- 大容量存储类:
- 适用场景:日志、备份等大容量存储需求
- 存储后端:SATA、对象存储等
- 特点:大容量、低成本
Part03-生产环境项目实施方案
3.1 StorageClass配置
配置基于NFS的StorageClass:
安装NFS Provisioner
# 添加Helm仓库
[root@fgedu-master ~]# helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
[root@fgedu-master ~]# helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
# 部署NFS Provisioner
[root@fgedu-master ~]# helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
–namespace monitoring \
–set nfs.server=192.168.1.100 \
–set nfs.path=/Kubernetes/nfs/data \
–set storageClass.name=nfs-storage \
–set storageClass.defaultClass=true
[root@fgedu-master ~]# helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
–namespace monitoring \
–set nfs.server=192.168.1.100 \
–set nfs.path=/Kubernetes/nfs/data \
–set storageClass.name=nfs-storage \
–set storageClass.defaultClass=true
NAME: nfs-subdir-external-provisioner
LAST DEPLOYED: 2023-07-01 12:00:00.000000000 +0000 UTC
NAMESPACE: monitoring
STATUS: deployed
REVISION: 1
LAST DEPLOYED: 2023-07-01 12:00:00.000000000 +0000 UTC
NAMESPACE: monitoring
STATUS: deployed
REVISION: 1
查看StorageClass
# 查看StorageClass,学习交流加群风哥微信: itpux-com。
[root@fgedu-master ~]# kubectl get storageclass
[root@fgedu-master ~]# kubectl get storageclass
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGEnfs-storage cluster.local/nfs-subdir-external-provisioner Delete Immediate true 1m
3.2 动态存储供应配置
配置基于iSCSI的StorageClass。
创建iSCSI StorageClass
# 创建iSCSI StorageClass配置文件
[root@fgedu-master ~]# cat > storageclass-iscsi.yaml << EOF apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: iscsi-storage provisioner: kubernetes.io/iscsi parameters: targetPortal: 192.168.1.101:3260 iqn: iqn.2023-07.com.fgedu:iscsi lun: 0 fsType: ext4 readOnly: "false" reclaimPolicy: Delete allowVolumeExpansion: true volumeBindingMode: Immediate EOF
[root@fgedu-master ~]# cat > storageclass-iscsi.yaml << EOF apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: iscsi-storage provisioner: kubernetes.io/iscsi parameters: targetPortal: 192.168.1.101:3260 iqn: iqn.2023-07.com.fgedu:iscsi lun: 0 fsType: ext4 readOnly: "false" reclaimPolicy: Delete allowVolumeExpansion: true volumeBindingMode: Immediate EOF
# 应用StorageClass配置
[root@fgedu-master ~]# kubectl apply -f storageclass-iscsi.yaml
[root@fgedu-master ~]# kubectl apply -f storageclass-iscsi.yaml
storageclass.storage.k8s.io/iscsi-storage created
3.3 StorageClass使用
使用StorageClass创建PVC。
创建使用默认StorageClass的PVC
# 创建PVC配置文件
[root@fgedu-master ~]# cat > pvc-default.yaml << EOF apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-default namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 5Gi EOF
[root@fgedu-master ~]# cat > pvc-default.yaml << EOF apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-default namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 5Gi EOF
# 应用PVC配置
[root@fgedu-master ~]# kubectl apply -f pvc-default.yaml
[root@fgedu-master ~]# kubectl apply -f pvc-default.yaml
,学习交流加群风哥QQ113257174。
persistentvolumeclaim/pvc-default created
persistentvolumeclaim/pvc-default created
创建使用指定StorageClass的PVC
# 创建PVC配置文件[root@fgedu-master ~]# cat > pvc-iscsi.yaml << EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-iscsi
namespace: default
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: iscsi-storage
EOF
# 应用PVC配置
[root@fgedu-master ~]# kubectl apply -f pvc-iscsi.yaml
[root@fgedu-master ~]# kubectl apply -f pvc-iscsi.yaml
persistentvolumeclaim/pvc-iscsi created
查看PVC状态
# 查看PVC状态
[root@fgedu-master ~]# kubectl get pvc
[root@fgedu-master ~]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc-default Bound pvc-12345678-1234-1234-1234-1234567890ab 5Gi RWX nfs-storage 1m
pvc-iscsi Bound pvc-87654321-4321-4321-4321-ba0987654321 10Gi RWO iscsi-storage 1m
pvc-default Bound pvc-12345678-1234-1234-1234-1234567890ab 5Gi RWX nfs-storage 1m
pvc-iscsi Bound pvc-87654321-4321-4321-4321-ba0987654321 10Gi RWO iscsi-storage 1m
Part04-生产案例与实战讲解
4.1 企业级存储类部署
某企业需要部署企业级的存储类方案,支持多种存储类型和应用场景。
案例背景
- 应用场景:
- 数据库:需要高性能存储
- 文件服务:需要共享存储
- 日志存储:需要大容量存储
- 存储后端:
- 高性能存储:NVMe SSD
- 标准存储:SAS HDD
- 大容量存储:SATA HDD
部署方案
,更多视频教程www.fgedu.net.cn。
# 1. 部署不同类型的存储类
# 高性能存储类
cat > storageclass-high-performance.yaml << EOF apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: high-performance provisioner: kubernetes.io/iscsi parameters: targetPortal: 192.168.1.101:3260 iqn: iqn.2023-07.com.fgedu:high-performance lun: 0 fsType: ext4 readOnly: "false" reclaimPolicy: Delete allowVolumeExpansion: true volumeBindingMode: Immediate EOF # 标准存储类 cat > storageclass-standard.yaml << EOF apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: standard provisioner: kubernetes.io/iscsi parameters: targetPortal: 192.168.1.102:3260 iqn: iqn.2023-07.com.fgedu:standard lun: 0 fsType: ext4 readOnly: "false" reclaimPolicy: Delete allowVolumeExpansion: true volumeBindingMode: Immediate EOF # 大容量存储类 cat > storageclass-bulk.yaml << EOF apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: bulk provisioner: cluster.local/nfs-subdir-external-provisioner parameters: pathPattern: {.PVC.namespace}/{.PVC.name} onDelete: delete reclaimPolicy: Delete allowVolumeExpansion: true volumeBindingMode: Immediate EOF # 应用存储类配置 kubectl apply -f storageclass-high-performance.yaml kubectl apply -f storageclass-standard.yaml kubectl apply -f storageclass-bulk.yaml # 2. 设置默认存储类 kubectl patch storageclass standard -p '{"metadata":{"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}' # 3. 为不同应用创建PVC # 数据库PVC cat > pvc-database.yaml << EOF apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-database namespace: fgedu-production spec: accessModes: - ReadWriteOnce,更多学习教程公众号风哥教程itpux_com。 resources: requests: storage: 100Gi storageClassName: high-performance EOF # 文件服务PVC cat > pvc-file-service.yaml << EOF apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-file-service namespace: fgedu-production spec: accessModes: - ReadWriteMany resources: requests: storage: 50Gi storageClassName: standard EOF # 日志存储PVC cat > pvc-logs.yaml << EOF apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-logs namespace: fgedu-production spec: accessModes: - ReadWriteMany resources: requests: storage: 200Gi storageClassName: bulk EOF # 应用PVC配置 kubectl apply -f pvc-database.yaml kubectl apply -f pvc-file-service.yaml kubectl apply -f pvc-logs.yaml
# 高性能存储类
cat > storageclass-high-performance.yaml << EOF apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: high-performance provisioner: kubernetes.io/iscsi parameters: targetPortal: 192.168.1.101:3260 iqn: iqn.2023-07.com.fgedu:high-performance lun: 0 fsType: ext4 readOnly: "false" reclaimPolicy: Delete allowVolumeExpansion: true volumeBindingMode: Immediate EOF # 标准存储类 cat > storageclass-standard.yaml << EOF apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: standard provisioner: kubernetes.io/iscsi parameters: targetPortal: 192.168.1.102:3260 iqn: iqn.2023-07.com.fgedu:standard lun: 0 fsType: ext4 readOnly: "false" reclaimPolicy: Delete allowVolumeExpansion: true volumeBindingMode: Immediate EOF # 大容量存储类 cat > storageclass-bulk.yaml << EOF apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: bulk provisioner: cluster.local/nfs-subdir-external-provisioner parameters: pathPattern: {.PVC.namespace}/{.PVC.name} onDelete: delete reclaimPolicy: Delete allowVolumeExpansion: true volumeBindingMode: Immediate EOF # 应用存储类配置 kubectl apply -f storageclass-high-performance.yaml kubectl apply -f storageclass-standard.yaml kubectl apply -f storageclass-bulk.yaml # 2. 设置默认存储类 kubectl patch storageclass standard -p '{"metadata":{"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}' # 3. 为不同应用创建PVC # 数据库PVC cat > pvc-database.yaml << EOF apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-database namespace: fgedu-production spec: accessModes: - ReadWriteOnce,更多学习教程公众号风哥教程itpux_com。 resources: requests: storage: 100Gi storageClassName: high-performance EOF # 文件服务PVC cat > pvc-file-service.yaml << EOF apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-file-service namespace: fgedu-production spec: accessModes: - ReadWriteMany resources: requests: storage: 50Gi storageClassName: standard EOF # 日志存储PVC cat > pvc-logs.yaml << EOF apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-logs namespace: fgedu-production spec: accessModes: - ReadWriteMany resources: requests: storage: 200Gi storageClassName: bulk EOF # 应用PVC配置 kubectl apply -f pvc-database.yaml kubectl apply -f pvc-file-service.yaml kubectl apply -f pvc-logs.yaml
4.2 多存储类型管理实战
某企业需要在Kubernetes集群中管理多种存储类型,满足不同应用的需求。。
案例背景
- 集群规模:50个节点
- 应用数量:20个微服务
- 存储需求:
- 10个应用需要高性能存储
- 5个应用需要标准存储
- 5个应用需要大容量存储
管理方案
# 1. 监控存储使用情况
[root@fgedu-master ~]# kubectl get pvc –all-namespaces
[root@fgedu-master ~]# kubectl get pvc –all-namespaces
NAMESPACE NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
fgedu-production pvc-database Bound pvc-12345678-1234-1234-1234-1234567890ab 100Gi RWO high-performance 1d。
fgedu-production pvc-file-service Bound pvc-87654321-4321-4321-4321-ba0987654321 50Gi RWX standard 1d,from K8S+DB视频:www.itpux.com。
fgedu-production pvc-logs Bound pvc-abcdef12-3456-7890-abcd-ef1234567890 200Gi RWX bulk 1d
fgedu-production pvc-database Bound pvc-12345678-1234-1234-1234-1234567890ab 100Gi RWO high-performance 1d。
fgedu-production pvc-file-service Bound pvc-87654321-4321-4321-4321-ba0987654321 50Gi RWX standard 1d,from K8S+DB视频:www.itpux.com。
fgedu-production pvc-logs Bound pvc-abcdef12-3456-7890-abcd-ef1234567890 200Gi RWX bulk 1d
# 2. 扩展现有的PVC
[root@fgedu-master ~]# kubectl patch pvc pvc-database -n fgedu-production -p ‘{“spec”:{“resources”:{“requests”:{“storage”:”200Gi”}}}}’
[root@fgedu-master ~]# kubectl patch pvc pvc-database -n fgedu-production -p ‘{“spec”:{“resources”:{“requests”:{“storage”:”200Gi”}}}}’
persistentvolumeclaim/pvc-database patched
# 3. 清理不需要的PVC
[root@fgedu-master ~]# kubectl delete pvc pvc-old -n fgedu-production
[root@fgedu-master ~]# kubectl delete pvc pvc-old -n fgedu-production
Part05-风哥经验总结与分享
5.1 存储类配置最佳实践
- 合理规划存储类:根据应用需求创建不同级别的存储类
- 设置默认存储类:方便用户使用,减少配置复杂度
- 启用卷扩展:设置allowVolumeExpansion为true,支持PVC扩容
- 选择合适的绑定模式:
- Immediate:立即绑定
- WaitForFirstConsumer:等待第一个Pod调度后绑定
- 配置合适的回收策略:
- Delete:删除PVC时自动删除PV
- Retain:保留PV,需要手动清理
- Recycle:回收PV(已废弃)
- 监控存储使用:定期监控存储使用情况,及时扩容
- 备份存储数据:无论使用哪种存储类,都应定期备份数据
5.2 常见问题与解决方案
问题 原因 解决方案
StorageClass创建失败 配置错误 检查StorageClass配置
PVC创建后一直处于Pending状态 存储后端不可用 检查存储服务器状态
PVC扩容失败 存储类不支持扩容 设置allowVolumeExpansion为true
存储性能问题 存储类选择不当 选择更适合的存储类
存储容量不足 初始容量规划不足 及时扩容或清理数据
StorageClass创建失败 配置错误 检查StorageClass配置
PVC创建后一直处于Pending状态 存储后端不可用 检查存储服务器状态
PVC扩容失败 存储类不支持扩容 设置allowVolumeExpansion为true
存储性能问题 存储类选择不当 选择更适合的存储类
存储容量不足 初始容量规划不足 及时扩容或清理数据
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
