Prometheus+Grafana+Altermanager を使用して、K8S クラスター ノードの視覚的な監視およびアラーム プラットフォームを構築および展開する

オープンソース監視システム「Prometheus+Grafana」を使用して、K8S クラスター監視プラットフォームをインストールして展開します。
また、Altermanager アラーム プラグインをエンタープライズ WeChat と組み合わせて使用​​し、システム クラスターの監視とアラーム メカニズムを実現します。

1. 実験ノード計画表

ホスト名 IPアドレス コンポーネントのインストール
m1 192.168.200.61 Prometheus+Grafana+Alertmanager+node_exporter
平方メートル 192.168.200.62 ノードエクスポーター
m3 192.168.200.63 ノードエクスポーター
n1 192.168.200.64 ノードエクスポーター
n2 192.168.200.65 ノードエクスポーター
n3 192.168.200.66 ノードエクスポーター

2.Prometheusをインストールする

在master01节点上执行操作。

  • プロメテウスをインストールする
# 下载
wget https://github.com/prometheus/prometheus/releases/download/v2.34.0/prometheus-2.34.0.linux-amd64.tar.gz

# 解压
tar -zxvf prometheus-2.34.0.linux-amd64.tar.gz -C /usr/local/

# 更名
cd /usr/local/  &&  mv prometheus-2.34.0.linux-amd64 prometheus  &&  cd prometheus
  • prometheus.service 構成ファイルを作成する
cat > /usr/lib/systemd/system/prometheus.service << EOF
[Unit]
Description=prometheus
After=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/local/prometheus/prometheus --config.file=/usr/local/prometheus/prometheus.yml --storage.tsdb.path=/data/prometheus --storage.tsdb.retention=15d --log.level=info            
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
  • プロメテウスサービスを開始する
systemctl daemon-reload && systemctl start prometheus && systemctl enable prometheus && systemctl status prometheus
  • プロメテウスのサービスプロセスを表示する
netstat -lntp | grep prometheus

3.node_exporterをインストールする

Prometheus ダッシュボード用 1 ノード エクスポーター CN 0413 ConsulManager Grafana 用自動同期バージョン ダッシュボード | Grafana Labs

其余节点安装操作相同。

  • ノードエクスポーターをインストールする
# 下载
wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz

# 解压
tar -zxvf node_exporter-1.3.1.linux-amd64.tar.gz -C /usr/local/

# 更名
cd /usr/local && mv node_exporter-1.3.1.linux-amd64 node_exporter && cd node_exporter
  • ノードエクスプローターを開始する
cat > /usr/lib/systemd/system/node_exporter.service << EOF
[Unit]
Description=node_exporter
Documentation=https://prometheus.io/
After=network.target

[Service]
Type=simple
User=root
ExecStart=/usr/local/node_exporter/node_exporter
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF
  • node_exproterサービスを開始します
systemctl daemon-reload && systemctl start node_exporter && systemctl enable node_exporter && systemctl status node_exporter
  • node_exproter サービスプロセスの表示
ps -ef | grep node_exporter

4. prometheus.yml ファイルを構成する

  • prometheus.yml 構成ファイルを変更する
[root@m1 prometheus]# cat prometheus.yml
# my global config
global:
  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
  - static_configs:
    - targets:
       - 127.0.0.1:9093
      # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  - "rules/*.yml"
# - "first_rules.yml"
# - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
    - targets: ['localhost:9090']  # 如果对本机node_exporter监控,加入,'localhost:9100'
  
  - job_name: 'K8S-Masters'
  #重写了全局抓取间隔时间,由15秒重写成5秒。
    scrape_interval: 5s
    static_configs:
    - targets: ['192.168.200.61:9100']
    - targets: ['192.168.200.62:9100']
    - targets: ['192.168.200.63:9100']

  - job_name: 'K8S-Nodes'
    scrape_interval: 5s
    static_configs:
    - targets: ['192.168.200.64:9100']
    - targets: ['192.168.200.65:9100']
    - targets: ['192.168.200.66:9100']
  • prometheus.yml 構成が有効であることを確認します
./promtool check config prometheus.yml
  • プロメテウスサービスを再起動します
systemctl daemon-reload && systemctl restart prometheus && systemctl status prometheus
  • node_exporterサービスを再起動します。
systemctl daemon-reload && systemctl restart node_exporter && systemctl status node_exporter
  • プロメテウスのウェブサイトにアクセスしてくださいhttp://192.168.200.61:9090/targets
    ここに画像の説明を挿入

