掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網(wǎng)交流
作者:ikubernetes 2022-09-05 08:39:04
云計算
云原生 本文將介紹其數(shù)據(jù)鏈路和實現(xiàn)原理,同時會闡述K8S中的監(jiān)控體系。

創(chuàng)新互聯(lián)建站-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設、高性價比靜寧網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式靜寧網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設找我們,業(yè)務覆蓋靜寧地區(qū)。費用合理售后完善,10余年實體公司更值得信賴。
?承接上文?,我們在基于Ubuntu 2204使用kubeadm部署了k8s集群,且基于helm部署了metrics-server.
然后我們可以很歡快的使用kubectl top命令查看node、pod的實時資源使用情況:如CPU、內存。
本文將介紹其數(shù)據(jù)鏈路和實現(xiàn)原理,同時會闡述k8s中的監(jiān)控體系。
kubectl top是我們經(jīng)常使用的基礎命令,但是必須需要部署metrics-server組件,才能獲取到監(jiān)控值。
我們所使用的版本是1.24.3的最新版本,所以一定要部署metrics-server。
查看node的資源使用情況。
$ kubectl top node
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
k8s-unode1 158m 7% 1814Mi 47%
k8s-unode2 50m 2% 874Mi 23%
k8s-unode3 51m 2% 943Mi 24%
k8s-unode4 45m 2% 905Mi 23%
$ kubectl top node k8s-unode1
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
k8s-unode1 160m 8% 1811Mi 47%
查看pod的資源使用情況,--containers可以顯示pod內所有的container。
$ kubectl top pod -n metrics-server
NAME CPU(cores) MEMORY(bytes)
metrics-server-56c6866684-w6n9b 5m 17Mi
$ kubectl top pod --containers -n metrics-server
POD NAME CPU(cores) MEMORY(bytes)
metrics-server-56c6866684-w6n9b metrics-server 5m 17Mi
指標的具體含義:
每次啟動 pod,都會有一個 pause 容器,既然是容器就一定有資源消耗(一般在 2-3M 的內存),cgroup 文件中,業(yè)務容器和 pause 容器都在同一個 pod的文件夾下。
但 cadvisor 在查詢 pod 的內存使用量時,是先獲取了 pod 下的container列表,再逐個獲取container的內存占用,不過這里的 container 列表并沒有包含 pause,因此最終 top pod 的結果也不包含 pause 容器。
kubectl top pod 得到的內存使用量,并不是cadvisor 中的container_memory_usage_bytes,而是container_memory_working_set_bytes,計算方式為:
container_memory_working_set_bytes是容器真實使用的內存量,也是limit限制時的 oom 判斷依據(jù)。
kubectl top命令和 top 的差異和上邊 一致,無法直接對比,同時,就算你對 pod 做了limit 限制,pod 內的 top 看到的內存和 cpu總量仍然是機器總量,并不是pod 可分配量。
k8s dashboard、kubectl top等都是通過apiserver獲取監(jiān)控數(shù)據(jù),數(shù)據(jù)鏈路如下:
在提出 metric api 的概念時,官方頁提出了新的監(jiān)控體系,監(jiān)控資源被分為了2種:
無論是廢棄的heapster還是metric-server,都只是數(shù)據(jù)的中轉和聚合;兩者都是調用的kubelet的api接口獲取的數(shù)據(jù)。kubelet代碼中實際集成了采集指標的cAdvisor模塊,可以通過kubelet暴露的10250端口獲取監(jiān)控數(shù)據(jù)。
kubelet雖然提供了 metric 接口,但實際監(jiān)控邏輯由內置的cAdvisor模塊負責。
cAdvisor由谷歌開源,使用go語言開發(fā)。項目地址:https://github.com/google/cadvisor。
cadvisor不僅可以搜集一臺機器上所有運行的容器信息,包括CPU使用情況、內存使用情況、網(wǎng)絡吞吐量及文件系統(tǒng)使用情況,還提供基礎查詢界面和http接口,方便其他組件進行數(shù)據(jù)抓取。在K8S中集成在Kubelet里作為默認啟動項,k8s官方標配。
cadvisor獲取指標時實際調用的是 runc/libcontainer庫,而libcontainer是對 cgroup文件 的封裝,即 cadvsior也只是個轉發(fā)者,它的數(shù)據(jù)來自于cgroup文件。
cgroup文件中的值是監(jiān)控數(shù)據(jù)的最終來源,如:
一般情況下,cgroup文件夾下的內容包括CPU、內存、磁盤、網(wǎng)絡等信息。
device:設備控制權限
cpuset:分配指定的CPU和內存節(jié)點
cpu:控制CPU占用率
cpuacct:統(tǒng)計CPU使用情況
memory:限制內存的使用上限
freezer:凍結Cgroup中的進程
net_cls:配合(traffic controller)限制網(wǎng)絡帶寬
net_prio:設置進程的網(wǎng)絡流量優(yōu)先級
huge_tlb:限制HugeTLB的使用
pref_event:允許perf工具基于cgrgoup分組做性能監(jiān)測
memory下的幾個常用的指標含義:
memory.usage_in_bytes: 已使用的內存量(包含cache和buffer)字節(jié),相當于linux的userd_mem
memory.limit_in_bytes: 限制的內存總量(字節(jié)),相當于linux的total_mem
memory.failcnt: 申請內存失敗次數(shù)計數(shù)
memory.stat: 內存相關狀態(tài)
memory.memsw.usage_in_bytes: 已使用內存和swap
memory.memsw.limit_in_bytes: 限制的內存和swap
memory.memsw.failcnt: 申請內存和swap失敗次數(shù)計數(shù)

我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網(wǎng)交流