kube-state-metrics 和 metrics-server


  導航:這里主要是列出一個prometheus一些系統的學習過程,最后按照章節順序查看,由於寫作該文檔經歷了不同時期,所以在文中有時出現

的雲環境不統一,但是學習具體使用方法即可,在最后的篇章,有一個完整的騰訊雲的實戰案例。

  1.什么是prometheus?

  2.Prometheus安裝

  3.Prometheus的Exporter詳解

  4.Prometheus的PromQL

  5.Prometheus告警處理

  6.Prometheus的集群與高可用

  7.Prometheus服務發現

  8.kube-state-metrics 和 metrics-server

  9.監控kubernetes集群的方式

  10.prometheus operator

  11.Prometheus實戰之聯邦+高可用+持久

  12.Prometheus實戰之配置匯總

  13.Grafana簡單用法

  14.Grafana SQL匯總

  15.prometheus SQL匯總

  參考:

  https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config

  https://yunlzheng.gitbook.io/prometheus-book/part-iii-prometheus-shi-zhan/readmd/use-prometheus-monitor-kubernetes

  https://www.bookstack.cn/read/prometheus_practice/introduction-README.md

  https://www.kancloud.cn/huyipow/prometheus/521184

  https://www.qikqiak.com/k8s-book/docs/

  

  安裝了這些東西,才能獲取k8s的部分監控key.

服務 版本
Metrics-server 0.3.5
Kube-state-metrics 1.8.0

 

1.簡介

  對於Kubernetes的集群監控一般我們需要考慮一下幾方面

  • Kubernetes節點的監控;比如節點的cpu、load、fdisk、memory等指標
  • 內部系統組件的狀態;比如kube-scheduler、kube-controller-manager、kubedns/coredns等組件的運行狀態
  • 編排級的metrics;比如Deployment的狀態、資源請求、調度和API延遲等數據指標

 

2.監控方案

  Kubernetes集群的監控方案主要有以下幾種方案

  • Heapster:Herapster是一個集群范圍的監控和數據聚合工具,以Pod的形式運行在集群中。1.8+被遺棄

  Kubelet/cAdvisor之外,我們還可以向Heapster添加其他指標源數據,比如kube-state-metrics

  Heapster已經被廢棄,使用metrics-server代替

  • cAvisor:cAdvisor是Google開源的容器資源監控和性能分析工具,它是專門為容器而生,本身也支持Docker容器,Kubernetes中,我們不需要單獨去安裝,cAdvisor作為kubelet內置的一部分程序可以直接使用
  • Kube-state-metrics:通過監聽API Server生成有關資源對象的狀態指標,比如Deployment、Node、Pod,需要注意的是kube-state-metrics只是簡單的提供一個metrics數據,並不會存儲這些指標數據,所以我們可以使用Prometheus來抓取這些數據然后存儲
  • metrics-server:metrics-server也是一個集群范圍內的資源數據局和工具,是Heapster的代替品,同樣的,metrics-server也只是顯示數據,並不提供數據存儲服務。他當前的核心作用是:為HPA等組件提供決策指標支持。也可以將接收到的數據存儲到influxdb進行存儲,簡單來說,如果想基礎監控,那么就要安裝這個組件

  不過kube-state-metrics和metrics-server之前還有很大不同的,二者主要區別如下

1.kube-state-metrics主要關注的是業務相關的一些元數據,比如Deployment、Pod、副本狀態等

2.metrics-service主要關注的是資源度量API的實現,比如CPU、文件描述符、內存、請求延時等指標

 

3.metrics-server

3.1 介紹

  從 Kubernetes 1.8 開始,資源使用指標(如容器 CPU 和內存使用率)通過 Metrics API 在 Kubernetes 中獲取, metrics-server 替代了heapster。Metrics Server 實現了Resource Metrics API,Metrics Server 是集群范圍資源使用數據的聚合器。 

  Metrics Server 從每個節點上的 Kubelet 公開的 Summary API 中采集指標信息。

  項目地址:https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/metrics-server

  配置文件有兩種獲取方式:

1.https://github.com/kubernetes-incubator/metrics-server/tree/master/deploy/1.8%2B

2.https://github.com/kubernetes/kubernetes/tree/release-1.14/cluster/addons/metrics-server(推薦使用此方式)

  這里安裝分為 1.7和1.8+的版本,一般選擇1.8+的版本安裝

  簡單來說,如果不安裝執行不了kubectl top node這樣的命令,並且hpa的獲取判斷是否擴縮容的時候依賴它的數據。如果不安裝,hpa獲取的閾值那一欄一直都是未知

 

3.2 安裝

