Kubernetes社區(qū)之活躍祖能,不斷地迭代演化更新一些技術(shù)方案晾剖,容器監(jiān)控亦是如此据沈。本文結(jié)合官方給出的監(jiān)控架構(gòu)及自己的一些實踐經(jīng)驗莺奔,細說容器監(jiān)控崖叫。在之前的文章(Kubernetes系列(六) 監(jiān)控及prometheus實踐)中有關(guān)于Kubernetes容器監(jiān)控方案的詳細介紹遗淳,如果感興趣歡迎閱讀
官方監(jiān)控架構(gòu)
核心監(jiān)控管道 由kubelet心傀、資源評估器屈暗、metrics-server(精簡Heapster)和API server的master metrics API組成。這些監(jiān)控項被核心系統(tǒng)組件使用脂男,例如調(diào)度邏輯(調(diào)度器和基于HPA的系統(tǒng)指標)和kubectl top养叛。此管道不適用于第三方監(jiān)控系統(tǒng)集成
根據(jù)核心監(jiān)控指標的用途,拆解監(jiān)控數(shù)據(jù)鏈路
(1).kubelet(cAdvisor)[ -> 資源評估器 ] -> metrics-server -> API server -> scheduler
(2).kubelet(cAdvisor)[ -> 資源評估器 ] -> metrics-server -> API server -> HPA controller
(3).kubelet(cAdvisor)[ -> 資源評估器 ] -> metrics-server -> API server -> kubectl top
(4).kubelet(cAdvisor)[ -> 資源評估器 ] -> metrics-server -> API server -> OOS Infrastore
監(jiān)控管道 從系統(tǒng)收集大量監(jiān)控指標并且將它們導出到用戶端宰翅、HPA(自定義監(jiān)控項)以及通過適配器導出到Infrastore弃甥。這樣的管道通常由每個節(jié)點的代理和一個集群級聚合器組成
鏈路拆解
(5).kubelet(cAdvisor)[ -> node-exporter ] -> prometheus -> HPA API adapter -> HPA controller
(6).kubelet(cAdvisor)[ -> node-exporter ] -> prometheus -> API adapter -> OSS Infrastore
基本鏈路 kubelet運行于集群中的所有worker node淆攻,集成于kubelet中的cAdvisor模塊負責采集運行于當前節(jié)點上所有Pod、Container的資源(cpu,memory,network,filesystem,etc.)使用情況,按Node戈擒、Pod眶明、Container三種級別計算匯總后搜囱,通過 /stats/summary
和 /metrics/cadvisor
兩個接口分別向API Server提供核心監(jiān)控指標、向Prometheus提供業(yè)務監(jiān)控指標
官方metrics項目實現(xiàn)
Resource Metrics API
- Heapster 收集監(jiān)控項并將它們寫入指標存儲接收器柑土,從內(nèi)存存儲中Expose Resource Metrics API
-
Metrics Server 專門針對Resource Metrics API的輕量級內(nèi)存服務
Custom Metrics API - Prometheus Adapter Custom Metrics API的一種實現(xiàn)稽屏,嘗試支持遵循標簽和命名規(guī)則的任意監(jiān)控項
- Microsoft Azure Adapter 支持從Azure監(jiān)控系統(tǒng)檢索任意指標
- Google Stackdriver (即將推出)
- Datadog Cluster Agent 使用Datadog作為后端,實現(xiàn)external metrics provider狐榔。即將推出: 實現(xiàn)custom metrics provider,以支持Datadog代理收集集群內(nèi)指標
- Kube Metrics Adapter kubernetes通用監(jiān)控指標標準適配器薄腻,可以收集和提供HPA的自定義和外部度量標準
術(shù)語
系統(tǒng)監(jiān)控項 是通用指標,通斥挚可以從被監(jiān)控的每個實體獲得(e.g. 容器和節(jié)點的CPU罢艾、Memory使用率)
系統(tǒng)監(jiān)控項分為
非核心監(jiān)控指標 不會被Kubernetes解讀楣颠;我們通常假設(shè)它們包括核心監(jiān)控項和其他監(jiān)控項
核心監(jiān)控指標 Kubernetes理解并用于運行其內(nèi)部組件和核心實用程序的指標。例如咐蚯,用于調(diào)度的指標(包括用于資源估算的算法輸入童漩,初始資源/垂直自動擴展,集群自動擴展和HPA仓蛆,不包括自定義指標)睁冬、kube dashboard和kubectl top。截止目前看疙,這將包括cpu累計使用量豆拨、內(nèi)存瞬時使用率、Pod磁盤使用量能庆、容器的磁盤使用量
自定義指標 由Prometheus Adapter提供API custom.metrics.k8s.io施禾,由此可支持任意Prometheus采集到的指標
服務監(jiān)控項 在應用程序代碼中明確定義(e.g. API server請求數(shù)量)。服務指標可以分為由Kubernetes基礎(chǔ)架構(gòu)組件生成的(因此對Kubernetes集群的操作有用)和用戶應用程序生成的指標搁胆。用作HPA輸入的服務指標有時稱為自定義指標弥搞。HPA也使用核心指標
系統(tǒng)監(jiān)控項和服務監(jiān)控項都可以來自用戶的容器或系統(tǒng)基礎(chǔ)架構(gòu)組件(API server、運行在Master中的插件以及用戶節(jié)點上運行的插件)
擴展--自定義監(jiān)控指標
場景 核心指標只包括Node渠旁、Pod的cpu攀例、內(nèi)存等,一般來說用作HPA已經(jīng)足夠了顾腊,如果想根據(jù)自定義的指標(例如QPS/5xx)來實現(xiàn)HPA粤铭,就需要使用自定義指標了。目前Kubernetes中自定義指標一般由prometheus來提供杂靶,再利用k8s-prometheus-adapter聚合到API Server梆惯,實現(xiàn)和核心(metrics-server)同樣的效果
基于原生核心資源指標的HPA
Metrics Server 集群級別的核心資源使用聚合器,通過各個節(jié)點的/stats/summary
接口提供的數(shù)據(jù)來收集節(jié)點和Pod的CPU和內(nèi)存使用情況吗垮。Summary API是一種內(nèi)存高效的API垛吗,用于將數(shù)據(jù)從kubelet/cAdvisor傳遞到Metrics Server
API Server 聚合 Metrics Server 提供的核心資源指標,通過metrics.k8s.io/v1beta1 API提供給HPA做自動擴縮
基于自定義指標的HPA
prometheus采集Pods(通常是/metrics
API)監(jiān)控指標存儲到TSDB烁登,使用k8s-prometheus-adapter提供的擴展kubernetes custom metrics API
# example 新建一個HPA 以http_requests為度量指標怯屉,閾值設(shè)置為10
# 當qps超過閾值觸發(fā)自動擴縮(pod副本數(shù)2個~10個)
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: qps-hpa
spec:
scaleTargetRef:
apiVersion: extensions/v1beta1
kind: Deployment
name: qps-hpa
minReplicas: 2
maxReplicas: 10
metrics:
- type: Pods
pods:
metricName: http_requests
targetAverageValue: 10
小結(jié)
有些場景下不僅需要依賴CPU/內(nèi)存使用指標來滿足SLA,大多數(shù)Web需要基于每秒請求進行自動擴展以處理任何流量突發(fā); 對于批處理應用程序饵沧,可以通過隊列長度超過某個閾值等來觸發(fā)HPA; 通過使用Prometheus檢測應用程序并Expose自動擴縮指標蚀之,可以動態(tài)調(diào)整應用程序,以更好地處理流量兔子確保高可用性