前言
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等指标已经不存在了(在aws上目前是这样的)
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 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:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。