3.2.1 EKS

  1.安裝文件以及目錄

  

  2.配置

  這里有1點需要修改。如果不修改,日志和查詢會有以下的報錯

  metrics-server-deployment.yaml

  新增以下4行

 

  通過以上的command可以增加很多自定義的參數,這些參數可以參考git的文檔,並且在該版本里面,經過實驗,自建k8s,eks沒有這三行參數,那么metrics-server是采集不到數據的,kubect top node會報錯

  注意:可能出現的問題

   ## 在新的版本中,授權文內沒有 node/stats 的權限,需要手動去添加
[root@k8s-master01 metrics]# vim resource-reader.yaml 
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: system:metrics-server
rules:
- apiGroups:
  - ""
  resources:
  - pods
  - nodes
  - nodes/stats  ## 添加此參數
  - namespaces

 

  3.驗證

    新增之后,如果查看metrics-server的服務還是會報錯,但是等待1分鍾左右就可以正常查詢了

 

3.2.2 二進制

  該服務在不同平台的部署方式不同,因為在不同平台,安裝的組件不一樣,比如阿里雲,一切額外操作都准備好了.

  自建的集群安裝metrics-server需要滿足以下條件;

1.metrics-server-deployment.yaml增加3行參數(參考eks安裝)

2.master01上安裝flanneld和kube-proxy,,因為api訪問metrics-server是通過10.0.0.0段的集群ip去訪問的,如果不安裝flanneld和kube-prxoy,metrics-server和kube-apiserver是無法連通的.

3.自建集群的api-server需要添加額外參數開啟聚合層

 

  • 安裝flanneld和kube-proxy

  這里安裝不做演示,如果不安裝,將會有以下報錯;

  二進制部署,所以剛開始並沒有在master節點部署kubelet、kube-proxy組件,所以導致一直安裝失敗:

  執行命令kubectl get apiservices v1beta1.metrics.k8s.io -o yaml 看到報錯信息:"metrics-server error "Client.Timeout exceeded while awaiting headers"",這是因為mertics無法與 apiserver服務通信導致,因此需要在master節點安裝部署kubelet、kube-proxy組件(可以選擇給master節點打污點,來決定是否讓master參與pod調度上來)

 

  • 開啟聚合層

  如果不開啟聚合層,這里不會有什么影響,但是在使用prometheus opterator的時候,會有類似以下的報錯;(網上文檔說,二進制可能只要不metrics-server就會有以下報錯,所以建議不管有么有prometheus opterator,都建議開啟聚合層)

  並且prometheus opterator的一個鏡像會直接報錯

 

  • metrics-server-deployment.yaml

  新增以下4行

  通過以上的command可以增加很多自定義的參數,這些參數可以參考git的文檔,並且在該版本里面,經過實驗,自建k8s,eks沒有這三行參數,那么metrics-server是采集不到數據的,kubect top node會報錯

  注意:可能出現的問題

   ## 在新的版本中,授權文內沒有 node/stats 的權限,需要手動去添加
[root@k8s-master01 metrics]# vim resource-reader.yaml 
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: system:metrics-server
rules:
- apiGroups:
  - ""
  resources:
  - pods
  - nodes
  - nodes/stats  ## 添加此參數
  - namespaces

  1.Kube-apiserver配置文件修改  

  注意:這是二進制1.12版本,當時沒有增加參數以及復用證書,是為metrics重新生成證書。

  編輯kube-apiserver.conf 添加如下紅色參數,從下面參數中可以看出,需要生產新的證書,因此我們還需要為metrics生產證書

    KUBE_APISERVER_OPTS="--logtostderr=true \
--v=4 \
--etcd-servers=https://172.21.161.157:2379,https://172.21.161.158:2379,https://172.21.161.159:2379 \
--bind-address=172.21.161.145 \
--secure-port=6443 \
--advertise-address=172.21.161.145 \
--allow-privileged=true \
--service-cluster-ip-range=10.0.0.0/24 \
--enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota,NodeRestriction \
--authorization-mode=RBAC,Node \
--kubelet-https=true \
--enable-bootstrap-token-auth \
--token-auth-file=/opt/kubernetes/cfg/token.csv \
--service-node-port-range=30000-50000 \
--tls-cert-file=/opt/kubernetes/ssl/server.pem  \
--tls-private-key-file=/opt/kubernetes/ssl/server-key.pem \
--client-ca-file=/opt/kubernetes/ssl/ca.pem \
--service-account-key-file=/opt/kubernetes/ssl/ca-key.pem \
--etcd-cafile=/opt/etcd/ssl/ca.pem \
--etcd-certfile=/opt/etcd/ssl/server.pem \
--etcd-keyfile=/opt/etcd/ssl/server-key.pem \
--requestheader-client-ca-file=/opt/kubernetes/ssl/ca.pem \ --requestheader-allowed-names=""     \
--requestheader-extra-headers-prefix=X-Remote-Extra- \
--requestheader-group-headers=X-Remote-Group    \
--requestheader-username-headers=X-Remote-User  \
--proxy-client-cert-file=/opt/kubernetes/ssl/metrics-proxy.pem  \
--proxy-client-key-file=/opt/kubernetes/ssl/metrics-proxy-key.pem"
#這7行配置一定要配置在最后

  參數說明:

  • --requestheader-XXX、--proxy-client-XXX 是 kube-apiserver 的 aggregator layer 相關的配置參數,metrics-server & HPA 需要使用;
  • --requestheader-client-ca-file:用於簽名 --proxy-client-cert-file 和 --proxy-client-key-file 指定的證書(ca證書),在啟用了 metric aggregator 時使用;

  注:如果 --requestheader-allowed-names 不為空,則--proxy-client-cert-file 證書的 CN 必須位於 allowed-names 中,默認為 aggregator;

  如果 kube-apiserver 機器沒有運行 kube-proxy,則還需要添加 --enable-aggregator-routing=true 參數

 

  在1.20版本中,復用了master的證書,不需要重新生成,並且,在安裝部署k8s集群的時候,就已經增加了該參數了

