容器監(jiān)控實踐—Custom Metrics

概述

上文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的部署文件:


image

其中創(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獲取指標

image

基于自定義指標的HPA

使用prometheus后念祭,pod有一些自定義指標兑宇,如http_request請求數(shù)


image

創(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

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末盒使,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子七嫌,更是在濱河造成了極大的恐慌少办,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诵原,死亡現(xiàn)場離奇詭異英妓,居然都是意外死亡挽放,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門蔓纠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來骂维,“玉大人,你說我怎么就攤上這事贺纲『焦耄” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵猴誊,是天一觀的道長潦刃。 經(jīng)常有香客問我,道長懈叹,這世上最難降的妖魔是什么乖杠? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮澄成,結果婚禮上胧洒,老公的妹妹穿的比我還像新娘。我一直安慰自己墨状,他們只是感情好卫漫,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著肾砂,像睡著了一般列赎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上镐确,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天包吝,我揣著相機與錄音,去河邊找鬼源葫。 笑死诗越,一個胖子當著我的面吹牛,可吹牛的內容都是我干的息堂。 我是一名探鬼主播嚷狞,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼储矩!你這毒婦竟也來了感耙?” 一聲冷哼從身側響起褂乍,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤持隧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后逃片,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屡拨,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡只酥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了呀狼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片裂允。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖哥艇,靈堂內的尸體忽然破棺而出绝编,到底是詐尸還是另有隱情,我是刑警寧澤貌踏,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布十饥,位于F島的核電站,受9級特大地震影響祖乳,放射性物質發(fā)生泄漏逗堵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一眷昆、第九天 我趴在偏房一處隱蔽的房頂上張望蜒秤。 院中可真熱鬧,春花似錦亚斋、人聲如沸作媚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽掂骏。三九已至,卻和暖如春厚掷,著一層夾襖步出監(jiān)牢的瞬間弟灼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工冒黑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留田绑,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓抡爹,卻偏偏與公主長得像掩驱,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子冬竟,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內容