kubectl top数据链路追踪

Step1 . kubectl top node 或 kubectl top pod

kubectl top 向 APIServer 的 Metrics API 发起请求,即:
kubectl get --raw /apis/metrics.k8s.io/v1beta1/nodes/xxxx
kubectl get --raw /apis/metrics.k8s.io/v1beta1/namespaces/xxxx/pods/xxxx

Step2 . Aggregation 根据API service "metrics.k8s.io"的定义转发给后端svc:metrics-server

kubectl get apiservices v1beta1.metrics.k8s.io

Step3 . Metrics-server 获取最近一次的指标数据返回。

Step4. Metrics-server 会每分钟从 kubelet 获取 node 和 pod 的数据

1、从 kubelet 暴露的 endpoint 收集数据转换成 k8s API 格式,暴露给Metrics API.
//目前基础监控使用的是 metrics-server 版本是 v0.5.1

注:metrics-server老版本使用 /stats/summary 从 kubelet拉取数据,v0.6.0+ 使用 metrics/resource 从kubelet拉取
curl 127.0.0.1:10250/stats/summary?only_cpu_and_memory=true
v0.6.0+: curl 127.0.0.1:10250/metrics/resource

2、Metrics-server本身不做数据采集,不做永久存储,相当于是将kubelet的数据做转换。

3、kubelet的在cadvisor采集数据的基础上做了计算汇总,提供 container+pod+node 级别的 cgroup 数据
metrics-server 每分钟请求 /metrics/resource 或 /stats/summary?only_cpu_and_memory=true 时,kubelet 通过 pkg/kubelet/server/server.go 文件处理请求,kubelet 会调用 cadvisor的库获取 node pod container 对应的 cgroup信息,之后整理返回给 kubelet。

node的 cgroup根路径:“/” 表示 /sys/fs/cgroup/
memory = /sys/fs/cgroup/memory/ cpu = /sys/fs/cgroup/cpu/ …
node的 memory的 limit信息通过读取文件 /sys/fs/cgroup/memory/(memory.max)或(memory.limit_in_bytes)获取
availableBytes = memory limit - workingset

pod的 cgroup路径:
container的 cgroup路径:

获取pod 和 container的数据时,会遍历根目录下(包括子目录)的所有容器,通过路径名识别pod、container和容器所属pod,返回pod和 container信息,最后返回pod 的信息时会将自己的容器 []ContainerStats信息包含进去

metrics-server 从 kubelet获取到的数据
cpu:
UsageNanoCores -> kubectl top时显示的值,每秒使用的cpu核心数
UsageCoreNanoSeconds
mem:
“availableBytes”: 1296015360, -> info.Spec.Memory.Limit - cstat.Memory.WorkingSet(kubelet 计算的)
“usageBytes”: 3079581696,
“workingSetBytes”: 2592722944, -> kubectl top时显示的值,每秒使用的cpu核心数 (cadvisor 计算的)
“rssBytes”: 1459187712,
“pageFaults”: 9776943,
“majorPageFaults”: 1782

Step5: cAdvisor定期向cgroup采集数据,并将处理过的信息存储在 manager的 memoryCache

cpu:
1、cadvisor从 cgroup获取到的cpu数据 Usage、CFS、Schedstat、LoadAverage
2、经过kubelet 计算之后,UsageNanoCores、UsageCoreNanoSeconds

mem:
1、cadvisor 从 cgroup 获取到的数据 Usage、MaxUsage、Cache、RSS、Swap、MappedFile、WorkingSet、Failcnt、ContainerData、HierarchicalData
2、经过kubelet 计算之后,availableBytes、usageBytes、workingSetBytes、rssBytes、pageFaults、majorPageFaults

注意:
cgroup没有working_set信息,cadvisor计算workingset时,用Usage - total_inactive_file,之后保存在memoryCache中,因为 cgroup只暴露了 *cgroups.Stats 中的数据,需要计算转换为 *info.ContainerStats 并存在 manager的memoryCache中

Step6: 在Node/Pod/container对应的Cgroup目录查看指标文件中的数据。(以memory为例)

#cd /sys/fs/cgroup/memory 是 cgroup的 memory子系统

/sys/fs/cgroup/memory 下有 system.slice、user.slice、kubepods
system.slice:这个 cgroup 通常包含系统服务和守护进程
user.slice:这个 cgroup 用于管理用户会话和用户启动的进程
kubepods:这个 cgroup 专门用于 Kubernetes 节点上的 Pod 和容器

1、节点的cgroup:/sys/fs/cgroup/memory

获取pod uid: kubectl get pod -n xxxx xxxxx -oyaml |grep Uid -i -B10
获取containerid: kubectl describe pod -n xxxx xxxxx |grep id -i
2、pod的cgroup:
/sys/fs/cgroup/memory/kubepods/burstable/pod

3、container 的cgroup:
/sys/fs/cgroup/memory/kubepods/burstable/pod/

除上述这些,还有很多用于统计信息、限制资源、进程id等信息的文件

另:

可以通过访问 kubelet的 /metrics/cadvisor接口获取一些指标,仅提供contianer + machine(machine级别数据直接读取/proc文件内容,只有几个数据)数据,不做计算pod/node等指标。
curl http://127.0.0.1:10250/metrics/cadvisor
kubectl get --raw /api/v1/nodes/192.168.0.43/proxy/metrics/cadvisor

参考:
1、kubernetes/pkg/kubelet源码
2、metrics-server源码
3、https://cloud.tencent.com/developer/article/2180278
4、http://www.xuyasong.com/?p=1781
5、https://blog.csdn.net/qq_53609683/article/details/126001459?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522169795141716800227481687%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=169795141716800227481687&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_ecpm_v1~rank_v31_ecpm-1-126001459-null-null.nonecase&utm_term=cadvisor&spm=1018.2226.3001.4450

你可能感兴趣的:(kubernetes,linux,docker,cadvisor,cgroup,metrics-server)