6 監控與日志

容器檢查

kubectl get 和kubectl describe 查詢部署狀態

kubectl logs將容器的標準輸出重定向到終端

kubectl top查看CPU和內存使用情況

kubectl exec 可在容器內運行shell

K8s儀表盤

整合上述數據,web可視化展示

監控k8s

應用程序:關注內部狀態數據,可用分析profiling工具或跟蹤tracking工具診斷

主機:監控框架提供的代理完成主機數據采集,如負載、磁盤、網絡連接

外部資源:檢查其他依賴組件的狀態

容器:將容器相關邏輯附加到度量指標,如Pod標簽、控制器名稱

k8s:負責管理、調度、編排應用程序,關注k8s狀態

k8s監控要點:監控棧的每層,找到對應的采集器,如cAdvisor來滿足容器級別指標收集需求,聚合主機上每個運行的容器的資源使用情況和性能統計信息(cAdviser部署在主機而非容器,嵌入在kubelet中);監控棧另一個重要組件Heapster,從每個節點檢索監控統計信息,主要是節點上的kubelet然后寫入外部接收器;通過restfull api公開聚合度量指標

cAdvisor和Heapster專注于監控物理指標,kube-state-metrics關注邏輯狀態,監控Kubernetes master節點,并將監控內容轉換為Prometheus格式的指標

監控實踐

Prometheus介紹

Prometheus框架包含若干組件

依靠代理從系統組件中收集統計信息,采用pull拉取模型的方式收集數據,不被動接收指標而是主動從exporter拉數據

存儲后端是內嵌的LevelDB,可以切換到其他存儲如InfluxDB或Graphite

Prometheus服務器負責根據預先配置的規則向警報管理器Alert Manager發送警報,警報管理器處理警報并發送作業,將警報分組并發送到消息推送工具,如電子郵件、Slack、Pagerduty

使用PromQL

三種數據類型

即時向量instant vector:數據采樣的時間序列

范圍向量range vector:包含特定時間范圍內的數據的一組時間序列

標量scalar:具體的數值

Kubernetes目標發現

Prometheus只從它知道的端點中提取指標,要明確告訴他從哪里收集數據

路徑/config是當前已配置目標的列表,默認情況下,會有一項作業(job)收集Prometheus自身的指標,位于路徑/metrics下

Prometheus的默認作業被配置為靜態目標,但Kubernetes中的容器是動態創建和銷毀的,Prometheus通過k8s內部服務發現功能,查詢運行服務的信息,并相應的將目標配置添加或刪除

四種發現機制

節點發現模式:為每個節點創建一個目標,默認情況下,目標端口是kubelet的端口

服務發現模式:為每個服務對象創建目標,并且服務中的所有已定義端口將成為抓取目標

Pod發現模式:為每個pod創建目標,為每個pod保留所有已定義的容器端口

端口發現模式:發現服務創建的端口對象

Prometheus只獲取集群中被標記的資源,如pod注解格式如下:

prometheus.io/scrape:true 表示應拉取這個pod

prometheus.io/path:公開指標路徑,只有目標pod使用/metrics之外路徑才需要配置

prometheus.io/port:如定義的端口和實際端口不同,注釋覆蓋

從Kubernetes收集數據

Prometheus監控步驟:

安裝exporter、適當標記進行注解、自動發現端點上收集數據

Kubernetes組件其他指標

Kubernetes API服務器:在/metrics處顯示其狀態,默認情況此目標會啟動

kube-controller-manager:端口10252

kube-scheduler:端口10251

kube-dns:兩個容器dnsmasq、sky-dns,端口10054、10055

etcd:端口4001

nginx Ingress控制器:端口10254

使用Grafana查看指標

Grafana查看Prometheus指標,必須先添加數據源,連接到Prometheus服務器

配置參數:

示例:

日志

日志系統主要組件

日志代理:程序的抽象層,收集、轉換、分發日志到后端

日志后端:存儲接收到的日志

三種日志記錄方式

將所有內容發送到stdout/stderr

寫入日志文件

將日志發送到日志代理或直接記錄到后端

日志聚合模式

節點代理方式收集日志

kubectl logs查看的消息是從容器stdout/stderr重定向輸出的

kubectl log從kubelet獲取日志,kubelet將日志從容器引擎聚合到主機的/var/log/containers.

配置日志代理從系統、Kubernetes、Master和節點上的/var/log下的各組件收集日志

如kube-proxy.log、kube-apiserver.log、kube-scheduler.log、kube-controller-manager.log、etcd.long

Sidecar容器方式轉發日志

每個應用程序的pod都有兩個容器共享相同的emptyDir卷,Sidecar容器可以跟蹤應用程序容器中的日志并將它們發送到Pod之外,利用Sidecar容器將日志輸出到標準流

獲取Kubernetes事件

Eventer可以幫助觀察k8s API服務器并將事件聚合到日志記錄接收器中

Eventer是Heapster的一部分,支持ES、InfluxDB、Riemann、Google Cloud Logging作為接收器

Fluentd和Elasticsearch日志

日志系統和監控系統架構:采集器、存儲、用戶界面

相應組件:Fluentd\Eventer、ES、Kibana

ES:文本搜索和分析引擎,是數據存儲、處理和分析的理想選擇

Fluentd:較低內存占用空間,滿足日志代理選項,FluentBit 可資源利用最小化

從日志中提取指標

構建針對Kubernetes上應用程序的監控和日志系統

Prometheus善于處理時間序列數據,但沒法提取文本

mtail、GrokExporter等工具會計算日志條目,并將這些數字組織到指標中,以便可以在Prometheus中處理它們

總結

kubectl獲取容器運行狀態

Prometheus為核心構建監控系統,通過Exporter收集Kubernetes指標,Grafana可視化監控數據

EFK堆棧來處理日志,ES存儲日志,Kibana可視化日志

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容