大家好,这是一篇用helm安装Prometheus+Grafana的文章,大家可以按照文章的执行步骤安装helm、Prometheus和Grafana。通过helm安装Prometheus的步骤并不难,可以说非常简单,几条命令就可以搞定。唯一的难点就是有些镜像在国外,我们下载不到。我们在这篇文章中,不但和大家一步一步的安装Prometheus+Grafana,还要介绍如何下载这些国外的镜像。

在云原生的时代,Prometheus是监控届当之无愧的老大;在早些年,容器(Docker)还没有出现的时候,都是使用 Zabbix 和 Nagios 做监控。

总的来说,Zabbix 的成熟度更高,上手更快,但 Zabbix 的灵活性较差,更大的问题是,随着监控数据复杂度的增加,在 Zabbix 上做进一步的定制难度非常高。

Prometheus 正相反,上手难度大一些,但定制灵活度高,上手后的使用难度远小于 Zabbix。

如果监控的是物理机,推荐使用 Zabbix 做监控,Zabbix 在传统的监控系统中,尤其是在服务器监控方面,占据绝对优势。但如果是云环境,非常推荐使用 Prometheus,Prometheus 已经是容器监控方面的标配

文章的内容比较长,请看内容提要:

文章概要

接下来,我们就跟大家一起一步一步的演示,如何部署Prometheus,在安装Prometheus之前,我们要安装helm工具。

一 安装Helm3

Helm 是什么?我们可以将 Helm 看作是 k8s 的 apt-get/yum。Helm 仓库里面只有配置清单文件,并没有镜像,镜像还是由镜像仓库来提供,比如 hub.docker.com、私有仓库等。

对于使用者而言,使用 Helm 的好处是,不需要了解 k8s 的 yaml 应用部署文件了,可以通过 Helm 下载并在 k8s 上安装需要的应用。

Helm 的官方地址:https://helm.sh

1.1 版本选择

选择安装哪个版本的 Helm 呢?当一个 Helm 的新版本发布时,它是针对 Kubernetes 的一个特定的版本编译的。

在 Helm 的官方地址,
https://helm.sh/zh/docs/topics/version_skew/,提供了 k8s 和 Helm 的兼容版本对照表。我仅仅列出了一部分,由于我安装的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程序,移动到需要的目录中
[bigdata@k8s-master module]$ sudo mv linux-amd64/helm /usr/local/bin/helm
# 验证
[bigdata@k8s-master module]$ helm version

安装helm

1.3 配置仓库

  • 安装好 Helm 之后,就可以添加 chart 仓库了