KUBE_APISERVER_OPTS="--logtostderr=false \
--v=2 \
--log-dir=/opt/kubernetes/logs \
--etcd-servers=https://172.21.161.112:2379,https://172.21.161.113:2379,https://172.21.161.114:2379 \
--bind-address=172.21.161.110 \
--secure-port=6443 \
--advertise-address=172.21.161.110 \
--allow-privileged=true \
--service-cluster-ip-range=10.0.0.0/24 \
--enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota,NodeRestriction \
--authorization-mode=RBAC,Node \
--enable-bootstrap-token-auth=true \
--token-auth-file=/opt/kubernetes/cfg/token.csv \
--service-node-port-range=30000-32767 \
--kubelet-client-certificate=/opt/kubernetes/ssl/server.pem \
--kubelet-client-key=/opt/kubernetes/ssl/server-key.pem \
--tls-cert-file=/opt/kubernetes/ssl/server.pem  \
--tls-private-key-file=/opt/kubernetes/ssl/server-key.pem \
--client-ca-file=/opt/kubernetes/ssl/ca.pem \
--service-account-key-file=/opt/kubernetes/ssl/ca-key.pem \
--service-account-issuer=api \
--service-account-signing-key-file=/opt/kubernetes/ssl/server-key.pem \
--etcd-cafile=/opt/etcd/ssl/ca.pem \
--etcd-certfile=/opt/etcd/ssl/server.pem \
--etcd-keyfile=/opt/etcd/ssl/server-key.pem \
--requestheader-client-ca-file=/opt/kubernetes/ssl/ca.pem \
--proxy-client-cert-file=/opt/kubernetes/ssl/server.pem \ --proxy-client-key-file=/opt/kubernetes/ssl/server-key.pem \ --requestheader-allowed-names=kubernetes \ --requestheader-extra-headers-prefix=X-Remote-Extra- \ --requestheader-group-headers=X-Remote-Group \ --requestheader-username-headers=X-Remote-User \
--enable-aggregator-routing=true \
--audit-log-maxage=30 \
--audit-log-maxbackup=3 \
--audit-log-maxsize=100 \
--audit-log-path=/opt/kubernetes/logs/k8s-audit.log"

  2.為metrics server生成證書

  上面可以看到,kube-apiserver開啟聚合層,也需要使用證書,為了便於區分,我們這里為mertics 單獨生產證書

  關於證書的創建也可參考之前部署其它組件時創建證書時候的步驟

  ## 創建kube-proxy證書請求

[root@k8s-master01 ~]# vim /opt/k8s/certs/metrics-proxy-csr.json 
{
  "CN": "metrics-proxy",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "ShangHai",
      "L": "ShangHai",
      "O": "metrics-proxy",
      "OU": "System"
    }
  ]
}

  ## 生成kube-proxy證書與私鑰

[root@k8s-master01 ~]# cd /opt/k8s-certs/
[root@k8s-master01 certs]# cfssl gencert -ca=/opt/kubernetes/ssl/ca.pem \
    -ca-key=/opt/kubernetes/ssl/ca-key.pem \
    -config=/opt/k8s-certs/ca-config.json \
    -profile=kubernetes metrics-proxy-csr.json | cfssljson -bare metrics-proxy
## 證書分發

  然后重啟kube-apiserver就可以了,使用如下命令可以簡單驗證

  如果有安裝prometheus operator,看以下pod的狀態是否正常

 

4.kube-state-metrics

