4

前言

kubernetes家大业大,监控纷繁复杂,感兴趣的小伙伴可以看看我之前写的文章从容器监控kube-stats-metrics看k8s众多组件

k8s中pv使用率监控

说明

  • 虽然k8s最擅长的是无状态的pod,不建议有状态的存储型pod上
  • 但是总有些使用场景需要,比如statefulset使用的pv
  • 那么pv的使用率监控就非常有必要了

我们可以使用 kubelet_volume_stats_used_bytes/kubelet_volume_stats_capacity_bytes表征pod pv使用率
image.png

另外一种pv监控方式

  • 如果采用云硬盘可以到对应的存储节点监控fs使用挂载情况
  • 可以轻松得到一个fs的使用情况
  • 然后根据k8s接口获取到pod和pv的映射关系向prometheus打点

kubelet_volume_stats*采集原理追踪

kubelet 启动 initializeModules--> fsResourceAnalyzer定时更新 podvolumestats --> updateCachedPodVolumeStats--> s.statsProvider.GetPods(从apiserver中获取的pod信息缓存到本地cache中)-->然后启动 calcAndStoreStats获取volume信息-->最终调用 volume的getmetrics()获取,途径可能是du/statFs/csi

image.png

// Start eager background caching of volume stats.
func (s *fsResourceAnalyzer) Start() {
    s.startOnce.Do(func() {
        if s.calcPeriod <= 0 {
            klog.Info("Volume stats collection disabled.")
            return
        }
        klog.Info("Starting FS ResourceAnalyzer")
        go wait.Forever(func() { s.updateCachedPodVolumeStats() }, s.calcPeriod)
    })
}

// updateCachedPodVolumeStats calculates and caches the PodVolumeStats for every Pod known to the kubelet.
func (s *fsResourceAnalyzer) updateCachedPodVolumeStats() {
    oldCache := s.cachedVolumeStats.Load().(statCache)
    newCache := make(statCache)

    // Copy existing entries to new map, creating/starting new entries for pods missing from the cache
    for _, pod := range s.statsProvider.GetPods() {
        if value, found := oldCache[pod.GetUID()]; !found {
            newCache[pod.GetUID()] = newVolumeStatCalculator(s.statsProvider, s.calcPeriod, pod).StartOnce()
        } else {
            newCache[pod.GetUID()] = value
        }
    }

    // Stop entries for pods that have been deleted
    for uid, entry := range oldCache {
        if _, found := newCache[uid]; !found {
            entry.StopOnce()
        }
    }

    // Update the cache reference
    s.cachedVolumeStats.Store(newCache)
}

在k8s 1.17版本变化

发现 kubelet_volume_stats_used_bytes等指标已经不存在了(在aws上目前是这样的)

k8s 对于监控指标的规范化

背景

kubernetes-control-plane-metrics-stability说明

之前的指标定义
var someMetricDefinition = prometheus.CounterOpts{
    Name: "some_metric",
    Help: "some description",
}
新版中加入了StabilityLevel和DeprecatedVersion两个字段
var deprecatedMetricDefinition = kubemetrics.CounterOpts{
    Name: "some_deprecated_metric",
    Help: "some description",
    StabilityLevel: kubemetrics.STABLE, // this is also a custom metadata field
    DeprecatedVersion: "1.15", // this is a custom metadata field
}

弃用前:

# HELP some_counter this counts things
# TYPE some_counter counter
some_counter 0
弃用后:

# HELP some_counter (Deprecated since 1.15.0) this counts things
# TYPE some_counter counter
some_counter 0

metric生命周期

Alpha metric → Stable metric → Deprecated metric → Hidden metric → Deletion
Alpha→稳定→已弃用→隐藏→删除

说明

  • Alpha指标没有稳定性保证;因此,可以随时对其进行修改或删除。
  • 稳定的指标不会改变;具体而言:

    • 指标本身不会被删除(或重命名)
    • 指标的类型不会被修改

如何显示已过期的指标

启动kubelet时使用show-hidden-metrics-for-version=$version

以metric A为例,此处假定A在1.n 中已弃用。根据不推荐使用的指标,我们可以得出以下结论

  • 在release中1.n,该指标已弃用,并且默认情况下可以看到。
  • 在发行版中1.n+1,该指标默认情况下是隐藏的,并且可以通过命令行发出show-hidden-metrics-for-version=1.n
  • 在release中1.n+2,应从代码库中删除指标

在aws上的行为

https://github.com/kubernetes-sigs/aws-ebs-csi-driver/pull/524

  • 总的来说aws 的csi并没有实现 NodeGetVolumeStats to report volume metrics:

ning1875
167 声望67 粉丝

k8s/prometheus/cicd运维开发专家,想进阶的dy搜 小乙运维杂货铺