# 添加公用的仓库
[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
# 查看仓库
[bigdata@k8s-master module]$ helm repo list
  • 当添加完成,就可以看到可以被安装的 chart 列表了:
[bigdata@k8s-master module]$ helm search repo bitnami

bitnami chart 列表

[bigdata@k8s-master module]$ helm search repo aliyun

阿里云chart 列表

二 选择Prometheus的版本

既然是云原生的环境,我们就使用kube-prometheus,github地址:
https://github.com/prometheus-operator/kube-prometheus

目前Prometheus的版本已经到了v0.11版,我们该下载哪个版本呢?

Prometheus版本列表

在 github 代码下方,用一个表格介绍了 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的过程会比较慢,有可能会失败,可能需要重试几次。

# 下载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默认安装在 monitoring 命名空间中,安装过程是非常缓慢的,有些镜像在国外,还会因为拉取不到而安装失败。

[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/

我们通过下面的命令查看安装进度。

[bigdata@k8s-master kube-prometheus]$ kubectl get all -n monitoring

查看安装进度

3.3 处理pod下载失败问题

3.3.1 查看哪些pod拉取失败

通过下面的命令,查看每个pod的安装情况,发现有的pod状态是ImagePullBackOff(重新拉取),一旦状态变成ImagePullBackOff,就说明拉取失败了。如果不做处理,一直都拉取不到镜像。

[bigdata@k8s-master module]$ kubectl get pods -n monitoring -o wide

查看哪些pod拉取失败

3.3.2 查看pod报错信息

通过kubectl describe pod [pod_name] -n [namespace]命令,查看每个pod的安装情况。

[bigdata@k8s-master module]$ kubectl describe pod kube-state-metrics-5fcb7d6fcb-zxtqj -n monitoring

查看pod报错信息

例如,上面这个pod的报错信息表示,从"
k8s.gcr.io/kube-state-metrics"中拉取kube-state-metrics:v2.3.0失败,因此我们要修改这个镜像源。需要找到该镜像所在的yaml文件。

3.3.3 更改报错pod的镜像源

kube-prometheus中的镜像对应的yaml文件非常好找,名字有对应关系。例如:
k8s.gcr.io/kube-state-metrics/kube-state-metrics:v2.3.0 对应的 yaml文件是:kubeStateMetrics-deployment.yaml

[bigdata@k8s-master manifests]$ vi kubeStateMetrics-deployment.yaml

更改报错pod的镜像源

修成成什么样的镜像源呢?有一个非常好的网站https://hub.docker.com/,通过dockerhub查找对应的镜像,因为dockerhub上的资源都是可以pull下来的。

输入kube-state-metrics,回车搜索。

搜索kube-state-metrics

选择stars数量最多的仓库源,
bitnami/kube-state-metrics的Stars数量最多,点击bitnami/kube-state-metrics。

选择仓库源

里面有很多版本,需要找到我们按照的v2.3.0版本号,点击左侧的复制,查看地址为: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会从新的镜像地址拉取并按照pod。

[bigdata@k8s-master manifests]$ kubectl apply -f kubeStateMetrics-deployment.yaml

同样的道理,我们再通过kubectl get pods -n monitoring查看,现在还有prometheus-adpther报错。

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

然后执行
prometheusAdapter-deployment.yaml 文件

[bigdata@k8s-master manifests]$ kubectl apply -f prometheusAdapter-deployment.yaml

以此类推,都是这样重新拉取失败的镜像。拉取镜像的时间还是比较长的,这种方式肯定是可以拉取到的。

3.4 减少pod副本数量

经过一段时间的努力,最后终于拉取成功。虽然拉取成功了,但是有的pod是3副本,有的pod是两副本。由于我们演示环境的虚拟机配置比较低,需要减少一些副本数量。

减少pod副本数量

对于内存空间本就不是很充裕的演示环境来说,就不考虑高可用了。在哪些yaml中配置了副本数量呢?

grep -rn 'replicas:' *

查找副本

安装下面的副本策略,修改副本数量。

  • alertmanager-alertmanager.yaml(保留2副本)
  • prometheusAdapter-deployment.yaml(保留1副本)
  • prometheus-prometheus.yaml(保留1副本)

然后重新运行yaml文件,验证副本数是否复合要求。

[bigdata@k8s-master kube-prometheus]$ kubectl apply -f manifests/
[bigdata@k8s-master kube-prometheus]$ kubectl get pods -n monitoring

然后重新运行yaml文件

也可以通过kubernetes dashboard,验证Prometheus+Grafana是否安装成功。可见Prometheus+Grafana都已经安装成功。

验证Prometheus+Grafana是否安装成功

查看svc,都已经安装成功。

[bigdata@k8s-master ~]$ kubectl get svc -n monitoring

验证Prometheus+Grafana是否安装成功

四 通过web访问Prometheus和Grafana

虽然现在pod都已经安装好了,但如果想访问Prometheus,还需要做一点修改。把访问类型改成type: NodePort。

4.1 修改alertmanager-service.yaml

Alertmanager除了基本的告警通知能力外,Alertmanager还支持对告警进行去重、分组、抑制、静默和路由等功能;在如下位置新增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

通过web方式访问Alertmanager

web方式访问Alertmanager

4.2 修改grafana-service.yaml

Grafana 是一款用 Go 语言开发的开源数据可视化工具,可以做数据监控和数据统计,带有告警功能。

同样,新增type: NodePort

[bigdata@k8s-master manifests]$ vi grafana-service.yaml 

web方式访问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

通过web方式访问Grafana,用户名:密码/admin:admin

访问Grafana

在Grafana上,可以展示自定义报表、图表等。Grafana的UI更加灵活,有丰富的插件,功能强大。

访问Grafana

访问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已经帮我们配置好了一些监控报警。

prometheus