K8s 安装 alertmanager 及配置
安装 alertmanager
- 首先创建 alertmanager 的 configmap
cat configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: alert-config
data:
config.yml: |-
global:
# 当alertmanager持续多长时间未接收到告警后标记告警状态为 resolved
resolve_timeout: 5m
# 配置邮件发送信息
smtp_smarthost: 'smtp.163.com:25'
smtp_from: 'XXX@163.com' # 替换成自己的邮箱
smtp_auth_username: 'XX@163.com' # 替换成自己的邮箱
smtp_auth_password: 'XXX' # 这个地方请注意不是邮箱密码,需要在设置-pop/imap -enable pop3/imap 然后新增一个授权密码,# 复制这个密码保存好,填到这里
smtp_hello: '163.com'
smtp_require_tls: false
# 所有报警信息进入后的根路由,用来设置报警的分发策略
route:
# 这里的标签列表是接收到报警信息后的重新分组标签,例如,接收到的报警信息里面有许多具有 cluster=A 和 alertname=LatncyHigh 这样的标签的报警信息将会批量被聚合到一个分组里面
group_by: ['alertname', 'cluster']
# 当一个新的报警分组被创建后,需要等待至少 group_wait 时间来初始化通知,这种方式可以确保您能有足够的时间为同一分组来获取多个警报,然后一起触发这个报警信息。
group_wait: 30s
# 相同的group之间发送告警通知的时间间隔
group_interval: 30s
# 如果一个报警信息已经发送成功了,等待 repeat_interval 时间来重新发送他们,不同类型告警发送频率需要具体配置
repeat_interval: 1h
# 默认的receiver:如果一个报警没有被一个route匹配,则发送给默认的接收器
receiver: default
# 上面所有的属性都由所有子路由继承,并且可以在每个子路由上进行覆盖。
routes:
- receiver: email
group_wait: 10s
match:
team: node
receivers:
- name: 'default'
email_configs:
- to: 'test@163.com'
send_resolved: true # 接受告警恢复的通知
- name: 'email'
email_configs:
- to: 'test@qq.com'
send_resolved: true
# kubectl -n prometheus apply -f configmap.yaml
- 创建 deployment
# cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: alertmanager
labels:
app: alertmanager
spec:
selector:
matchLabels:
app: alertmanager
template:
metadata:
labels:
app: alertmanager
spec:
volumes:
- name: alertcfg
configMap:
name: alert-config
containers:
- name: alertmanager
image: prom/alertmanager:v0.21.0
imagePullPolicy: IfNotPresent
args:
- "--config.file=/etc/alertmanager/config.yml"
ports:
- containerPort: 9093
name: http
volumeMounts:
- mountPath: "/etc/alertmanager"
name: alertcfg
resources:
requests:
cpu: 100m
memory: 256Mi
limits:
cpu: 100m
memory: 256Mi
# kubectl -n prometheus apply -f deployment.yaml
- 创建 service
# cat service.yaml
apiVersion: v1
kind: Service
metadata:
name: alertmanager
labels:
app: alertmanager
spec:
selector:
app: alertmanager
type: ClusterIP
ports:
- name: web
port: 9093
targetPort: http
- 创建ingress
我这里用的是cert-manager 自动签发证书,如果不用ingress 可以忽略使用 service的node模式
# cat ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: alertmanager
annotations:
kubernetes.io/ingress.class: "nginx"
kubernetes.io/ingress.rule-mix: "true"
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
tls:
- hosts:
- alertmanager.wy1212.cn # 指定需要证书的域名
secretName: alertmanager.wy1212.cn
rules:
- host: alertmanager.wy1212.cn
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: alertmanager
port:
number: 9093
- 配置 prometheus
prometheus.yaml: |
alerting: # 新增 alertmanager 配置
alertmanagers:
- static_configs:
- targets: ["alertmanager:9093"]
rule_files: # 新增 rule 地址配置
- /etc/prometheus/rules.yml
global:
scrape_interval: 15s
scrape_timeout: 15s
.......
rules.yml: | # 新增 规则配置
groups:
- name: test-node-mem
rules:
- alert: NodeMemoryUsage
expr: (node_memory_MemTotal_bytes - (node_memory_MemFree_bytes + node_memory_Buffers_bytes + node_memory_Cached_bytes)) / node_memory_MemTotal_bytes * 100 > 20
for: 2m
labels:
team: node
annotations:
summary: "{
{$labels.instance}}: High Memory usage detected"
description: "{
{$labels.instance}}: Memory usage is above 20% (current value is: {
{ $value }}"
将变更更新到cm中并curl -X POST xxx.promeyheus/-/reload
reload prometheus
这时候就可以在 prometheus的页面看到相关的监控规则了。因为测试所以阀值设置的比较低,邮箱会收到告警邮件