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
分享
二维码
海报
Kubernetes(k8s)helm 搭建 prometheus + Grafana 监控
一、集群信息 方法因人而异,但大同小异,以下是我的部署方法。 1.1、 主机信息 主机名 ip地址 描述 核心 内存 node-01 192.167.7.131 master 节点 2……
<<上一篇
下一篇>>