5.グラファナをインストールする

在master01节点上执行操作。

  • Grafana をダウンロードしてインストールします

ダウンロード リンク: Grafana をダウンロード | Grafana Labs

# 下载
wget https://dl.grafana.com/enterprise/release/grafana-enterprise-8.4.5-1.x86_64.rpm

# 安装
yum install -y grafana-enterprise-8.4.5-1.x86_64.rpm

ここに画像の説明を挿入

  • グラファナサービスを開始する
systemctl start grafana-server.service && systemctl enable grafana-server.service && systemctl status grafana-server.service
  • Grafana プロセスを表示する
netstat -lntp | grep grafana-serve
  • Grafana Web ページ、つまりhttp://192.168.200.61:3000にアクセスします。

ここに画像の説明を挿入

  • パスワードを変更する

ここに画像の説明を挿入

  • ログインして Grafana Web ページにアクセスします

ここに画像の説明を挿入

  • データソースの追加

ここに画像の説明を挿入
ここに画像の説明を挿入

  • 「プロメテウス」を選択

ここに画像の説明を挿入

  • URLを追加

ここに画像の説明を挿入

  • テストを保存し、「保存してテスト」をクリックすると、緑色の成功メッセージが表示されます。

ここに画像の説明を挿入

  • grafana-node_exporter ダッシュボードを構成する


ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入

6. Altermanager をインストールしてアラームを監視する

ダウンロードリンク

リリース · prometheus/alertmanager (github.com)

ダウンロード | プロメテウス

  • Altermanager をインストールする
# 下载
wget https://github.com/prometheus/alertmanager/releases/download/v0.24.0/alertmanager-0.24.0.linux-amd64.tar.gz

# 解压
tar xvf alertmanager-0.24.0.linux-amd64.tar.gz -C  /usr/local/

# 更名
cd /usr/local/ && mv alertmanager-0.24.0.linux-amd64  alertmanager && cd alertmanager/
  • エンタープライズ WeChat にログイン
  • エンタープライズ ID: ww9fxxxxxx03000 を取得します。
  • 部門IDを取得:2
  • エージェントID:1000003
  • シークレット:8FZ_LnlwuFKNf6xxxxxxxxxxxxWwVPH8R3ExJvIs
  • アプリIDを取得する

ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入

以上步骤完成后,我们就得到了配置Alertmanager的所有信息,包括:企业ID,AgentId,Secret和接收告警的部门id

  • wechat.tmpl ファイルを作成する
[root@m1 template]# cat /usr/local/alertmanager/template/wechat.tmpl
{
    
    {
    
     define "wechat.default.message" }}
{
    
    {
    
    - if gt (len .Alerts.Firing) 0 -}}
{
    
    {
    
    - range $index, $alert := .Alerts -}}
{
    
    {
    
    - if eq $index 0 -}}
告警类型: {
    
    {
    
     $alert.Labels.alertname }}
告警级别: {
    
    {
    
     $alert.Labels.severity }}
=====================
{
    
    {
    
    - end }}
===告警详情===
告警详情: {
    
    {
    
     $alert.Annotations.message }}
故障时间: {
    
    {
    
     $alert.StartsAt.Format "2006-01-02 15:04:05" }}
===参考信息===
{
    
    {
    
     if gt (len $alert.Labels.instance) 0 -}}故障实例ip: {
    
    {
    
     $alert.Labels.instance }};{
    
    {
    
    - end -}}
{
    
    {
    
    - if gt (len $alert.Labels.namespace) 0 -}}故障实例所在namespace: {
    
    {
    
     $alert.Labels.namespace }};{
    
    {
    
    - end -}}
{
    
    {
    
    - if gt (len $alert.Labels.node) 0 -}}故障物理机ip: {
    
    {
    
     $alert.Labels.node }};{
    
    {
    
    - end -}}
{
    
    {
    
    - if gt (len $alert.Labels.pod_name) 0 -}}故障pod名称: {
    
    {
    
     $alert.Labels.pod_name }}{
    
    {
    
    - end }}
=====================
{
    
    {
    
    - end }}
{
    
    {
    
    - end }}
{
    
    {
    
    - if gt (len .Alerts.Resolved) 0 -}}
{
    
    {
    
    - range $index, $alert := .Alerts -}}
{
    
    {
    
    - if eq $index 0 -}}
