如何用helm在k8s上快速部署Prometheus+Grafana
如果監(jiān)控的是物理機(jī),推薦使用 Zabbix 做監(jiān)控,Zabbix 在傳統(tǒng)的監(jiān)控系統(tǒng)中,尤其是在服務(wù)器監(jiān)控方面,占據(jù)絕對(duì)優(yōu)勢(shì)。但如果是云環(huán)境,非常推薦使用 Prometheus,Prometheus 已經(jīng)是容器監(jiān)控方面的標(biāo)配。
文章的內(nèi)容比較長(zhǎng),請(qǐng)看內(nèi)容提要:

文章概要
接下來(lái),我們就跟大家一起一步一步的演示,如何部署Prometheus,在安裝Prometheus之前,我們要安裝helm工具。
一 安裝Helm3
Helm 是什么?我們可以將 Helm 看作是 k8s 的 apt-get/yum。Helm 倉(cāng)庫(kù)里面只有配置清單文件,并沒(méi)有鏡像,鏡像還是由鏡像倉(cāng)庫(kù)來(lái)提供,比如 hub.docker.com、私有倉(cāng)庫(kù)等。
對(duì)于使用者而言,使用 Helm 的好處是,不需要了解 k8s 的 yaml 應(yīng)用部署文件了,可以通過(guò) Helm 下載并在 k8s 上安裝需要的應(yīng)用。
Helm 的官方地址:https://helm.sh
1.1 版本選擇
選擇安裝哪個(gè)版本的 Helm 呢?當(dāng)一個(gè) Helm 的新版本發(fā)布時(shí),它是針對(duì) Kubernetes 的一個(gè)特定的版本編譯的。
在 Helm 的官方地址,
https://helm.sh/zh/docs/topics/version_skew/,提供了 k8s 和 Helm 的兼容版本對(duì)照表。我僅僅列出了一部分,由于我安裝的k8s版本是1.22.6,因此,我選擇下載 Helm3.9.x版本。

helm版本兼容性
1.2 安裝helm
[bigdata@k8s-master ~]$ cd /opt/module/
# 下載安裝包
[bigdata@k8s-master module]$ wget https://get.helm.sh/helm-v3.9.4-linux-amd64.tar.gz
# 解壓壓縮包
[bigdata@k8s-master module]$ tar -zxvf helm-v3.9.4-linux-amd64.tar.gz?
# 在解壓目中找到helm程序,移動(dòng)到需要的目錄中
[bigdata@k8s-master module]$ sudo mv linux-amd64/helm /usr/local/bin/helm# 驗(yàn)證[bigdata@k8s-master module]$ helm version

安裝helm
1.3 配置倉(cāng)庫(kù)
安裝好 Helm 之后,就可以添加 chart 倉(cāng)庫(kù)了
# 添加公用的倉(cāng)庫(kù)
[bigdata@k8s-master module]$ helm repo add bitnami https://charts.bitnami.com/bitnami
# 配置helm阿里源地址
[bigdata@k8s-master module]$ helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
# 查看倉(cāng)庫(kù)
[bigdata@k8s-master module]$ helm repo list
當(dāng)添加完成,就可以看到可以被安裝的 chart 列表了:
[bigdata@k8s-master module]$ helm search repo bitnami

bitnami chart 列表
[bigdata@k8s-master module]$ helm search repo aliyun

阿里云chart 列表
二 選擇Prometheus的版本
既然是云原生的環(huán)境,我們就使用kube-prometheus,github地址:
https://github.com/prometheus-operator/kube-prometheus
目前Prometheus的版本已經(jīng)到了v0.11版,我們?cè)撓螺d哪個(gè)版本呢?

Prometheus版本列表
在 github 代碼下方,用一個(gè)表格介紹了 k8s 和 Prometheus 的兼容性。

k8s 和 Prometheus 的兼容性列表
由于我們安裝的 k8s 版本是 1.22.6,因此下載 Prometheus0.9 和 Prometheus0.10 都是可以的,我選擇下載比較新的版本:Prometheus0.10。

k8s 版本是 1.22.6
三 安裝kube-prometheus
3.1 下載kube-prometheus0.10
下載Prometheus0.10的過(guò)程會(huì)比較慢,有可能會(huì)失敗,可能需要重試幾次。
# 下載Prometheus0.10
[bigdata@k8s-master module]$ git clone https://github.com/prometheus-operator/kube-prometheus.git -b release-0.10
3.2 安裝kube-prometheus
安裝manifest/setup目錄下的所有yaml文件。
[bigdata@k8s-master kube-prometheus]$ kubectl apply --server-side -f manifests/setup

