Kubernetes(k8s)helm 搭建 prometheus + Grafana 监控
一、集群信息
- 方法因人而异,但大同小异,以下是我的部署方法。
1.1、 主机信息
主机名 | ip地址 | 描述 | 核心 | 内存 |
---|---|---|---|---|
node-01 | 192.167.7.131 | master 节点 | 2核 | 8G |
node-02 | 192.167.7.132 | node 节点 | 2核 | 8G |
node-03 | 192.167.7.133 | node 节点 | 2核 | 8G |
node-04 | 192.167.7.133 | node 节点 | 2核 | 8G |
1.2、版本说明
服务 | 版本 |
---|---|
helm | 3.1.1 |
grafana | 4.0.4 |
prometheus | 11.0.1 |
Kubernetes | 1.16.3 |
nfs-client-provisioner | 1.2.8 |
二、部署 NFS 服务
2.1、 安装 NFS 与 rpcbind 服务
# 创建 NFS 存储目录
mkdir -p /data/NFS
# 安装nfs服务
yum -y install nfs-utils rpcbind
# 修改配置文件
echo "/data/NFS *(rw,sync,no_root_squash,no_subtree_check)" > /etc/exports
# 启动服务
systemctl start nfs && systemctl start rpcbind
# 设置开机启动
systemctl enable nfs-server && systemctl enable rpcbind
2.2、集群节点安装 nfs
- 重点全部节点都需要安装 nfs-utils 安装了即可不需要配置,否则节点无法挂载 PV
# 安装nfs服务
yum -y install nfs-utils
三、部署 Prometheus
3.1、 创建名称空间
- 创建一个 monitoring 名称空间,将监控项目放在这个名称空间上
kubectl create ns monitoring
3.2、创建持久化目录
- 创建需要的持久化目录
- 开启数据持久化必须给 prometheus 目录权限,否则因为权限不够报错,默认使用 65534 运行
mkdir -p /data/NFS/monitoring/{prometheus,pushgateway,alertmanager}
chmod 775 -R /data/NFS/monitoring
chown nobody:nogroup -R /data/NFS/monitoring
3.3、获取 Prometheus
# 下载到本地,默认拉取指定版本
helm pull stable/prometheus --version 11.0.1
# 解压
tar xvf prometheus-*.tgz
3.4、创建 Prometheus Pv 配置
# 下面代码直接复制黏贴即可
cat > prometheus/templates/prometheus-pv.yaml << EOF
---
{{- if .Values.server.persistentVolume.enabled -}}
# server pv 配置
apiVersion: v1
kind: PersistentVolume
metadata:
name: {{ .Values.server.persistentVolume.storageClass }}
spec:
capacity:
storage: {{ .Values.server.persistentVolume.size }}
accessModes:
- ReadWriteOnce
volumeMode: Filesystem
persistentVolumeReclaimPolicy: Retain
storageClassName: {{ .Values.server.persistentVolume.storageClass }}
nfs:
path: {{ .Values.nfs.PrometheusPath }}
server: {{ .Values.nfs.server }}
{{ end }}
---
# serpushgatewayver pv 配置
{{- if .Values.pushgateway.persistentVolume.enabled -}}
apiVersion: v1
kind: PersistentVolume
metadata:
name: {{ .Values.pushgateway.persistentVolume.storageClass }}
spec:
capacity:
storage: {{ .Values.pushgateway.persistentVolume.size }}
accessModes:
- ReadWriteOnce
volumeMode: Filesystem
persistentVolumeReclaimPolicy: Retain
storageClassName: {{ .Values.pushgateway.persistentVolume.storageClass }}
nfs:
path: {{ .Values.nfs.PushgatewayPath }}
server: {{ .Values.nfs.server }}
{{ end }}
---
{{- if .Values.alertmanager.persistentVolume.enabled -}}
# alertmanager pv 配置
apiVersion: v1
kind: PersistentVolume
metadata:
name: {{ .Values.alertmanager.persistentVolume.storageClass }}
spec:
capacity:
storage: {{ .Values.alertmanager.persistentVolume.size }}
accessModes:
- ReadWriteOnce
volumeMode: Filesystem
persistentVolumeReclaimPolicy: Retain
storageClassName: {{ .Values.alertmanager.persistentVolume.storageClass }}
nfs:
path: {{ .Values.nfs.PlertmanagerPath }}
server: {{ .Values.nfs.server }}
{{ end }}
EOF
3.5、使用 helm 安装 Prometheus 与 Alertmanager 告警
- 多副本 Prometheus 有一个会启动失败报错:err="opening storage failed: lock DB directory: resource temporarily unavailable"
- 删除 Prometheus 目录下的 lock 文件过会就正常了
- chmod 775 -R /data/NFS/monitoring
- chown nobody:nogroup -R /data/NFS/monitoring
cat > prometheus.yaml << EOF
# Prometheus 配置
server:
# 副本数量
replicaCount: 2
persistentVolume:
# 判断是否创建 pv
enabled: false
size: 10Gi
storageClass: monitoring-prometheus-nfs
accessModes:
- ReadWriteOnce
# pushgateway 配置
pushgateway:
# 副本数量
replicaCount: 2
persistentVolume:
# 判断是否创建 pv
enabled: false
size: 2Gi
storageClass: monitoring-pushgateway-nfs
accessModes:
- ReadWriteOnce
# alertmanager 配置
alertmanager:
# 副本数量
replicaCount: 2
persistentVolume:
# 判断是否创建 pv
enabled: false
size: 2Gi
storageClass: monitoring-alertmanager-nfs
accessModes:
- ReadWriteOnce
# nodeExporter 配置
nodeExporter:
tolerations:
# 当不指定key值时,表示容忍所有的污点key。这样 Kubernetes master 节点也可以监控
- operator: Exists
# Prometheus 报警配置
serverFiles:
alerting_rules.yml:
groups:
- name: 实例存活告警
rules:
- alert: 实例存活告警
expr: up == 0
for: 1m
labels:
severity: warning
annotations:
description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 1 minutes."
# alertmanager 报警配置
alertmanagerFiles:
alertmanager.yml:
global:
smtp_smarthost: 'smtp.exmail.qq.com:465'
smtp_from: 'mail.com'
smtp_auth_username: 'mail.com'
smtp_auth_password: 'Y4Hq2Gu5Pu97G4PY'
smtp_require_tls: false
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 10m
receiver: live-monitoring
receivers:
- name: 'live-monitoring'
email_configs:
- to: 'mail.com'
nfs:
PrometheusPath: /monitoring/prometheus
PushgatewayPath: /monitoring/pushgateway
PlertmanagerPath: /monitoring/alertmanager
server: 192.168.8.251
EOF
# helm 部署 prometheus
helm install prometheus -n monitoring --values prometheus.yaml prometheus/
3.6、查看 Prometheus Pvc 状态
- 查看 Prometheus
[root@Node-01 ~]# kubectl get pvc -n monitoring
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
grafana Bound monitoring-grafana-nfs 2Gi RWO monitoring-grafana-nfs 13s
prometheus-server Bound monitoring-prometheus-nfs 10Gi RWO monitoring-prometheus-nfs 14s
3.7、查看 Prometheus Pod 状态
- 如果 prometheus-server 无法正常启动说明持久化目录权限问题
[root@Node-01 ~]# kubectl get pod -n monitoring -w
NAME READY STATUS RESTARTS AGE
prometheus-alertmanager-86cf8f4f54-h87jm 2/2 Running 0 46s
prometheus-kube-state-metrics-6756bbbb8-dbtsx 1/1 Running 0 46s
prometheus-node-exporter-d6l4m 1/1 Running 0 46s
prometheus-node-exporter-mlql5 1/1 Running 0 46s
prometheus-node-exporter-rpf5d 1/1 Running 0 46s
prometheus-pushgateway-575796c485-rvnd7 1/1 Running 0 46s
prometheus-server-65c7964ddc-cjtnc 2/2 Running 0 46s
3.8、测试钉钉告警机器人
curl -H "Content-Type: application/json" -d '{"msgtype":"text","text":{"content":"普罗米修斯监控报警测试"}}' \
https://oapi.dingtalk.com/robot/send?access_token=省略一串字符
四、访问 Prometheus 仪表盘
- 下面通过 2 个例子访问 prometheus 与 node-exporter 如果需要访问其他以此类推
4.1、 查看 Prometheus Svc 状态
- 名称空间是 monitoring
- prometheus-server 将这个暴露出去,可以看到端口是 80
[root@Node-01 ~]# kubectl get svc -n monitoring
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
prometheus-alertmanager ClusterIP 10.1.211.84 <none> 80/TCP 100s
prometheus-kube-state-metrics ClusterIP 10.1.154.244 <none> 8080/TCP 100s
prometheus-node-exporter ClusterIP None <none> 9100/TCP 100s
prometheus-pushgateway ClusterIP 10.1.165.243 <none> 9091/TCP 100s
prometheus-server ClusterIP 10.1.206.240 <none> 80/TCP 100s
4.2、访问 prometheus 仪表盘
- 这个方法适合临时访问使用,结束运行就不能通过浏览器访问了
- 通过浏览器输入 ip 地址访问即可
kubectl -n monitoring port-forward svc/prometheus-server 80 --address 192.167.8.251
4.3、访问 node-exporter
- 这个方法适合临时访问使用,结束运行就不能通过浏览器访问了
- 通过浏览器输入 ip 地址访问即可
kubectl -n monitoring port-forward svc/prometheus-node-exporter 9100 --address 192.167.8.251
4.4、ClusterIP 改 NodePort
- 这里以 prometheus-server 为例
- 找到最下面 type: ClusterIP 改为 type: NodePort 保存即可
# 编辑 prometheus-server
kubectl edit svc -n monitoring prometheus-server
# 找到最下面 type: ClusterIP 改为 type: NodePort 保存即可
# 这里可以看到 prometheus-server 端口分配了一个 31246 浏览器访问服务器 ip 地址加 31246 端口即可
[root@Node-01 ~]# kubectl get svc -n monitoring
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
prometheus-alertmanager ClusterIP 10.1.194.125 <none> 80/TCP 26m
prometheus-kube-state-metrics ClusterIP 10.1.23.67 <none> 8080/TCP 26m
prometheus-node-exporter ClusterIP None <none> 9100/TCP 26m
prometheus-pushgateway ClusterIP 10.1.24.74 <none> 9091/TCP 26m
prometheus-server NodePort 10.1.81.7 <none> 80:31246/TCP 26m
五、部署 grafana 服务
5.1、 获取 grafana
# 下载到本地,默认拉取指定版本
helm pull stable/grafana --version 4.0.4
# 解压
tar xvf grafana-*.tgz
5.2、创建 Grafana Pv 配置
# 下面代码直接复制黏贴即可
cat > grafana/templates/grafana-pv.yaml << EOF
---
{{- if .Values.persistence.enabled -}}
apiVersion: v1
kind: PersistentVolume
metadata:
name: {{ .Values.persistence.storageClassName }}
spec:
capacity:
storage: {{ .Values.persistence.size }}
accessModes:
- ReadWriteOnce
volumeMode: Filesystem
persistentVolumeReclaimPolicy: Retain
storageClassName: {{ .Values.persistence.storageClassName }}
nfs:
path: {{ .Values.nfs.path }}
server: {{ .Values.nfs.server }}
{{ end }}
EOF
5.3、使用 helm 安装 grafana
- grafana 默认密码是需要获取的。
- 设置访问域名: grafana.akiraka.net
# 下面代码直接复制黏贴即可
cat > grafana.yaml << EOF
# 启用 ingress
ingress:
enabled: true
hosts:
# 设置域名
- grafana.autobole.net
extraPaths:
- path: /
backend:
serviceName: grafana
servicePort: 3000
# PVC
persistence:
enabled: true
# 自动绑定动态 pv
storageClassName: monitoring-grafana-nfs
size: 2Gi
# nfs
nfs:
path: data/NFS/monitoring/grafana
server: 192.167.7.251
EOF
# helm 部署 grafana
helm install grafana -n monitoring --values grafana.yaml grafana
5.4、查看 Grafana Pvc 状态
[root@Node-01 ~]# kubectl get pvc -n monitoring
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
grafana Bound monitoring-grafana-nfs 2Gi RWO monitoring-grafana-nfs 59m
prometheus-alertmanager Bound monitoring-alertmanager-nfs 2Gi RWO monitoring-alertmanager-nfs 20s
prometheus-server Bound monitoring-prometheus-nfs 8Gi RWO monitoring-prometheus-nfs 20s
5.5、查看 Grafana Pod 状态
- 这里可以看到 grafana 已经部署成功
[root@Node-01 ~]# kubectl get pod -n monitoring -w
NAME READY STATUS RESTARTS AGE
grafana-7446668496-hh568 1/1 Running 0 46s
prometheus-alertmanager-86cf8f4f54-h87jm 2/2 Running 0 2m56s
prometheus-kube-state-metrics-6756bbbb8-dbtsx 1/1 Running 0 2m56s
prometheus-node-exporter-d6l4m 1/1 Running 0 2m56s
prometheus-node-exporter-mlql5 1/1 Running 0 2m56s
prometheus-node-exporter-rpf5d 1/1 Running 0 2m56s
prometheus-pushgateway-575796c485-rvnd7 1/1 Running 0 2m56s
prometheus-server-65c7964ddc-cjtnc 2/2 Running 0 2m56s
六、访问 Grafana 仪表盘
6.1、 获取 grafana 密码
- 默认用户名为 admin 密码需要获取,进去后可以自己修改
# 获取 admin 密码,下面那个一串字符串就是密码
[root@Node-01 grafana]# kubectl get secret --namespace monitoring grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
TE6cPRt8HdLvvBk0T5ThAZbFoCssbtKmIBdDeEy8
6.2、查看 ingress-nginx 列表
- ingress-nginx 域名只是安装 grafana 配置好了而已,有安装直接域名访问。
- 如果没有安装老老实实安装要么就通过 ip 地址加端口访问即可
[root@Node-01 ~]# kubectl get ingress -n monitoring
NAME HOSTS ADDRESS PORTS AGE
grafana grafana.akiraka.net 80 3m45s
6.3、查看 ingress-nginx 随机端口
- 端口是 32574
[root@Node-01 grafana]# kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx NodePort 10.1.254.196 <none> 80:32574/TCP,443:32304/TCP 54m
6.4、通过域名访问 Grafana
- 我设置的是 grafana.akiraka.net 端口为 32574
- 默认用户 admin 密码是之前获取的一串字符串
七、访问 Grafana 仪表盘
7.1、 获取 grafana 密码
- 默认用户名为 admin 密码需要获取,进去后可以自己修改
# 获取 admin 密码,下面那个一串字符串就是密码
[root@Node-01 grafana]# kubectl get secret --namespace monitoring grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
TE6cPRt8HdLvvBk0T5ThAZbFoCssbtKmIBdDeEy8
7.2、查看 ingress-nginx 列表
- ingress-nginx 域名只是安装 grafana 配置好了而已,有安装直接域名访问。
- 如果没有安装老老实实安装要么就通过 ip 地址加端口访问即可
[root@Node-01 ~]# kubectl get ingress -n monitoring
NAME HOSTS ADDRESS PORTS AGE
grafana grafana.akiraka.net 80 3m45s
7.3、查看 ingress-nginx 随机端口
- 端口是 32574
[root@Node-01 grafana]# kubectl get svc -n ingress-nginx NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ingress-nginx NodePort 10.1.255.196 <none> 80:32574/TCP,443:32304/TCP 54m
7.4、通过域名访问 Grafana
- 我设置的是 grafana.akiraka.net 端口为 32574
- 默认用户 admin 密码是之前获取的一串字符串
八、添加数据源
- 点击 Add data source
8.1、 添加 Prometheus 数据源
- 点击 Prometheus
8.2、设置 Prometheus 数据源
- 因为 prometheus 与 grafana 在一个命名空间
- 在 URL 只需要填写:http://prometheus-server 即可
- 其他不需要修改,完成之后下拉页面点击 Save & Test
九、设置 Grafana 仪表盘
- 数据源添加完成,点击 Import 开始导入仪表盘
9.1、 导入 Prometheus 仪表盘
- 自动的 Prometheus 仪表盘不行,导入一个别人制作的
- 我这里推荐 2 个导入 id,分别是 8919 与 737 这 2 个仪表盘可以做些参考
- 依次将 2 个仪表盘导入
9.2、设置导入仪表盘数据源
9.3、查看第一个导入仪表盘
9.4、查看第二个导入仪表盘
版权声明:
作者:Akiraka
链接:https://www.akiraka.net/kubernetes/350.html
来源:Akiraka
文章版权归作者所有,未经允许请勿转载。
THE END
0
二维码
海报
Kubernetes(k8s)helm 搭建 prometheus + Grafana 监控
一、集群信息
方法因人而异,但大同小异,以下是我的部署方法。
1.1、 主机信息
主机名
ip地址
描述
核心
内存
node-01
192.167.7.131
master 节点
2……
最靓的仔
Akiraka@最靓的仔
xiyan@Akiraka
xiyan@xiyan
Akiraka@xiyan
Akiraka@xiyan
秃头小石@Akiraka
Akiraka@秃头小石
ssss
Akiraka@ssss
sss
Akiraka@sss
-1" OR 2+876-876-1=0+0+0+1 --