告警类型: {
    
    {
    
     $alert.Labels.alertname }}
告警级别: {
    
    {
    
     $alert.Labels.severity }}
=====================
{
    
    {
    
    - end }}
===告警详情===
告警详情: {
    
    {
    
     $alert.Annotations.message }}
故障时间: {
    
    {
    
     $alert.StartsAt.Format "2006-01-02 15:04:05" }}
恢复时间: {
    
    {
    
     $alert.EndsAt.Format "2006-01-02 15:04:05" }}
===参考信息===
{
    
    {
    
     if gt (len $alert.Labels.instance) 0 -}}故障实例ip: {
    
    {
    
     $alert.Labels.instance }};{
    
    {
    
    - end -}}
{
    
    {
    
    - if gt (len $alert.Labels.namespace) 0 -}}故障实例所在namespace: {
    
    {
    
     $alert.Labels.namespace }};{
    
    {
    
    - end -}}
{
    
    {
    
    - if gt (len $alert.Labels.node) 0 -}}故障物理机ip: {
    
    {
    
     $alert.Labels.node }};{
    
    {
    
    - end -}}
{
    
    {
    
    - if gt (len $alert.Labels.pod_name) 0 -}}故障pod名称: {
    
    {
    
     $alert.Labels.pod_name }};{
    
    {
    
    - end }}
=====================
{
    
    {
    
    - end }}
{
    
    {
    
    - end }}
{
    
    {
    
    - end }}
  • 構成ファイルalertmanager.ymlを編集します。
global:
  resolve_timeout: 1m   									# 每1分钟检测一次是否恢复
  wechat_api_url: 'https://qyapi.weixin.qq.com/cgi-bin/' 	# 请勿修改!!!
  wechat_api_corp_id: '*************'      					# 企业微信中企业ID
  wechat_api_secret: '************************'     		# 企业微信中创建应用的Secret
templates:
  - '/usr/local/alertmanager/template/*.tmpl'
route:
  receiver: 'wechat'
  group_by: ['env','instance','type','group','job','alertname']
  group_wait: 10s       # 初次发送告警延时
  group_interval: 10s   # 距离第一次发送告警,等待多久再次发送告警
  repeat_interval: 1h   # 告警重发时间
#  receiver: 'email'
receivers:
- name: 'wechat'
  wechat_configs:
  - send_resolved: true
    message: '{
    
    { template "wechat.default.message" . }}'
    to_party: '2'          # 企业微信中创建的接收告警的部门【K8S告警组】的部门ID
    agent_id: '1000003'    # 企业微信中创建的应用的ID
    api_secret: '************************************'    # 企业微信中创建应用的Secret
global:
  resolve_timeout: 1m                                                   # 每1分钟检测一次是否恢复
  wechat_api_url: 'https://qyapi.weixin.qq.com/cgi-bin/'                # 请勿修改!!!
  wechat_api_corp_id: 'ww9ff288a7d3903000'                              # 企业微信中企业ID
  wechat_api_secret: '8FZ_LnlwuFKNf6yR8A8svWO0arYYrWwVPH8R3ExJvIs'      # 企业微信中创建应用的Secret
templates:
  - '/usr/local/alertmanager/template/*.tmpl'
route:
  receiver: 'wechat'
  group_by: ['env','instance','type','group','job','alertname']
  group_wait: 10s                  # 初次发送告警延时
  group_interval: 3m               # 距离第一次发送告警,等待多久再次发送告警
  repeat_interval: 3m              # 告警重发时间
#  receiver: 'email'
receivers:
- name: 'wechat'
  wechat_configs:
  - send_resolved: true    # 是否发出已解决消息
    to_user: '@all'        # 所有用户
    message: '{
    
    { template "wechat.default.message" . }}'
    to_party: '2'          # 企业微信中创建的接收告警的部门【K8S告警组】的部门ID
    agent_id: '1000003'    # 企业微信中创建的应用的ID
    api_secret: '8FZ_LnlwuFKNf6yR8A8svWO0arYYrWwVPH8R3ExJvIs'    # 企业微信中创建应用的Secret
  • 構成ファイルalertmanager.serviceを作成します。
cat > /usr/lib/systemd/system/alertmanager.service << EOF
[Unit]
Description=alertmanager
Documentation=https://github.com/prometheus/alertmanager
After=network.target

[Service]
Type=simple
User=root
ExecStart=/usr/local/alertmanager/alertmanager --config.file=/usr/local/alertmanager/alertmanager.yml --storage.path=/data/alertmanager
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF
  • アラートマネージャー.サービスを開始します