安裝kube-prometheus
安裝manifest目錄下的所有yaml文件,kube-prometheus默認(rèn)安裝在 monitoring 命名空間中,安裝過(guò)程是非常緩慢的,有些鏡像在國(guó)外,還會(huì)因?yàn)槔〔坏蕉惭b失敗。
[bigdata@k8s-master kube-prometheus]$ cd manifests/setup/?
[bigdata@k8s-master setup]$ until kubectl get servicemonitors --all-namespaces ; do date; sleep 1; echo ""; done
[bigdata@k8s-master setup]$ cd ../..?
[bigdata@k8s-master kube-prometheus]$ kubectl apply -f manifests/
我們通過(guò)下面的命令查看安裝進(jìn)度。
[get all -n monitoring
]$ kubectl

查看安裝進(jìn)度
3.3 處理pod下載失敗問(wèn)題
3.3.1 查看哪些pod拉取失敗
通過(guò)下面的命令,查看每個(gè)pod的安裝情況,發(fā)現(xiàn)有的pod狀態(tài)是ImagePullBackOff(重新拉?。?,一旦狀態(tài)變成ImagePullBackOff,就說(shuō)明拉取失敗了。如果不做處理,一直都拉取不到鏡像。
[bigdata@k8s-master module]$ kubectl get pods -n monitoring -o wide

查看哪些pod拉取失敗
3.3.2 查看pod報(bào)錯(cuò)信息
通過(guò)kubectl describe pod [pod_name] -n [namespace]命令,查看每個(gè)pod的安裝情況。
[bigdata@k8s-master module]$ kubectl describe pod kube-state-metrics-5fcb7d6fcb-zxtqj -n monitoring

查看pod報(bào)錯(cuò)信息
例如,上面這個(gè)pod的報(bào)錯(cuò)信息表示,從"
k8s.gcr.io/kube-state-metrics"中拉取kube-state-metrics:v2.3.0失敗,因此我們要修改這個(gè)鏡像源。需要找到該鏡像所在的yaml文件。
3.3.3 更改報(bào)錯(cuò)pod的鏡像源
kube-prometheus中的鏡像對(duì)應(yīng)的yaml文件非常好找,名字有對(duì)應(yīng)關(guān)系。例如:
k8s.gcr.io/kube-state-metrics/kube-state-metrics:v2.3.0 對(duì)應(yīng)的 yaml文件是:kubeStateMetrics-deployment.yaml
[bigdata@k8s-master manifests]$ vi kubeStateMetrics-deployment.yaml

更改報(bào)錯(cuò)pod的鏡像源
修成成什么樣的鏡像源呢?有一個(gè)非常好的網(wǎng)站https://hub.docker.com/,通過(guò)dockerhub查找對(duì)應(yīng)的鏡像,因?yàn)閐ockerhub上的資源都是可以pull下來(lái)的。
輸入kube-state-metrics,回車搜索。

搜索kube-state-metrics
選擇stars數(shù)量最多的倉(cāng)庫(kù)源,
bitnami/kube-state-metrics的Stars數(shù)量最多,點(diǎn)擊bitnami/kube-state-metrics。

選擇倉(cāng)庫(kù)源
里面有很多版本,需要找到我們按照的v2.3.0版本號(hào),點(diǎn)擊左側(cè)的復(fù)制,查看地址為:docker pull
bitnami/kube-state-metrics:2.3.0
kube-state-metrics:2.3.0
因此,將
kubeStateMetrics-deployment.yaml 中的 image 替換成?bitnami/kube-state-metrics:2.3.0
[bigdata@k8s-master manifests]$ vi kubeStateMetrics-deployment.yaml
image: bitnami/kube-state-metrics:2.3.0

kube-state-metrics:2.3.0
重新加載
kubeStateMetrics-deployment.yaml文件,helm會(huì)從新的鏡像地址拉取并按照pod。
[bigdata@k8s-master manifests]$ kubectl apply -f kubeStateMetrics-deployment.yaml
同樣的道理,我們?cè)偻ㄟ^(guò)kubectl get pods -n monitoring查看,現(xiàn)在還有prometheus-adpther報(bào)錯(cuò)。

kubectl get pods -n monitoring
同理,我們直接修改
prometheusAdapter-deployment.yaml的鏡像源。
[bigdata@k8s-master manifests]$ vi prometheusAdapter-deployment.yaml

kubectl get pods -n monitoring
在https://hub.docker.com/上找到,它的鏡像地址是:
willdockerhub/prometheus-adapter:v0.9.1
將
prometheusAdapter-deployment.yaml 中?k9s.gcr.io/prometheus-adapter:v0.9.1 的鏡像地址替換成willdockerhub/prometheus-adapter:v0.9.1

