云計(jì)算
一、簡(jiǎn)介
prometheus
prometheus 是一個(gè)開(kāi)源監(jiān)控系統(tǒng),它本身已經(jīng)成為了云原生中指標(biāo)監(jiān)控的事實(shí)標(biāo)準(zhǔn),幾乎所有 kubernetes 的核心組件以及其它云原生系統(tǒng)都以 prometheus 的指標(biāo)格式輸出自己的運(yùn)行時(shí)監(jiān)控信息。
主要特性:
使用指標(biāo)名稱(chēng)及鍵值對(duì)標(biāo)識(shí)的多維度數(shù)據(jù)模型。
采用彈性查詢(xún)語(yǔ)言promql。
不依賴(lài)分布式存儲(chǔ),為自治的單點(diǎn)服務(wù)。
使用http完成對(duì)監(jiān)控?cái)?shù)據(jù)的拉取。
通過(guò)網(wǎng)關(guān)支持時(shí)序數(shù)據(jù)的推送。
支持多種圖形和dashboard的展示。
另外在prometheus的整個(gè)生態(tài)系統(tǒng)中有各種可選組件,用于功能的擴(kuò)充。
prometheus-operator
coreos提供了一種名為operator的管理工具,他是管理特定應(yīng)用程序的控制器。通過(guò)擴(kuò)展kubernetes api以軟件的方式幫助用戶(hù)創(chuàng)建、配置和管理復(fù)雜的或又狀態(tài)的應(yīng)用程序?qū)嵗ㄈ鏴tcd、redis、mysql、prometheus等)。
它通過(guò)kubernetes的crd(custom resource definition,自定義資源定義)對(duì)prometheus和prometheus需要監(jiān)控的服務(wù)進(jìn)行部署和配置。
prometheus-operator使用下面兩種資源來(lái)配置prometheus及其要監(jiān)控的服務(wù)。
prometheus:為prometheus的deployment。
servicemonitor:用于描述prometheus監(jiān)控的服務(wù)。
首先我們先來(lái)了解下 prometheus-operator 的架構(gòu)圖:
上圖是 prometheus-operator 官方提供的架構(gòu)圖,其中 operator 是最核心的部分,作為一個(gè)控制器,他會(huì)去創(chuàng)建 prometheus 、 servicemonitor 、 alertmanager 以及 prometheusrule 4個(gè) crd 資源對(duì)象,然后會(huì)一直監(jiān)控并維持這4個(gè)資源對(duì)象的狀態(tài)。
其中創(chuàng)建的 prometheus 這種資源對(duì)象就是作為 prometheus server 存在,而 servicemonitor 就是 exporter 的各種抽象, exporter是用來(lái)提供專(zhuān)門(mén)提供 metrics 數(shù)據(jù)接口的工具, prometheus 就是通過(guò) servicemonitor 提供的 metrics 數(shù)據(jù)接口去 pull 數(shù)據(jù)的。
當(dāng)然 alertmanager 這種資源對(duì)象就是對(duì)應(yīng)的 alertmanager 的抽象,而 prometheusrule 是用來(lái)被 prometheus 實(shí)例使用的報(bào)警規(guī)則文件。
二、說(shuō)明
本文檔基于prometheus operator對(duì)prometheus監(jiān)控系統(tǒng)而進(jìn)行,完整的配置文件請(qǐng)參考https://github.com/coreos/prometheus-operator
本文使用的k8s集群是基于kubeadm搭建的,具體搭建的詳細(xì)請(qǐng)參考https://blog.51cto.com/billy98/2350660
三、部署
1. 環(huán)境準(zhǔn)備
配置prometheus-operator之前需要先準(zhǔn)備以下幾個(gè)環(huán)境:
helm環(huán)境:請(qǐng)參考https://blog.51cto.com/billy98/2338415
gluster-heketi環(huán)境:因?yàn)閜rometheus和alertmanager都是有狀態(tài)的statefulsets集群,所以需要使用到公共存儲(chǔ)。請(qǐng)參考https://blog.51cto.com/billy98/2337874
ingress環(huán)境:請(qǐng)參考https://blog.51cto.com/billy98/2337874
2. 配置域名解析
將alert.cnlinux.club、grafana.cnlinux.club、prom.cnlinux.club三個(gè)域名的a記錄解析到負(fù)責(zé)均衡的ip10.31.90.200。
3. 修改scheduler、controller-manager監(jiān)聽(tīng)地址
修改/etc/kubernetes/manifests/ 目錄下kube-controller-manager.yaml和kube-scheduler.yaml
將監(jiān)聽(tīng)地址改成--address=0.0.0.0,重啟kubelet服務(wù)
systemctl restart kubelet.service 4. 創(chuàng)建namespace
kubectl create ns monitoring5. 創(chuàng)建secret
因?yàn)閑tcd是使用https訪問(wèn)的,所以prometheus的容器中也必須要etcd的證書(shū)去監(jiān)控etcd集群,創(chuàng)建secret就是將證書(shū)掛載到prometheus容器中,后續(xù)還需要在prometheus-operator的配置文件中使用此secret。
kubectl -n monitoring create secret generic etcd-certs --from-file=/etc/kubernetes/pki/etcd/healthcheck-clien t.crt --from-file=/etc/kubernetes/pki/etcd/healthcheck-client.key --from-file=/etc/kubernetes/pki/etcd/ca.crt 6. 配置prometheus-operator
1)首先使用helm下載prometheus-operator文件包。
helm fetch stable/prometheus-operator2)解壓下載的壓縮包
tar zxf prometheus-operator-1.8.0.tgz并修改prometheus-operator目錄下的values.yaml。
具體修改的配置如下(配置過(guò)多,其他未修改的就不再展示了):
nameoverride: palertmanager: ingress: enabled: true annotations: kubernetes.io/ingress.class: nginx labels: {} hosts: - alert.cnlinux.club tls: [] alertmanagerspec: storage: volumeclaimtemplate: spec: storageclassname: gluster-heketi accessmodes: [readwriteonce] resources: requests: storage: 20gi selector: {}grafana: enabled: true admin #grafana登錄密碼 ingress: enabled: true annotations: kubernetes.io/ingress.class: nginx labels: {} hosts: - grafana.cnlinux.clubkubeapiserver: enabled: true tlsconfig: servername: kubernetes insecureskipverify: true servicemonitor: joblabel: component selector: matchlabels: component: apiserver provider: kuberneteskubelet: enabled: true namespace: kube-system servicemonitor: https: truekubecontrollermanager: enabled: true endpoints: [] service: port: 10252 targetport: 10252 selector: component: kube-controller-managercoredns: enabled: true service: port: 9153 targetport: 9153 selector: k8s-app: kube-dnskubeetcd: enabled: true endpoints: [] service: port: 2379 targetport: 2379 selector: component: etcd servicemonitor: scheme: https insecureskipverify: false servername: cafile: /etc/prometheus/secrets/etcd-certs/