systemctl daemon-reload && systemctl start alertmanager.service && systemctl enable alertmanager.service
  • prometheus.yml 構成ファイルを変更する

ここに画像の説明を挿入

  • prometheus/rules パスの下に node_status.yml を作成します。
# 创建rules目录并进入
mkdir /usr/local/prometheus/rules &&  cd rules/  

# 创建node_status.yml配置文件
cat node_status.yml
groups:
- name: 实例存活告警规则
  rules:
  - alert: 实例存活告警
    expr: up{
    
    job="prometheus"} == 0 or up{
    
    job="K8S-Nodes"} == 0
    for: 1m
    labels:
      user: root
      severity: Disaster
    annotations:
      summary: "Instance {
    
    { $labels.instance }} is down"
      description: "Instance {
    
    { $labels.instance }} of job {
    
    { $labels.job }} has been down for more than 1 minutes."
      value: "{
    
    { $value }}"

- name: 内存告警规则
  rules:
  - alert: "内存使用率告警"
    expr: (node_memory_MemTotal_bytes - (node_memory_MemFree_bytes+node_memory_Buffers_bytes+node_memory_Cached_bytes )) / node_memory_MemTotal_bytes * 100 > 75
    for: 1m
    labels:
      user: root
      severity: warning
    annotations:
      summary: "服务器: {
    
    {
    
    $labels.alertname}} 内存报警"
      description: "{
    
    { $labels.alertname }} 内存资源利用率大于75%!(当前值: {
    
    { $value }}%)"
      value: "{
    
    { $value }}"

- name: CPU报警规则
  rules:
  - alert: CPU使用率告警
    expr: 100 - (avg by (instance)(irate(node_cpu_seconds_total{
    
    mode="idle"}[1m]) )) * 100 > 70
    for: 1m
    labels:
      user: root
      severity: warning
    annotations:
      summary: "服务器: {
    
    {
    
    $labels.alertname}} CPU报警"
      description: "服务器: CPU使用超过70%!(当前值: {
    
    { $value }}%)"
      value: "{
    
    { $value }}"

- name: 磁盘报警规则
  rules:
  - alert: 磁盘使用率告警
    expr: (node_filesystem_size_bytes - node_filesystem_avail_bytes) / node_filesystem_size_bytes * 100 > 80
    for: 1m
    labels:
      user: root
      severity: warning
    annotations:
      summary: "服务器: {
    
    {
    
    $labels.alertname}} 磁盘报警"
      description: "服务器:{
    
    {
    
    $labels.alertname}},磁盘设备: 使用超过80%!(挂载点: {
    
    { $labels.mountpoint }} 当前值: {
    
    { $value }}%)"
      value: "{
    
    { $value }}"
  • alertmanager.yml ファイルが正しく構成されていることを確認します
./amtool check-config alertmanager.yml

出力結果

[root@m1 alertmanager]# pwd
/usr/local/alertmanager
[root@m1 alertmanager]# ./amtool check-config alertmanager.yml
Checking 'alertmanager.yml'  SUCCESS
Found:
 - global config
 - route
 - 0 inhibit rules
 - 1 receivers
 - 1 templates
  SUCCESS
  • アラートマネージャーサービスを開始します
systemctl daemon-reload && systemctl start alertmanager && systemctl enable alertmanager && systemctl status alertmanager
  • Alertmanagerサービスプロセスが開始されているかどうかを確認します
ps -ef | grep alertmanager
  • プロメテウスサービスを再起動します
systemctl daemon-reload && systemctl restart prometheus && systemctl status prometheus
  • 関連するルール情報を表示するには、http://192.168.200.61:9090/alerts にアクセスしてください。

ここに画像の説明を挿入

これまでのところ、エンタープライズ Prometheus ドッキング エンタープライズ WeChat アラームの導入は完了しており、障害発生時の以下のアラーム情報とリカバリ情報が確認できるようになりました。

この時点で、ホストの 1 つがダウンしていることをシミュレートし、設定したアラーム情報が WeChat Work で有効になるかどうかを確認します。

  • インスタンス生存アラームを確認し、ホストの 1 つがダウンしていることを確認します。

ここに画像の説明を挿入
ここに画像の説明を挿入

  • 企業の WeChat が発行したアラーム情報を表示する

ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_45392321/article/details/131376241
おすすめ