容器檢查
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可視化日志