一篇了解 K8s 日志采集與服務(wù)質(zhì)量 QoS
?引言
應(yīng)用容器化后的日志采集該選擇何種方式?該如何權(quán)衡?不同的服務(wù)質(zhì)量QoS對Node的穩(wěn)定性影響是怎么樣的,本文就捋一捋這個(gè)。主要內(nèi)容有:
- 日志采集三種方式
- 日志采集方式權(quán)衡
- Pod服務(wù)質(zhì)量QoS
一、日志采集三種方式
K8s日志采集方式主要有原生方式、DaemonSet采集方式、Sidecar采集方式。
原生方式,日志寫入標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤流,可通過 kubectl logs 命令查看輸出,如下圖。
通過日志輪替工具logrotate實(shí)現(xiàn)日志分割、壓縮、刪除、以及創(chuàng)建新的日志文件。
DaemonSet采集方式,在k8s的node節(jié)點(diǎn)上運(yùn)行日志代理,由日志代理將日志采集到后端服務(wù)。
SideCar采集方式,在一個(gè)POD中運(yùn)行一個(gè)單獨(dú)的日志采集代理容器,用于采集容器的日志。
官方也說明了SideCar會帶來更多的資源損耗,日志沒有被kubelet接管,不能使用kubectl logs訪問日志。
小結(jié):基于官方提供的采集方式,是應(yīng)該選擇DaemonSet還是SideCar呢?如何權(quán)衡?
官方日志管理說明文檔:
https://kubernetes.io/zh-cn/docs/concepts/cluster-administration/logging/
二、日志采集方式權(quán)衡
資源占用 ,SideCar采集模式每個(gè)POD運(yùn)行一個(gè)日志代理容器,DaemonSet則是Node運(yùn)行一個(gè)日志代理。
因此,DaemonSet會更充分共享資源,SideCar模式會占用更多的資源。
運(yùn)維難度,如果業(yè)務(wù)POD內(nèi)已經(jīng)擁有多種輔助容器比如安全、鏈路等,再增加日志采集容器,POD中容器數(shù)量將會增加。
因此,眾多SideCar容器要比DaemonSet增加更多的運(yùn)維投入。
隔離情況,DaemonSet的日志代理,可以配置不同應(yīng)用的采集路徑配置,SideCar一對一單向定制。
因此,總的來說SideCar隔離性更好些。
集群規(guī)模,SideCar沒有限制,DaemonSet模式實(shí)際支持的應(yīng)用數(shù)與場景有關(guān)系,大體范圍在幾百到千級別。
因此,集群規(guī)模更多日志代理采集的能力是否跟得上的問題。
升級問題,DaemonSet模式日志采集升級業(yè)務(wù)無感知,SideCar模式的升級可能導(dǎo)致業(yè)務(wù)POD的重建,POD的重建還是對業(yè)務(wù)有感知。
因此,DaemonSet模式對業(yè)務(wù)更為透明無感。
如果想SideCar采集模式業(yè)務(wù)無感,可以使用OpenKruise提供的SidecarSet管理sidecar容器。
SidecarSet負(fù)責(zé)注入和升級k8s集群的sideCar容器,對業(yè)務(wù)無感。
小結(jié):在日志采集代理能力能滿足需求的情況下,DaemonSet模式在運(yùn)維復(fù)雜性、資源節(jié)省、升級方面更好的選擇。
三、Pod服務(wù)質(zhì)量QoS
K8s使用服務(wù)質(zhì)量QoS來決定Pod的調(diào)度和驅(qū)逐策略。
QoS分為三類,Guaranteed、Burstable、BestEffort。
Guaranteed類的POD,該P(yáng)OD中的每個(gè)容器內(nèi)存和CPU必須指定,而且request和limit必須相等。
Burstable類的POD,POD里至少一個(gè)容器的內(nèi)存或者CPU請求不滿足Guaranteed要求,request和limit設(shè)置的不相同。
BestEffort類的POD, 容器沒有設(shè)置內(nèi)存和CPU的request或limit。
優(yōu)先級Guaranteed>Burstable>BestEffort。
K8s資源回收驅(qū)逐策略,當(dāng)Node上的內(nèi)存或者CPU耗盡時(shí),為了保護(hù)Node會驅(qū)逐POD,優(yōu)先級低的POD會優(yōu)先被驅(qū)逐。
日志采集類filebeat、ilogtail等類型的POD適合使用Burstable或者BestEffort。
小結(jié):為了Node的穩(wěn)定性,日志采集類的POD設(shè)置為BestEffort類型的QoS更為安全。?
官方Pod 的服務(wù)質(zhì)量文檔:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/quality-service-pod/