概述
上文metric-server提到谬泌,kubernetes的監(jiān)控指標分為兩種:
Core metrics(核心指標):從 Kubelet叠萍、cAdvisor 等獲取度量數(shù)據(jù)潭流,再由metrics-server提供給 Dashboard、HPA 控制器等使用。
Custom Metrics(自定義指標):由Prometheus Adapter提供API custom.metrics.k8s.io,由此可支持任意Prometheus采集到的指標鱼鸠。
核心指標只包含node和pod的cpu、內存等羹铅,一般來說蚀狰,核心指標作HPA已經(jīng)足夠,但如果想根據(jù)自定義指標:如請求qps/5xx錯誤數(shù)來實現(xiàn)HPA职员,就需要使用自定義指標了麻蹋,目前Kubernetes中自定義指標一般由Prometheus來提供,再利用k8s-prometheus-adpater聚合到apiserver焊切,實現(xiàn)和核心指標(metric-server)同樣的效果扮授。
以下是官方metrics的項目介紹:
Resource Metrics API(核心api)
- Heapster
- Metrics Server
Custom Metrics API:
- Prometheus Adapter
- Microsoft Azure Adapter
- Google Stackdriver
- Datadog Cluster Agent
部署
Prometheus可以采集其它各種指標,但是prometheus采集到的metrics并不能直接給k8s用蛛蒙,因為兩者數(shù)據(jù)格式不兼容糙箍,因此還需要另外一個組件(kube-state-metrics)渤愁,將prometheus的metrics數(shù)據(jù)格式轉換成k8s API接口能識別的格式牵祟,轉換以后,因為是自定義API抖格,所以還需要用Kubernetes aggregator在主API服務器中注冊诺苹,以便直接通過/apis/來訪問。
文件清單:
- node-exporter:prometheus的export雹拄,收集Node級別的監(jiān)控數(shù)據(jù)
- prometheus:監(jiān)控服務端收奔,從node-exporter拉數(shù)據(jù)并存儲為時序數(shù)據(jù)。
- kube-state-metrics:將prometheus中可以用PromQL查詢到的指標數(shù)據(jù)轉換成k8s對應的數(shù)
- k8s-prometheus-adpater:聚合進apiserver滓玖,即一種custom-metrics-apiserver實現(xiàn)
- 開啟Kubernetes aggregator功能(參考上文metric-server)
k8s-prometheus-adapter的部署文件:
其中創(chuàng)建了一個叫做cm-adapter-serving-certs的secret坪哄,包含兩個值: serving.crt和serving.key,這是由apiserver信任的證書。kube-prometheus項目中的gencerts.sh和deploy.sh腳本可以創(chuàng)建這個secret
包括secret的所有資源翩肌,都在custom-metrics命名空間下模暗,因此需要kubectl create namespace custom-metrics
以上組件均部署成功后,可以通過url獲取指標
基于自定義指標的HPA
使用prometheus后念祭,pod有一些自定義指標兑宇,如http_request請求數(shù)
創(chuàng)建一個HPA,當請求數(shù)超過每秒10次時進行自動擴容
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: podinfo
spec:
scaleTargetRef:
apiVersion: extensions/v1beta1
kind: Deployment
name: podinfo
minReplicas: 2
maxReplicas: 10
metrics:
- type: Pods
pods:
metricName: http_requests
targetAverageValue: 10
查看hpa
$ kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
podinfo Deployment/podinfo 899m / 10 2 10 2 1m
對pod進行施壓
#install hey
$ go get -u github.com/rakyll/hey
#do 10K requests rate limited at 25 QPS
$ hey -n 10000 -q 5 -c 5 http://PODINFO_SVC_IP:9898/healthz
HPA發(fā)揮作用:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulRescale 5m horizontal-pod-autoscaler New size: 3; reason: pods metric http_requests above target
Normal SuccessfulRescale 21s horizontal-pod-autoscaler New size: 2; reason: All metrics below target
關于k8s-prometheus-adapter
其實k8s-prometheus-adapter既包含自定義指標粱坤,又包含核心指標隶糕,即如果按照了prometheus,且指標都采集完整站玄,k8s-prometheus-adapter可以替代metrics server枚驻。
在1.6以上的集群中,k8s-prometheus-adapter可以適配autoscaling/v2的HPA
因為一般是部署在集群內蜒什,所以k8s-prometheus-adapter默認情況下测秸,使用in-cluster的認證方式,以下是主要參數(shù):
- lister-kubeconfig: 默認使用in-cluster方式
- metrics-relist-interval: 更新metric緩存值的間隔灾常,最好大于等于Prometheus 的scrape interval霎冯,不然數(shù)據(jù)會為空
- prometheus-url: 對應連接的prometheus地址
- config: 一個yaml文件,配置如何從prometheus獲取數(shù)據(jù)钞瀑,并與k8s的資源做對應沈撞,以及如何在api接口中展示。
config文件的內容示例(參考文檔)
rules:
- seriesQuery: '{__name__=~"^container_.*",container_name!="POD",namespace!="",pod_name!=""}'
seriesFilters: []
resources:
overrides:
namespace:
resource: namespace
pod_name:
resource: pod
name:
matches: ^container_(.*)_seconds_total$
as: ""
metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>,container_name!="POD"}[1m])) by (<<.GroupBy>>)
- seriesQuery: '{__name__=~"^container_.*",container_name!="POD",namespace!="",pod_name!=""}'
seriesFilters:
- isNot: ^container_.*_seconds_total$
resources:
overrides:
namespace:
resource: namespace
pod_name:
resource: pod
name:
matches: ^container_(.*)_total$
as: ""
metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>,container_name!="POD"}[1m])) by (<<.GroupBy>>)
- seriesQuery: '{__name__=~"^container_.*",container_name!="POD",namespace!="",pod_name!=""}'
seriesFilters:
- isNot: ^container_.*_total$
resources:
overrides:
namespace:
resource: namespace
pod_name:
resource: pod
name:
matches: ^container_(.*)$
as: ""
metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>,container_name!="POD"}) by (<<.GroupBy>>)
問題
為什么我看不到自定義的metric
- 檢查下config配置文件雕什,是否有選擇你的metric
- 檢查下采集的信息是否正確缠俺,如foo{namespace="somens",deployment="bar"},foo這個名稱的數(shù)據(jù)來自于somens的命名空間+bar這個部署
- 啟動的時候加上--v=6贷岸,可以打出adapter實際的query信息
參考k8s-prometheus-adapter壹士,可以實現(xiàn)自己的adapter,比如獲取已有監(jiān)控系統(tǒng)的指標偿警,匯聚到api-server中躏救,k8s-prometheus-adapter的實現(xiàn)邏輯會在后續(xù)文章中專門來講。
本文為容器監(jiān)控實踐系列文章螟蒸,完整內容見:container-monitor-book