前言
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使用率
另外一种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
// 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等指标曾经不存在了
k8s 对于监控指标的规范化
背景
- 指标稳定性始终是社区继续关注的问题
- Kubernetes控制面板中的指标不稳固(有些不太精确?)
- k8s某些指标常常在版本更新中变动: 一个具体的例子请看我之前写的文章中pod和pod_name的变动promethues系列之:追踪k8s容器指标的打tag的流程
- 为了解决这个问题k8s社区提出这个KEP详情请看这个KEP
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 countersome_counter 0弃用后:# HELP some_counter (Deprecated since 1.15.0) this counts things# TYPE some_counter countersome_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,应从代码库中删除指标