prometheusAdapter-deployment.yaml
然后執(zhí)行
prometheusAdapter-deployment.yaml 文件
[bigdata@k8s-master manifests]$ kubectl apply -f prometheusAdapter-deployment.yaml
以此類推,都是這樣重新拉取失敗的鏡像。拉取鏡像的時(shí)間還是比較長(zhǎng)的,這種方式肯定是可以拉取到的。
3.4 減少pod副本數(shù)量
經(jīng)過(guò)一段時(shí)間的努力,最后終于拉取成功。雖然拉取成功了,但是有的pod是3副本,有的pod是兩副本。由于我們演示環(huán)境的虛擬機(jī)配置比較低,需要減少一些副本數(shù)量。

減少pod副本數(shù)量
對(duì)于內(nèi)存空間本就不是很充裕的演示環(huán)境來(lái)說(shuō),就不考慮高可用了。在哪些yaml中配置了副本數(shù)量呢?
grep -rn 'replicas:' *

查找副本
安裝下面的副本策略,修改副本數(shù)量。
alertmanager-alertmanager.yaml(保留2副本)
prometheusAdapter-deployment.yaml(保留1副本)
prometheus-prometheus.yaml(保留1副本)
然后重新運(yùn)行yaml文件,驗(yàn)證副本數(shù)是否復(fù)合要求。
[bigdata@k8s-master kube-prometheus]$ kubectl apply -f manifests/?
[bigdata@k8s-master kube-prometheus]$ kubectl get pods -n monitoring

然后重新運(yùn)行yaml文件
也可以通過(guò)kubernetes dashboard,驗(yàn)證Prometheus+Grafana是否安裝成功??梢?jiàn)Prometheus+Grafana都已經(jīng)安裝成功。

驗(yàn)證Prometheus+Grafana是否安裝成功
查看svc,都已經(jīng)安裝成功。
[get svc -n monitoring
]$ kubectl

驗(yàn)證Prometheus+Grafana是否安裝成功
四 通過(guò)web訪問(wèn)Prometheus和Grafana
雖然現(xiàn)在pod都已經(jīng)安裝好了,但如果想訪問(wèn)Prometheus,還需要做一點(diǎn)修改。把訪問(wèn)類型改成type: NodePort。
4.1 修改alertmanager-service.yaml
Alertmanager除了基本的告警通知能力外,Alertmanager還支持對(duì)告警進(jìn)行去重、分組、抑制、靜默和路由等功能;在如下位置新增type: NodePort
[bigdata@k8s-master ~]$ cd /opt/module/kube-prometheus/manifests/[bigdata@k8s-master manifests]$ vi alertmanager-service.yaml

alertmanager-service.yaml
重新加載alertmanager-service.yaml
[bigdata@k8s-master manifests]$ kubectl apply -f alertmanager-service.yaml
[bigdata@k8s-master manifests]$ kubectl get svc -n monitoring

alertmanager-service.yaml
通過(guò)web方式訪問(wèn)Alertmanager

web方式訪問(wèn)Alertmanager
4.2 修改grafana-service.yaml
Grafana 是一款用 Go 語(yǔ)言開(kāi)發(fā)的開(kāi)源數(shù)據(jù)可視化工具,可以做數(shù)據(jù)監(jiān)控和數(shù)據(jù)統(tǒng)計(jì),帶有告警功能。
同樣,新增type: NodePort
[bigdata@k8s-master manifests]$ vi grafana-service.yaml

web方式訪問(wèn)Alertmanager
重新加載grafana-service.yaml 文件。
[bigdata@k8s-master manifests]$ kubectl apply -f grafana-service.yaml
[bigdata@k8s-master manifests]$ kubectl get svc -n monitoring

grafana-service.yaml
通過(guò)web方式訪問(wèn)Grafana,用戶名:密碼/admin:admin

訪問(wèn)Grafana
在Grafana上,可以展示自定義報(bào)表、圖表等。Grafana的UI更加靈活,有豐富的插件,功能強(qiáng)大。

訪問(wèn)Grafana

訪問(wèn)Grafana
4.3 修改prometheus-service.yaml
增加type: NodePort
[bigdata@k8s-master manifests]$ vi prometheus-service.yaml

prometheus-service.yaml
重新加載prometheus-service.yaml
[bigdata@k8s-master manifests]$ kubectl apply -f prometheus-service.yaml
[bigdata@k8s-master manifests]$ kubectl get svc -n monitoring

kubectl get svc -n monitoring
prometheus已經(jīng)幫我們配置好了一些監(jiān)控報(bào)警。

prometheus