一.單獨(dú)部署
二進(jìn)制安裝
各版本下載地址:https://prometheus.io/download/Docker運(yùn)行
運(yùn)行命令:docker run --name prometheus -d -p 127.0.0.1:9090:9090 prom/prometheus
暴露服務(wù): http://localhost:9090/
二.在K8S中部署
如果在Kubernetes中部署Prometheus,可以使用prometheus in kubernetes,含exporter、grafana等組件。
安裝方式:
kubectl apply \
--filename https://raw.githubusercontent.com/giantswarm/kubernetes-prometheus/master/manifests-all.yaml
卸載方式:
kubectl delete namespace monitoring
該方式為大多數(shù)用戶和云廠商使用的方式,可以基于Prometheus的服務(wù)發(fā)現(xiàn):在annotation中設(shè)置prometheus.io/scrape為true,就可以把K8S的所有服務(wù)都加入到監(jiān)控中,但在使用的過程中會(huì)有一些問題:
- 1.如果增加了新的exporter,如nginx-exporter,需要修改prometheus配置并重啟
- 2.服務(wù)本身和監(jiān)控配置沒有分離
- 3.監(jiān)控集群多實(shí)例的狀態(tài)不好管理
- 4.報(bào)警配置也包含在prometheus的配置中,監(jiān)控與報(bào)警沒有分離,添加規(guī)則麻煩
以上問題一般的處理方式為:在prometheus上加一個(gè)控制臺(tái),來動(dòng)態(tài)配置target、報(bào)警規(guī)則,并向后端server發(fā)起修改、重啟操作。同時(shí)有權(quán)限控制、日志審計(jì)、整體配置過期時(shí)間等功能。
但如果使用了Prometheus Operator,就可以將以上大多數(shù)操作抽象為k8s中的資源提交、修改,減少上層封裝的工作量。
三.Prometheus Operator部署
Prometheus-Operator是一套為了方便整合prometheus和kubernetes的開源方案,使用Prometheus-Operator可以非常簡(jiǎn)單的在kubernetes集群中部署Prometheus服務(wù),用戶能夠使用簡(jiǎn)單的聲明性配置來配置和管理Prometheus實(shí)例,這些配置將響應(yīng)、創(chuàng)建、配置和管理Prometheus監(jiān)控實(shí)例。
- 官方地址:https://github.com/coreos/prometheus-operator
- 目前狀態(tài):beta狀態(tài),還不夠完整,但向后兼容。將成為趨勢(shì)
- 前置條件:要求k8s的版本>=1.8.0(應(yīng)該是因?yàn)閙etric api和CRD支持的限制)
Operator的核心思想是將Prometheus的部署與它監(jiān)控的對(duì)象的配置分離,做到部署與監(jiān)控對(duì)象的配置分離之后,就可以輕松實(shí)現(xiàn)動(dòng)態(tài)配置。使用Operator部署了Prometheus之后就可以不用再管Prometheus Server了,以后如果要添加監(jiān)控對(duì)象或者添加告警規(guī)則,只需要編寫對(duì)應(yīng)的ServiceMonitor和Prometheus資源就可以,不用再重啟Prometheus服務(wù),Operator會(huì)動(dòng)態(tài)的觀察配置的改動(dòng),并將其生成為對(duì)應(yīng)的prometheus配置文件其中Operator可以部署、管理Prometheus Service

