Metrics Server
從Kubernetes 1.8開(kāi)始怯晕,Kubernetes通過(guò)Metrics API提供資源使用指標(biāo),例如容器CPU和內(nèi)存使用鸭廷。這些度量可以由用戶直接訪問(wèn)默怨,例如通過(guò)使用kubectl top命令,或者由群集中的控制器(例如Horizo??ntal Pod Autoscaler)使用來(lái)進(jìn)行決策冈绊。
root@k8s-master-1:~# kubectl top node
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
192.168.2.10 215m 5% 1679Mi 43%
192.168.2.11 119m 2% 1383Mi 36%
192.168.2.12 116m 2% 912Mi 23%
192.168.2.13 292m 7% 1573Mi 41%
root@k8s-master-1:~# kubectl top pod
NAME CPU(cores) MEMORY(bytes)
kube-resource-report-6d6ddfcfbc-sxg4k 0m 65Mi
myapp-c78bcd8fb-dt87s 0m 10Mi
myapp-envoy-696b6d764d-s8gvs 5m 30Mi
Metrics API
通過(guò)Metrics API,您可以獲得給定節(jié)點(diǎn)或給定pod當(dāng)前使用的資源量埠啃。此API不存儲(chǔ)Metrics Value死宣,因此例如在10分鐘前獲取給定節(jié)點(diǎn)使用的資源量是不可能的。
API與任何其他API沒(méi)有區(qū)別:
- 它可以通過(guò)與
/apis/metrics.k8s.io/
路徑下的其他Kubernetes API相同的端點(diǎn)發(fā)現(xiàn) - 它提供相同的安全性霸妹,可擴(kuò)展性和可靠性保證
API在k8s.io/metrics 存儲(chǔ)庫(kù)中定義十电。您可以在那里找到有關(guān)API的更多信息知押。
注意: API要求在群集中部署Metrics Server叹螟。否則它將無(wú)法使用鹃骂。
Metrics Server
Metrics Server
實(shí)現(xiàn)了Metrics API。
Metrics Server 是集群范圍資源使用數(shù)據(jù)的聚合器罢绽。 從 Kubernetes 1.8 開(kāi)始畏线,它作為一個(gè) Deployment 對(duì)象默認(rèn)部署在由 kube-up.sh 腳本創(chuàng)建的集群中。 如果你使用了其他的 Kubernetes 安裝方法良价,您可以使用 Kubernetes 1.7+ (請(qǐng)參閱下面的詳細(xì)信息) 中引入的 deployment yamls 文件來(lái)部署寝殴。
Metrics Server 從每個(gè)節(jié)點(diǎn)上的 Kubelet
公開(kāi)的 Summary API 中采集指標(biāo)信息。
通過(guò)在主 API server 中注冊(cè)的 Metrics Server Kubernetes 聚合器 來(lái)采集指標(biāo)信息明垢, 這是在 Kubernetes 1.7 中引入的蚣常。在 設(shè)計(jì)文檔 中可以了解到有關(guān) Metrics Server 的更多信息。
Custom Metrics API
custom-metrics-apiserver 該 API 允許消費(fèi)者訪問(wèn)通過(guò)任意指標(biāo)描述的 Kubernetes 資源痊银。如果你想實(shí)現(xiàn)這個(gè) API Service抵蚊,這是一個(gè)用來(lái)實(shí)現(xiàn) Kubernetes 自定義指標(biāo)的框架。
Horizontal Pod Autoscaler
Horizo??ntal Pod Autoscaler根據(jù)觀察到的CPU利用率(或者溯革,通過(guò)Custom Metrics API 支持贞绳,根據(jù)其他一些應(yīng)用程序提供的指標(biāo))自動(dòng)調(diào)整復(fù)制控制器,部署或副本集中的pod數(shù) 致稀。請(qǐng)注意冈闭,Horizo??ntal Pod Autoscaling不適用于無(wú)法縮放的對(duì)象,例如DaemonSet抖单。
Horizo??ntal Pod Autoscaler實(shí)現(xiàn)為Kubernetes API資源和控制器萎攒。資源確定控制器的行為∶妫控制器會(huì)定期調(diào)整復(fù)制控制器或部署中的副本數(shù)躺酒,以使觀察到的平均CPU利用率與用戶指定的目標(biāo)相匹配。
Horizo??ntal Pod Autoscaler如何工作
Horizo??ntal Pod Autoscaler實(shí)現(xiàn)為循環(huán)監(jiān)測(cè)蔑歌,其周期由控制器管理器的--horizontal-pod-autoscaler-sync-period
標(biāo)志控制(默認(rèn)值為15秒)羹应。
在每個(gè)期間,控制器管理器根據(jù)每個(gè)Horizo??ntalPodAutoscaler定義中指定的度量查詢資源利用率次屠≡捌ィ控制器管理器從資源指標(biāo)API(針對(duì)每個(gè)窗格資源指標(biāo))或自定義指標(biāo)API(針對(duì)所有其他指標(biāo))獲取指標(biāo)。
- 對(duì)于每個(gè)pod資源指標(biāo)(如CPU)劫灶,控制器從Horizo??ntalPodAutoscaler所針對(duì)的每個(gè)pod獲取資源指標(biāo)API中的指標(biāo)裸违。然后,如果設(shè)置了目標(biāo)利用率值本昏,則控制器將利用率值計(jì)算為每個(gè)容器中容器上的等效資源請(qǐng)求的百分比供汛。如果設(shè)置了目標(biāo)原始值,則直接使用原始度量標(biāo)準(zhǔn)值。然后怔昨,控制器在所有目標(biāo)pod中獲取利用率的平均值或原始值(取決于指定的目標(biāo)類(lèi)型)雀久,并產(chǎn)生用于縮放所需副本數(shù)量的比率。
請(qǐng)注意趁舀,如果某些pod的容器沒(méi)有設(shè)置相關(guān)的資源請(qǐng)求赖捌,則不會(huì)定義pod的CPU利用率,并且autoscaler不會(huì)對(duì)該度量標(biāo)準(zhǔn)采取任何操作矮烹。有關(guān)自動(dòng)調(diào)節(jié)算法如何工作的更多信息越庇,請(qǐng)參閱下面的算法詳細(xì)信息部分。
對(duì)于每個(gè)pod自定義指標(biāo)奉狈,控制器的功能與每個(gè)pod資源指標(biāo)類(lèi)似卤唉,不同之處在于它適用于原始值,而不是使用值仁期。
對(duì)于對(duì)象度量和外部度量搬味,將獲取單個(gè)度量,該度量描述相關(guān)對(duì)象蟀拷。將該度量與目標(biāo)值進(jìn)行比較碰纬,以產(chǎn)生如上所述的比率。在
autoscaling/v2beta2
API版本中问芬,可以選擇在進(jìn)行比較之前將此值除以pod的數(shù)量悦析。
所述Horizo??ntalPodAutoscaler通常由一系列的API聚集(的獲取度量metrics.k8s.io
, custom.metrics.k8s.io
和external.metrics.k8s.io
)此衅。該metrics.k8s.io
API通常是通過(guò)Metrics Server强戴,其需要單獨(dú)啟動(dòng)提供。有關(guān)說(shuō)明挡鞍,請(qǐng)參閱 metrics-server骑歹。Horizo??ntalPodAutoscaler還可以直接從Heapster(從Kubernetes 1.11開(kāi)始,不推薦從Heapster獲取指標(biāo)墨微。)獲取指標(biāo)道媚。
安裝 Metrics Server
安裝官方文檔 metrics server yaml
創(chuàng)建metrics-server pod
生成 metrics.k8s.io/v1beta1
查看 nodes 指標(biāo)
查看 pods 指標(biāo)
安裝Custom Metrics Server
需要在集群內(nèi)有Prometheus 從中收集指標(biāo)并將其存儲(chǔ)為 Prometheus 時(shí)間序列數(shù)據(jù)庫(kù)。
安裝 custom metrics apiserver 提供的 metrics 來(lái)擴(kuò)展 Kubernetes 自定義指標(biāo) API
基于自定義指標(biāo)的自動(dòng)擴(kuò)容
CoreDns本身也是可以基于cpu負(fù)載來(lái)做HPA翘县,但是實(shí)際測(cè)試下來(lái)波動(dòng)較大最域,所以考慮通過(guò)自定義指標(biāo)來(lái)彈性伸縮
CoreDns 作為Kubernetes 1.11版本之后的默認(rèn)dns插件之后,本身9153端口提供/metrics
接口
-
coredns_build_info{version, revision, goversion}
- 有關(guān)CoreDNS本身的信息锈麸。 -
coredns_panic_count_total{}
- 恐慌總數(shù)镀脂。 -
coredns_dns_request_count_total{server, zone, proto, family}
- 總查詢次數(shù)。 -
coredns_dns_request_duration_seconds{server, zone}
- 處理每個(gè)查詢的持續(xù)時(shí)間忘伞。 -
coredns_dns_request_size_bytes{server, zone, proto}
- 請(qǐng)求的大斜〕帷(以字節(jié)為單位)沙兰。 -
coredns_dns_request_do_count_total{server, zone}
- 設(shè)置了DO位的查詢 -
coredns_dns_request_type_count_total{server, zone, type}
- 每個(gè)區(qū)域和類(lèi)型的查詢計(jì)數(shù)器。 -
coredns_dns_response_size_bytes{server, zone, proto}
- 響應(yīng)大星唐恰(字節(jié))鼎天。 -
coredns_dns_response_rcode_count_total{server, zone, rcode}
- 每個(gè)區(qū)域和rcode的響應(yīng)。 -
coredns_plugin_enabled{server, zone, name}
- 指示是否基于每個(gè)服務(wù)器和區(qū)域啟用插件熟丸。
這次我就利用coredns_dns_request_count_total{server, zone, proto, family}
Prometheus adapter(即 custom-metrics-apiserver)刪除了 _total 后綴并將該指標(biāo)標(biāo)記為 coredns_dns_request_count
從Custom Metrics API 獲取每秒的總查詢次數(shù):
root@k8s-master-1:~/k8s_manifests# kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/kube-system/pods/*/coredns_dns_request_count" | jq .
{
"kind": "MetricValueList",
"apiVersion": "custom.metrics.k8s.io/v1beta1",
"metadata": {
"selfLink": "/apis/custom.metrics.k8s.io/v1beta1/namespaces/kube-system/pods/%2A/coredns_dns_request_count"
},
"items": [
{
"describedObject": {
"kind": "Pod",
"namespace": "kube-system",
"name": "coredns-dc8bbbcf9-5jdqc",
"apiVersion": "/v1"
},
"metricName": "coredns_dns_request_count",
"timestamp": "2019-05-13T08:25:00Z",
"value": "911m"
},
{
"describedObject": {
"kind": "Pod",
"namespace": "kube-system",
"name": "coredns-dc8bbbcf9-fp7wx",
"apiVersion": "/v1"
},
"metricName": "coredns_dns_request_count",
"timestamp": "2019-05-13T08:25:00Z",
"value": "577m"
}
]
}
m
表示 毫
,例如伪节,911m
表示911 毫次/每秒
創(chuàng)建一個(gè) HPA光羞,如果請(qǐng)求數(shù)超過(guò)每秒 1000 次將擴(kuò)大 coredns 副本數(shù):
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: coredns
namespace: kube-system
spec:
scaleTargetRef:
apiVersion: extensions/v1beta1
kind: Deployment
name: coredns
minReplicas: 2
maxReplicas: 10
metrics:
- type: Pods
pods:
metricName: coredns_dns_request_count
targetAverageValue: 1000
總結(jié)
不是所有的應(yīng)用都可以適用依靠 CPU 和Memory指標(biāo)做彈性伸縮來(lái)滿足系統(tǒng)的負(fù)載,大多數(shù) Web 應(yīng)用的后端都需要基于每秒的請(qǐng)求數(shù)量QPS
進(jìn)行彈性伸縮來(lái)處理突發(fā)流量怀大。而一些 ETL 應(yīng)用程序纱兑,可以通過(guò)設(shè)置 Job 隊(duì)列長(zhǎng)度超過(guò)某個(gè)閾值來(lái)觸發(fā)彈性伸縮工作pod。
通過(guò) Prometheus 來(lái)監(jiān)控應(yīng)用程序并暴露出用于彈性伸縮的指標(biāo)/metric
化借,可以微調(diào)應(yīng)用程序以更好地處理突發(fā)事件潜慎,從而確保其高可用性。
參考文檔:
https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/
https://github.com/coredns/coredns/tree/master/plugin/metrics
https://github.com/kubernetes-incubator/metrics-server
https://github.com/DirectXMan12/k8s-prometheus-adapter
https://github.com/coreos/prometheus-operator