基于Custom Metrics API的CoreDns水平擴(kuò)展

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/v2beta2API版本中问芬,可以選擇在進(jìn)行比較之前將此值除以pod的數(shù)量悦析。

所述Horizo??ntalPodAutoscaler通常由一系列的API聚集(的獲取度量metrics.k8s.iocustom.metrics.k8s.ioexternal.metrics.k8s.io)此衅。該metrics.k8s.ioAPI通常是通過(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

image.png

生成 metrics.k8s.io/v1beta1

image.png

查看 nodes 指標(biāo)

image.png

查看 pods 指標(biāo)

image.png

安裝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

image.png

基于自定義指標(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蓖康,一起剝皮案震驚了整個(gè)濱河市铐炫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蒜焊,老刑警劉巖倒信,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異泳梆,居然都是意外死亡鳖悠,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)优妙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)乘综,“玉大人,你說(shuō)我怎么就攤上這事套硼】ǔ剑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵邪意,是天一觀的道長(zhǎng)看政。 經(jīng)常有香客問(wèn)我,道長(zhǎng)抄罕,這世上最難降的妖魔是什么允蚣? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮呆贿,結(jié)果婚禮上嚷兔,老公的妹妹穿的比我還像新娘森渐。我一直安慰自己,他們只是感情好冒晰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布同衣。 她就那樣靜靜地躺著,像睡著了一般壶运。 火紅的嫁衣襯著肌膚如雪耐齐。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,754評(píng)論 1 307
  • 那天蒋情,我揣著相機(jī)與錄音埠况,去河邊找鬼。 笑死棵癣,一個(gè)胖子當(dāng)著我的面吹牛辕翰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播狈谊,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼喜命,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了河劝?” 一聲冷哼從身側(cè)響起壁榕,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赎瞎,沒(méi)想到半個(gè)月后护桦,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡煎娇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年二庵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缓呛。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡催享,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出哟绊,到底是詐尸還是另有隱情因妙,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布票髓,位于F島的核電站攀涵,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏洽沟。R本人自食惡果不足惜以故,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望裆操。 院中可真熱鬧怒详,春花似錦炉媒、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至静尼,卻和暖如春白粉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鼠渺。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工鸭巴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人系冗。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓奕扣,卻偏偏與公主長(zhǎng)得像薪鹦,于是被迫代替她去往敵國(guó)和親掌敬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355