4.1 介紹

  已經有了cadvisor、heapster、metric-server,幾乎容器運行的所有指標都能拿到,但是下面這種情況卻無能為力:

  • 我調度了多少個replicas?現在可用的有幾個?
  • 多少個Pod是running/stopped/terminated狀態?
  • Pod重啟了多少次?
  • 我有多少job在運行中

  而這些則是kube-state-metrics提供的內容,它基於client-go開發,輪詢Kubernetes API,並將Kubernetes的結構化信息轉換為metrics。

  kube-state-metrics是一個簡單的服務,它監聽Kubernetes API服務器並生成相關指標數據,它不單關注單個Kubernetes組件的運行情況,而是關注內部各種對象的運行狀況

  在K8s集群上Pod、DaemonSet、Deployment、Job、CronJob等各種資源對象的狀態也需要監控,這些指標主要來自於apiserver和kubelet中集成的cAvisor,但是並沒有具體的各種資源對象的狀態指標。對於Prometheus來說,當然是需要引入新的exporter來暴露這些指標,Kubernetes提供了一個kube-state-metrics

  kube-state-metrics已經給出了在Kubernetes部署的文件,我們直接將代碼Clone到集群中執行yaml文件即可

  將kube-state-metrics部署在kubernetes上之后,會發現kubernetes集群中的prometheus會在kube-state-metrics這個job下自動發現kube-state-metrics,並開始拉去metrics,這是因為部署kube-state-metrics的manifest定義文件kube-state-metrics-server.yaml對Service的定義包含prometheus.io/scrape: 'true'這樣的一個annotation。因此kube-state-metrics的endpoint可以被Prometheus自動發現

  關於kube-state-metrics暴露所有監控指標可以參考kube-state-metrics的文檔kube-state-metrics Documentation:https://github.com/kubernetes/kube-state-metrics/tree/master/docs

  簡單來說可以在prometheus里面使用endpoint的方式獲取監控key

  Git地址: https://github.com/kubernetes/kube-state-metrics

  監控項地址: https://github.com/kubernetes/kube-state-metrics/tree/master/docs

 

  下面是版本對比

  安裝介紹都在git文檔里面,只是有一些在prometheus獲取key需要在prometheus里面配置。

 

4.2 安裝

  1.安裝文件以及目錄

  在1.8的版本里面,只剩下5個文件,歸納為 權限文件和部署文件

  

  2.配置

  這里有2點需要修改。

  1).deployment

  在默認的文件里面,配置了node親和性,導致沒有標簽的node無法調度

  2).service.yaml

  因為prometheus從kube-state-metrics獲取信息,就要prometeus能夠獲取到它的api,所以需要增加以下:(kube-state-metrics的service文件就要加,因為prometehus通過這個配置自動發現kube-state-metrics,然后獲取監控數據,如果不加上,即使安裝成功kube-state-metrics,很多key也是沒有數據的)

  

  3.prometheus收集

  在配置里面 kube-state-metrics的service開啟了annotations,Prometheus就是通過這個來過濾出這個service的。

  Prometheus的具體配置在文章  <監控pormetheus集群的方式>→ Kubernetes監控配置 →集群內監控配置

  

  4.使用endpoinits監控service(番外)

  以上可以看出prometheus已經尋找到了,接下來,在prometheus就可以看到監控指標了

 

4.3 遺留問題

4.3.1 限制值

  本案例在這里沒有限制

  (該文章摘自git)

  集群狀態指標的資源使用量隨集群的Kubernetes對象(Pods / Nodes / Deployments / Secrets等)的大小而變化。在某種程度上,集群中的Kubernetes對象與集群的節點數成正比

作為一般規則,您應該分配

  • 200MiB內存
  • 0.1核心

  對於超過100個節點的集群,至少分配

  • 每個節點2 MiB內存
  • 每個節點0.001個核心

  這些數字基於每個節點30個Pod的可伸縮性測試

  請注意,如果將CPU限制設置得太低,則將無法足夠快地處理kube-state-metrics的內部隊列,從而導致隨着隊列長度的增加而增加的內存消耗。如果遇到內存分配過多導致的問題,請嘗試增加CPU限制。

 

4.3.2 優化點和問題

  kube-state-metrics在之前的版本中暴露出兩個問題:

1./metrics接口響應慢(10-20s)

2.內存消耗太大,導致超出limit被殺掉

  問題一的方案就是基於client-go的cache tool實現本地緩存,具體結構為:

  var cache = map[uuid][]byte{}

  問題二的的方案是:對於時間序列的字符串,是存在很多重復字符的(如namespace等前綴篩選),可以用指針或者結構化這些重復字符。

 

4.4 指標

  具體指標可以參考本文介紹的git地址


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM