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