weibaohui/kom存储管理:StorageClass默认设置与统计
概述
在Kubernetes集群管理中,存储管理是至关重要的一环。StorageClass作为持久化存储的核心抽象,决定了如何动态提供持久卷(Persistent Volume)。weibaohui/kom项目提供了强大的StorageClass管理功能,包括默认存储类设置、PVC/PV数量统计等实用功能,极大简化了存储资源的管理工作。
StorageClass核心功能解析
1. PVC数量统计
kom通过PVCCount()方法提供精确的PVC统计功能,能够快速获取指定StorageClass关联的PVC数量:
func (s *storageClass) PVCCount() (int, error) {
var pvcList []*v1.PersistentVolumeClaim
err := s.kubectl.newInstance().
WithContext(s.kubectl.Statement.Context).
WithCache(s.kubectl.Statement.CacheTTL).
Resource(&v1.PersistentVolumeClaim{}).
AllNamespace().
Where("spec.storageClassName=? ", s.kubectl.Statement.Name).
RemoveManagedFields().
List(&pvcList).Error
if err != nil {
return 0, err
}
return len(pvcList), nil
}
功能特点:
- 支持全命名空间搜索
- 基于StorageClass名称精确过滤
- 缓存机制提升查询性能
- 自动移除管理字段减少数据冗余
2. PV数量统计
PVCount()方法提供PV资源的统计能力:
func (s *storageClass) PVCount() (int, error) {
var pvList []*v1.PersistentVolume
err := s.kubectl.newInstance().
WithContext(s.kubectl.Statement.Context).
WithCache(s.kubectl.Statement.CacheTTL).
Resource(&v1.PersistentVolume{}).
Where("spec.storageClassName=? ", s.kubectl.Statement.Name).
RemoveManagedFields().
List(&pvList).Error
if err != nil {
return 0, err
}
return len(pvList), nil
}
统计维度对比:
| 统计类型 | 资源对象 | 命名空间范围 | 过滤条件 |
|---|---|---|---|
| PVC统计 | PersistentVolumeClaim | 全命名空间 | storageClassName |
| PV统计 | PersistentVolume | 集群级别 | storageClassName |
3. 默认存储类设置
SetDefault()方法实现了智能的默认存储类管理:
func (s *storageClass) SetDefault() error {
var scList []*storagev1.StorageClass
err := s.kubectl.newInstance().
WithContext(s.kubectl.Statement.Context).
Resource(&storagev1.StorageClass{}).
List(&scList).Error
// ... 详细实现逻辑
}
默认设置算法流程:
实战应用示例
基础统计操作
package example
import (
"testing"
"github.com/weibaohui/kom/kom"
v1 "k8s.io/api/storage/v1"
)
func TestStorageClassPVCCount(t *testing.T) {
scName := "standard"
count, err := kom.DefaultCluster().Resource(&v1.StorageClass{}).Name(scName).
Ctl().StorageClass().PVCCount()
if err != nil {
t.Logf("获取StorageClass PVC数量错误 %v", err)
}
t.Logf("PVC数量 %d\n", count)
}
func TestStorageClassPVCount(t *testing.T) {
scName := "standard"
count, err := kom.DefaultCluster().Resource(&v1.StorageClass{}).Name(scName).
Ctl().StorageClass().PVCount()
if err != nil {
t.Logf("获取StorageClass PV数量错误 %v", err)
}
t.Logf("PV数量 %d\n", count)
}
默认存储类管理
func TestStorageClassSetDefault(t *testing.T) {
scName := "hostpath"
err := kom.DefaultCluster().Resource(&v1.StorageClass{}).Name(scName).
Ctl().StorageClass().SetDefault()
if err != nil {
t.Logf("设置StorageClass为默认错误 %v", err)
}
}
高级使用场景
1. 存储容量规划
通过定期统计PVC和PV数量,可以实现存储容量预测和规划:
// 存储使用趋势分析
func analyzeStorageTrend(scName string) {
pvcCount, _ := kom.DefaultCluster().Resource(&v1.StorageClass{}).Name(scName).
Ctl().StorageClass().PVCCount()
pvCount, _ := kom.DefaultCluster().Resource(&v1.StorageClass{}).Name(scName).
Ctl().StorageClass().PVCount()
// 计算使用率和分析趋势
utilization := float64(pvcCount) / float64(pvCount) * 100
fmt.Printf("StorageClass %s 使用率: %.2f%%\n", scName, utilization)
}
2. 多集群存储管理
kom支持多集群环境下的统一存储管理:
// 跨集群存储统计
func multiClusterStorageReport() {
clusters := []string{"cluster1", "cluster2", "cluster3"}
for _, cluster := range clusters {
pvcCount, _ := kom.Cluster(cluster).Resource(&v1.StorageClass{}).Name("standard").
Ctl().StorageClass().PVCCount()
fmt.Printf("集群 %s: %d个PVC\n", cluster, pvcCount)
}
}
性能优化建议
1. 缓存策略优化
// 使用缓存提升统计性能
count, err := kom.DefaultCluster().
Resource(&v1.StorageClass{}).
Name("standard").
WithCache(30 * time.Second). // 30秒缓存
Ctl().StorageClass().PVCCount()
2. 批量操作处理
对于大规模集群,建议采用分页查询和批量处理:
// 分页统计大规模PVC
func batchPVCCount(scName string) (int, error) {
var totalCount int
pageSize := 100
for offset := 0; ; offset += pageSize {
var pvcList []*v1.PersistentVolumeClaim
err := kom.DefaultCluster().
Resource(&v1.PersistentVolumeClaim{}).
AllNamespace().
Where("spec.storageClassName=?", scName).
Limit(pageSize).Offset(offset).
List(&pvcList).Error
if err != nil || len(pvcList) == 0 {
break
}
totalCount += len(pvcList)
}
return totalCount, nil
}
错误处理与监控
1. 完善的错误处理机制
kom提供了详细的错误信息和日志记录:
func safeStorageOperation(scName string) {
count, err := kom.DefaultCluster().
Resource(&v1.StorageClass{}).
Name(scName).
Ctl().StorageClass().PVCCount()
if err != nil {
if strings.Contains(err.Error(), "not found") {
fmt.Printf("StorageClass %s 不存在\n", scName)
} else if strings.Contains(err.Error(), "timeout") {
fmt.Printf("查询超时,请检查网络连接\n")
} else {
fmt.Printf("未知错误: %v\n", err)
}
return
}
fmt.Printf("当前PVC数量: %d\n", count)
}
2. 监控指标集成
可以将统计结果集成到监控系统中:
// Prometheus指标导出
func exportStorageMetrics() {
scNames := []string{"standard", "premium", "cold"}
for _, scName := range scNames {
pvcCount, _ := kom.DefaultCluster().
Resource(&v1.StorageClass{}).
Name(scName).
Ctl().StorageClass().PVCCount()
prometheus.GaugeSet(fmt.Sprintf("storage_pvc_count{storageclass=\"%s\"}", scName), float64(pvcCount))
}
}
总结
weibaohui/kom的StorageClass管理功能为Kubernetes存储管理提供了强大而灵活的工具集。通过PVCCount、PVCount和SetDefault三个核心方法,开发者可以:
- 精确统计:快速获取存储资源使用情况
- 智能管理:自动化默认存储类设置
- 性能优化:支持缓存和批量处理
- 错误恢复:完善的错误处理机制
- 监控集成:轻松对接监控系统
这些功能使得存储管理变得更加简单、高效和可靠,特别适合需要处理大规模存储资源的云原生环境。无论是日常运维还是容量规划,kom都能提供强有力的支持。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



