关于k8s:从PVC使用率看k8s-监控控制平面指标稳定性规范KEP

9次阅读

共计 2775 个字符,预计需要花费 7 分钟才能阅读完成。

前言

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 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,应从代码库中删除指标
正文完
 0