AlertManager
altermanager是普罗米修斯的报警组件,主要是用针对异常数据进行报警。首先创建一个报警的规则,其次创建路由(给谁发报警信息)。
部署
alertmanager部署有两种方式
1、容器化部署
2、安装包部署
1、容器化部署
1.1、部署Alertmanager
| [root@k8s-master-01 ~] |
| apiVersion: monitoring.coreos.com/v1 |
| kind: Alertmanager |
| metadata: |
| labels: |
| alertmanager: main |
| name: main |
| namespace: monitoring |
| spec: |
| image: quay.io/prometheus/alertmanager:v0.20.0 |
| nodeSelector: |
| kubernetes.io/os: linux |
| |
| replicas: 3 |
| |
| securityContext: |
| fsGroup: 2000 |
| runAsNonRoot: true |
| runAsUser: 1000 |
| |
| serviceAccountName: alertmanager-main |
| |
| version: v0.20.0 |
| [root@k8s-master-01 alertmanager] |
| alertmanager.monitoring.coreos.com/main created |
| [root@k8s-master-01 alertmanager] |
| NAME READY STATUS RESTARTS AGE |
| alertmanager-main-0 2/2 Running 0 9m38s |
| alertmanager-main-1 2/2 Running 0 9m38s |
| alertmanager-main-2 2/2 Running 0 9m38s |
1.2、增加一个ingress暴漏服务
| kind: Ingress |
| apiVersion: extensions/v1beta1 |
| metadata: |
| name: alertmanager |
| namespace: monitoring |
| spec: |
| rules: |
| - host: "www.altermanager.cluster.local.com" |
| http: |
| paths: |
| - backend: |
| serviceName: alertmanager-main |
| servicePort: 9093 |
| path: / |
| [root@k8s-master-01 alertmanager] |
| Warning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress |
| ingress.extensions/alertmanager created |
| [root@k8s-master-01 alertmanager] |
| NAME CLASS HOSTS ADDRESS PORTS AGE |
| alertmanager <none> www.altermanager.cluster.local.com 192.168.15.32 80 18s |
1.3、浏览器访问
| [root@k8s-master-01 alertmanager] |
| NAME CLASS HOSTS ADDRESS PORTS AGE |
| alertmanager <none> www.altermanager.cluster.local.com 192.168.15.32 80 72m |
| [root@k8s-master-01 alertmanager] |
| NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE |
| ingress-nginx-controller NodePort 10.100.56.109 <none> 80:32755/TCP,443:30229/TCP 26d |