四種CRD作用如下:
Prometheus: 由 Operator 依據(jù)一個(gè)自定義資源kind: Prometheus類型中,所描述的內(nèi)容而部署的 Prometheus Server 集群,可以將這個(gè)自定義資源看作是一種特別用來管理Prometheus Server的StatefulSets資源。
ServiceMonitor: 一個(gè)Kubernetes自定義資源(和kind: Prometheus一樣是CRD),該資源描述了Prometheus Server的Target列表,Operator 會(huì)監(jiān)聽這個(gè)資源的變化來動(dòng)態(tài)的更新Prometheus Server的Scrape targets并讓prometheus server去reload配置(prometheus有對(duì)應(yīng)reload的http接口/-/reload)。而該資源主要通過Selector來依據(jù) Labels 選取對(duì)應(yīng)的Service的endpoints,并讓 Prometheus Server 通過 Service 進(jìn)行拉?。ɡ┲笜?biāo)資料(也就是metrics信息),metrics信息要在http的url輸出符合metrics格式的信息,ServiceMonitor也可以定義目標(biāo)的metrics的url。
Alertmanager:Prometheus Operator 不只是提供 Prometheus Server 管理與部署,也包含了 AlertManager,并且一樣通過一個(gè) kind: Alertmanager 自定義資源來描述信息,再由 Operator 依據(jù)描述內(nèi)容部署 Alertmanager 集群。
PrometheusRule:對(duì)于Prometheus而言,在原生的管理方式上,我們需要手動(dòng)創(chuàng)建Prometheus的告警文件,并且通過在Prometheus配置中聲明式的加載。而在Prometheus Operator模式中,告警規(guī)則也編程一個(gè)通過Kubernetes API 聲明式創(chuàng)建的一個(gè)資源.告警規(guī)則創(chuàng)建成功后,通過在Prometheus中使用想servicemonitor那樣用ruleSelector通過label匹配選擇需要關(guān)聯(lián)的PrometheusRule即可。
安裝方式:
- 創(chuàng)建命名空間:monitoring
- 執(zhí)行yaml文件:https://github.com/coreos/prometheus-operator/tree/master/contrib/kube-prometheus/manifests
prometheus的target列表:

grafana的自帶監(jiān)控圖列表:


常見問題:
因?yàn)橐猳perator中要支持聚合api,在某些版本的集群上可能需要一些配置,如下:
- 安裝cfssl證書生成工具:http://www.cnblogs.com/xulingjie/p/9647213.html
- 生成證書
cfssl gencert -ca=/etc/kubernetes/pki/ca.pem -ca-key=/etc/kubernetes/pki/ca-key.pem -config=/etc/kubernetes/pki/ca-config.json -profile=jpaas metrics-server-csr.json | cfssljson -bare metrics-server
{
"CN": "aggregator",
"host": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "cloudnative"
}
]
}
- 配置master組件參數(shù),以支持metric-server
vim /etc/systemd/system/kube-apiserver.service
--requestheader-client-ca-file=/etc/kubernetes/pki/ca.pem \
--requestheader-allowed-names="aggregator" \
--requestheader-extra-headers-prefix="X-Remote-Extra-" \
--requestheader-group-headers=X-Remote-Group \
--requestheader-username-headers=X-Remote-User \
--proxy-client-cert-file=/etc/kubernetes/pki/metrics-server.pem \
--proxy-client-key-file=/etc/kubernetes/pki/metrics-server-key.pem \
--runtime-config=api/all=true \
--enable-aggregator-routing=true \
systemctl daemon-reload
systemctl restart kube-apiserver.service
systemctl status kube-apiserver.service
vim /etc/systemd/system/kube-controller.service
--horizontal-pod-autoscaler-use-rest-clients=true
systemctl daemon-reload
systemctl restart kube-controller.service
systemctl status kube-controller.service
- 啟動(dòng)成功后,prometheus的target中,kubelet沒有值,401報(bào)錯(cuò)
vim /etc/systemd/system/kubelet.service
--authentication-token-webhook=true
--authorization-mode=Webhook
systemctl daemon-reload
systemctl restart kubelet.service
參考文檔:
- https://github.com/coreos/prometheus-operator
- https://www.yinjk.cn/2018/09/06/Prometheus-Operator/
- http://www.servicemesher.com/blog/prometheus-operator-manual/
本文為容器監(jiān)控實(shí)踐系列文章,完整內(nèi)容見:container-monitor-book