前言
当把 k8s 升级到 高版本后,发现监控中有些指标都是空值,例如container_fs_usage_bytes和container_fs_limit_bytes无Pod label(其他container_fs可能也无)、container_network_tcp/udp 等都为0。
原因
一、container_fs是已知的cadivsor/kubelet没有完全适配containerd的问题,最新的cadvisor代码,对接containerd fs这块还没实现。
二、 container_network_{tcp,udp}不采集是因为 cadvisor中默认给关掉了网络等相关指标的收集–disable_metrics=tcp, udp 。
https://github.com/google/cadvisor/blob/master/docs/runtime_options.md#metrics
结论
一、在k8s场景,一般针对无状态服务,不太需要考虑磁盘占用,关注磁盘io container_fs_reads相关指标即可,针对有状态,如果有pv,关注一下pv的占用率(kubelet_volume相关指标)
二、kubelet内置的cadvisor组件收集每个容器资源监控信息,但官方基于性能相关的考虑,如果抓取这些每个容器中网络相关的指标,将会耗费大量的CPU内存资源。可以直接使用ss命令来获取每个容器网络空间的网络状态,直接读取/proc/{pid}/net/sockstat文件
sockstat文件信息:
sockets: used 141118
TCP: inuse 89 orphan 96 tw 7181 alloc 21341 mem 13896
UDP: inuse 3 mem 116
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0
TCP inuse是的值是取自tcp4_hashed+tcp6_hashed,是正在使用的TCP套接字的数量,而不是establish状态的tcp连接,establish状态的tcp连接状态需要从/proc/net/snmp文件中获取,读取CurrEstab字段。