2、安装包部署
| [root@tomcat] |
| |
| [root@tomcat] |
| |
| [root@tomcat] |
| export ALTERMANAGER=/usr/local/alertmanager-0.21.0.linux-amd64 |
| PATH=$PATH:$GO_HOME:$GO_ROOT:$GO_PATH:$GO_HOME/bin:$PROMETHEUS_HOME:$ALTERMANAGER |
| |
| [root@tomcat ~] |
3、报警
3.1、创建报警规则
| [root@k8s-master-01 alertmanager] |
| |
| global: |
| resolve_timeout: 1h |
| |
| |
| smtp_smarthost: 'smtp.qq.com:465' |
| smtp_from: 'axxxy@qq.com' |
| smtp_auth_username: 'axxxy@qq.com' |
| smtp_auth_password: 'qxxxxb' |
| smtp_require_tls: false |
| |
| |
| templates: |
| - '/etc/alertmanager/config/*.tmpl' |
| |
| |
| route: |
| |
| group_by: ['severity'] |
| group_wait: 30s |
| group_interval: 5m |
| repeat_interval: 4h |
| receiver: 'email' |
| routes: |
| - receiver: 'email' |
| match_re: |
| |
| service: '^(warning|critical)$' |
| |
| |
| receivers: |
| - name: 'email' |
| email_configs: |
| - to: '12xxxx30@qq.com' |
3.2、添加报警
| [root@kubernetes-master-01 altermanager] |
4、模板
4.1、alertmanager
| |
| global: |
| |
| resolve_timeout: 1h |
| |
| |
| smtp_smarthost: 'smtp.exmail.qq.com:25' |
| smtp_from: 'dukuan@xxx.com' |
| smtp_auth_username: 'dukuan@xxx.com' |
| smtp_auth_password: 'DKxxx' |
| |
| |
| |
| |
| wechat_api_url: 'https://qyapi.weixin.qq.com/cgi-bin/' |
| wechat_api_secret: 'JJ' |
| wechat_api_corp_id: 'ww' |
| |
| |
| templates: |
| - '/etc/alertmanager/config/*.tmpl' |
| |
| |
| route: |
| |
| group_by: ['job', 'altername', 'cluster', 'service','severity'] |
| |
| group_wait: 30s |
| |
| group_interval: 5m |
| |
| repeat_interval: 12h |
| |
| receiver: 'wechat' |
| |
| |
| |
| routes: |
| |
| |
| - match_re: |
| service: ^(foo1|foo2|baz)$ |
| receiver: 'wechat' |
| |
| routes: |
| - match: |
| severity: critical |
| receiver: 'wechat' |
| |
| - match: |
| service: database |
| receiver: 'wechat' |
| |
| - match: |
| severity: critical |
| receiver: 'wechat' |
| |
| inhibit_rules: |
| - source_match: |
| severity: 'critical' |
| target_match: |
| severity: 'warning' |
| |
| |
| |
| |
| receivers: |
| - name: 'team-ops-mails' |
| email_configs: |
| - to: 'dukuan@xxx.com' |
| - name: 'wechat' |
| wechat_configs: |
| - send_resolved: true |
| corp_id: 'ww' |
| api_secret: 'JJ' |
| to_tag: '1' |
| agent_id: '1000002' |
| api_url: 'https://qyapi.weixin.qq.com/cgi-bin/' |
| message: '{{ template "wechat.default.message" . }}' |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
4.2、报警邮件模板
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
| <html xmlns="http://www.w3.org/1999/xhtml"> |
| <head> |
| <meta name="viewport" content="width=device-width" /> |
| <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> |
| <title>{{ template "__subject" . }}</title> |
| <style> |
| |
| |
| |
| |
| * { |
| margin: 0; |
| font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; |
| box-sizing: border-box; |
| font-size: 14px; |
| } |
| img { |
| max-width: 100%; |
| } |
| body { |
| -webkit-font-smoothing: antialiased; |
| -webkit-text-size-adjust: none; |
| width: 100% !important; |
| height: 100%; |
| line-height: 1.6em; |
| |
| |
| } |
| |
| table td { |
| vertical-align: top; |
| } |
| |
| |
| |
| body { |
| background-color: #f6f6f6; |
| } |
| .body-wrap { |
| background-color: #f6f6f6; |
| width: 100%; |
| } |
| .container { |
| display: block !important; |
| max-width: 600px !important; |
| margin: 0 auto !important; |
| |
| clear: both !important; |
| } |
| .content { |
| max-width: 600px; |
| margin: 0 auto; |
| display: block; |
| padding: 20px; |
| } |
| |
| |
| |
| .main { |
| background-color: #fff; |
| border: 1px solid #e9e9e9; |
| border-radius: 3px; |
| } |
| .content-wrap { |
| padding: 30px; |
| } |
| .content-block { |
| padding: 0 0 20px; |
| } |
| .header { |
| width: 100%; |
| margin-bottom: 20px; |
| } |
| .footer { |
| width: 100%; |
| clear: both; |
| color: #999; |
| padding: 20px; |
| } |
| .footer p, .footer a, .footer td { |
| color: #999; |
| font-size: 12px; |
| } |
| |
| |
| |
| h1, h2, h3 { |
| font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; |
| color: #000; |
| margin: 40px 0 0; |
| line-height: 1.2em; |
| font-weight: 400; |
| } |
| h1 { |
| font-size: 32px; |
| font-weight: 500; |
| |
| |
| } |
| h2 { |
| font-size: 24px; |
| |
| |
| } |
| h3 { |
| font-size: 18px; |
| |
| |
| } |
| h4 { |
| font-size: 14px; |
| font-weight: 600; |
| } |
| p, ul, ol { |
| margin-bottom: 10px; |
| font-weight: normal; |
| } |
| p li, ul li, ol li { |
| margin-left: 5px; |
| list-style-position: inside; |
| } |
| |
| |
| |
| a { |
| color: #348eda; |
| text-decoration: underline; |
| } |
| .btn-primary { |
| text-decoration: none; |
| color: #FFF; |
| background-color: #348eda; |
| border: solid #348eda; |
| border-width: 10px 20px; |
| line-height: 2em; |
| |
| |
| font-weight: bold; |
| text-align: center; |
| cursor: pointer; |
| display: inline-block; |
| border-radius: 5px; |
| text-transform: capitalize; |
| } |
| |
| |
| |
| .last { |
| margin-bottom: 0; |
| } |
| .first { |
| margin-top: 0; |
| } |
| .aligncenter { |
| text-align: center; |
| } |
| .alignright { |
| text-align: right; |
| } |
| .alignleft { |
| text-align: left; |
| } |
| .clear { |
| clear: both; |
| } |
| |
| |
| |
| |
| .alert { |
| font-size: 16px; |
| color: #fff; |
| font-weight: 500; |
| padding: 20px; |
| text-align: center; |
| border-radius: 3px 3px 0 0; |
| } |
| .alert a { |
| color: #fff; |
| text-decoration: none; |
| font-weight: 500; |
| font-size: 16px; |
| } |
| .alert.alert-warning { |
| background-color: #E6522C; |
| } |
| .alert.alert-bad { |
| background-color: #D0021B; |
| } |
| .alert.alert-good { |
| background-color: #68B90F; |
| } |
| |
| |
| |
| |
| .invoice { |
| margin: 40px auto; |
| text-align: left; |
| width: 80%; |
| } |
| .invoice td { |
| padding: 5px 0; |
| } |
| .invoice .invoice-items { |
| width: 100%; |
| } |
| .invoice .invoice-items td { |
| border-top: #eee 1px solid; |
| } |
| .invoice .invoice-items .total td { |
| border-top: 2px solid #333; |
| border-bottom: 2px solid #333; |
| font-weight: 700; |
| } |
| |
| |
| |
| @media only screen and (max-width: 640px) { |
| body { |
| padding: 0 !important; |
| } |
| h1, h2, h3, h4 { |
| font-weight: 800 !important; |
| margin: 20px 0 5px !important; |
| } |
| h1 { |
| font-size: 22px !important; |
| } |
| h2 { |
| font-size: 18px !important; |
| } |
| h3 { |
| font-size: 16px !important; |
| } |
| .container { |
| padding: 0 !important; |
| width: 100% !important; |
| } |
| .content { |
| padding: 0 !important; |
| } |
| .content-wrap { |
| padding: 10px !important; |
| } |
| .invoice { |
| width: 100% !important; |
| } |
| } |
| </style> |
| </head> |
| |
| <body itemscope itemtype="http://schema.org/EmailMessage"> |
| |
| <table class="body-wrap"> |
| <tr> |
| <td></td> |
| <td class="container" width="600"> |
| <div class="content"> |
| <table class="main" width="100%" cellpadding="0" cellspacing="0"> |
| <tr> |
| {{ if gt (len .Alerts.Firing) 0 }} |
| <td class="alert alert-warning"> |
| {{ else }} |
| <td class="alert alert-good"> |
| {{ end }} |
| {{ .Alerts | len }} alert{{ if gt (len .Alerts) 1 }}s{{ end }} for {{ range .GroupLabels.SortedPairs }} |
| {{ .Name }}={{ .Value }} |
| {{ end }} |
| </td> |
| </tr> |
| <tr> |
| <td class="content-wrap"> |
| <table width="100%" cellpadding="0" cellspacing="0"> |
| <tr> |
| <td class="content-block"> |
| <a href='{{ template "__alertmanagerURL" . }}' class="btn-primary">View in {{ template "__alertmanager" . }}</a> |
| </td> |
| </tr> |
| {{ if gt (len .Alerts.Firing) 0 }} |
| <tr> |
| <td class="content-block"> |
| <strong>[{{ .Alerts.Firing | len }}] Firing</strong> |
| </td> |
| </tr> |
| {{ end }} |
| {{ range .Alerts.Firing }} |
| <tr> |
| <td class="content-block"> |
| <strong>Labels</strong><br /> |
| {{ range .Labels.SortedPairs }}{{ .Name }} = {{ .Value }}<br />{{ end }} |
| {{ if gt (len .Annotations) 0 }}<strong>Annotations</strong><br />{{ end }} |
| {{ range .Annotations.SortedPairs }}{{ .Name }} = {{ .Value }}<br />{{ end }} |
| <a href="{{ .GeneratorURL }}">Source</a><br /> |
| </td> |
| </tr> |
| {{ end }} |
| |
| {{ if gt (len .Alerts.Resolved) 0 }} |
| {{ if gt (len .Alerts.Firing) 0 }} |
| <tr> |
| <td class="content-block"> |
| <br /> |
| <hr /> |
| <br /> |
| </td> |
| </tr> |
| {{ end }} |
| <tr> |
| <td class="content-block"> |
| <strong>[{{ .Alerts.Resolved | len }}] Resolved</strong> |
| </td> |
| </tr> |
| {{ end }} |
| {{ range .Alerts.Resolved }} |
| <tr> |
| <td class="content-block"> |
| <strong>Labels</strong><br /> |
| {{ range .Labels.SortedPairs }}{{ .Name }} = {{ .Value }}<br />{{ end }} |
| {{ if gt (len .Annotations) 0 }}<strong>Annotations</strong><br />{{ end }} |
| {{ range .Annotations.SortedPairs }}{{ .Name }} = {{ .Value }}<br />{{ end }} |
| <a href="{{ .GeneratorURL }}">Source</a><br /> |
| </td> |
| </tr> |
| {{ end }} |
| </table> |
| </td> |
| </tr> |
| </table> |
| |
| <div class="footer"> |
| <table width="100%"> |
| <tr> |
| <td class="aligncenter content-block"><a href='{{ .ExternalURL }}'>Sent by {{ template "__alertmanager" . }}</a></td> |
| </tr> |
| </table> |
| </div></div> |
| </td> |
| <td></td> |
| </tr> |
| </table> |
| |
| </body> |
| </html> |
本文作者:大胡萝卜没有须
本文链接:https://www.cnblogs.com/c-moon/p/16797218.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步