1. 程式人生 > >k8s全棧監控之metrics-server和prometheus-operator

k8s全棧監控之metrics-server和prometheus-operator

一、概述

  • 使用metric-server收集資料給k8s叢集內使用,如kubectl,hpa,scheduler等
  • 使用prometheus-operator部署prometheus,儲存監控資料
  • 使用kube-state-metrics收集k8s叢集內資源物件資料
  • 使用node_exporter收集叢集中各節點的資料
  • 使用prometheus收集apiserver,scheduler,controller-manager,kubelet元件資料
  • 使用alertmanager實現監控報警
  • 使用grafana實現資料視覺化

1、部署metrics-server

mkdir  k8s-monitor
cd  k8s-monitor
git clone https://github.com/kubernetes-incubator/metrics-server.git
cd metrics-server  
# 修改配置(當前版本有bug)
sed -ri '[email protected]/google_containers/metrics-server-amd64:(.*)@mirrorgooglecontainers/metrics-server-amd64:\[email protected]
' metrics-server/deploy/1.8+/metrics-server-deployment.yaml sed -ri '[email protected]=kubernetes.summary_api:.*@--source=kubernetes.summary_api:https://kubernetes.default?kubeletHttps=true\&kubeletPort=10250\&[email protected]' metrics-server/deploy/1.8+/metrics-server-deployment.yaml 如果使用kubeadm部署的,可能會有個這樣的報錯: x509: certificate signed by unknown authority 需要修改一下metrics
-server的deployment檔案,即metrics-server-deployment.yaml containers: - name: metrics-server image: k8s.gcr.io/metrics-server-amd64:v0.3.1 imagePullPolicy: Always command: - /metrics-server - --kubelet-insecure-tls
        - --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP
volumeMounts: - name: tmp-dir mountPath: /tmp
kubectl create -f metrics-server/deploy/1.8+/

驗證:

it's cool,但是這種方式不是很好。

注:metrics-server預設使用node的主機名,但是coredns裡面沒有物理機主機名的解析,一種是部署的時候新增一個引數:

- --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP

第二種是使用dnsmasq構建一個上游的dns服務,參照https://www.cnblogs.com/cuishuai/p/9856843.html。

 

 

2、部署prometheus-operator

prometheus-operator是一個整合prometheus和operator的專案,prometheus是一個集資料收集儲存,資料查詢,資料圖表顯示於一身的開源監控元件。operator是由coreos開源一套在k8s上管理應用的軟體,通過operator可以方便的實現部署,擴容,刪除應用等功能。

prometheus-operator利用k8s的CustomResourceDefinitions功能實現了只需要像寫原生kubectl支援的yaml檔案一樣,輕鬆收集應用資料,配置報警規則等,包含如下CRDs :

  • Prometheus 用於部署Prometheus 例項
  • ServiceMonitor 用於配置資料收集,建立之後會根據DNS自動發現並收集資料
  • PrometheusRule 用於配置Prometheus 規則,處理規整資料和配置報警規則
  • Alertmanager 用於部署報警例項
下載相關檔案
git clone https://github.com/mgxian/k8s-monitor.git
cd  k8s-monitor
#建立namespace,monitoring
kubectl apply -f monitoring-namespace.yaml
#部署prometheus-operator
kubectl apply -f prometheus-operator.yaml

部署k8s元件
kubectl apply -f kube-k8s-service.yaml

部署node_exporter
kubectl apply -f node_exporter.yaml

部署kube-state-metrics
kubectl apply -f kube-state-metrics.yaml

部署prometheus
kubectl apply -f prometheus.yaml

收集資料
kubectl apply -f kube-servicemonitor.yaml

部署grafana
kubectl apply -f grafana.yaml

部署altermanager
kubectl apply -f alertmanager.yaml

 

檢視部署:

 

prometheus和grafana都是採用的nodePort方式暴漏的服務,所以可以直接訪問。

grafana預設的使用者名稱密碼:admin/admin

 

 

 

QA:

1、叢集是使用kubeadm部署的,controller-manager和schedule都是監聽的127.0.0.1,導致prometheus收集不到相關的資料?

可以在初始化之前修改其監聽地址:

controllerManagerExtraArgs:
address: 0.0.0.0
schedulerExtraArgs:
address: 0.0.0.0

如果叢集已經構建好了:

sed -e "s/- --address=127.0.0.1/- --address=0.0.0.0/" -i /etc/kubernetes/manifests/kube-controller-manager.yaml
sed -e "s/- --address=127.0.0.1/- --address=0.0.0.0/" -i /etc/kubernetes/manifests/kube-scheduler.yaml

 

2、metrics-server不能使用,報錯不能解析node節點的主機名?

需要修改deployment檔案,

- --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP

3、metrics-server報錯,x509,證書是非信任的?

 

 

 command:
        - /metrics-server
        - --kubelet-insecure-tls

 

4、完整的配置檔案

containers:
      - name: metrics-server
        image: k8s.gcr.io/metrics-server-amd64:v0.3.1
        command:
        - /metrics-server
        - --metric-resolution=30s
        - --kubelet-insecure-tls
        - --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP