nginx代理docker容器中运行的服务

云服务器上运行了很多的docker服务,大多数服务都是没有验证的,可以通过nginx做集中的代理,并在nginx上配置用户名密码验证,避免非授权访问。

遇到的问题如下:
Q1 容器的IP是不固定的,如何配置nginx的代理?
A1 通过创建docker网络,使nginx容器与业务容器在同一个网络中,这样就可以通过容器名称进行代理,不需要关注容器的IP地址

Q2 新上线的业务容器/修改了业务容器端口,要修改nginx代理文件,又要重新加载nginx配置,有没有便捷的方式?

查看更多

在Prometheus的rule文件中使用判断语句和变量

话不多说,直接给出示例,相信一眼就能看到怎么用了

1
2
3
4
5
6
7
8
9
10
- name: hostStatsAlert300s
interval: 5m
rules:
- alert: 磁盘使用率超过阈值告警
expr: ((node_filesystem_size_bytes - node_filesystem_avail_bytes) / node_filesystem_size_bytes) * on(instance) group_left(nodename) (node_uname_info) > 0.7
labels:
severity: "{{ if gt $value 0.9 }} 紧急告警 {{ else if gt $value 0.8 }} 重要告警 {{ else if gt $value 0.7 }} 次要告警 {{ end }}"
annotations:
summary: "主机 {{ $labels.nodename }} 目录 {{ $labels.mountpoint }} 磁盘使用率过高"
description: "主机{{ $labels.nodename }} 磁盘使用率过高,告警阈值:{{ if gt $value 0.9 }}90%{{ else if gt $value 0.8 }}80%{{ else if gt $value 0.7 }}70%{{ end }},当前使用率:{{ $value | humanizePercentage }},目录:{{ $labels.mountpoint }}"

查看更多

Prometheus告警中如何携带主机名

主机名(nodename)在指标node_uname_info中,且node_uname_info的值恰巧为1,所以我们可以在PromQL中通过node_uname_info提取,只需要在原有PromQL后添加

1
* on(instance) group_left(nodename) (node_uname_info)

这样,在prometheus告警的labels中,就可以通过nodename获取主机名了

比如原先的expr为

1
node_filesystem_size_bytes - node_filesystem_avail_bytes) / node_filesystem_size_bytes > 0.7

查看更多

Prometheus-AlertManager设置邮件发送告警信息

以网易163邮箱为例

修改alertmanager.yml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
global:
resolve_timeout: 5m # 当警报恢复后,等待这个时长才认为警报真正解决
smtp_from: '[email protected]' # 发送警报邮件的发件人邮箱地址
smtp_smarthost: 'smtp.163.com:465' # 邮件发送使用的SMTP服务器地址和端口
smtp_auth_username: '[email protected]' # 用于SMTP认证的用户名,通常是发件人的邮箱地址
smtp_auth_password: 'xxxxxxx' # 用于SMTP认证的密码,这里应该是邮箱的授权码(token),而非登录密码
smtp_require_tls: false # 是否要求使用TLS加密邮件传输,这里设置为false表示不强制要求
smtp_hello: '163.com' # SMTP连接时的HELO/EHLO标识,通常使用邮件服务商的域名

route:
group_by: ['alertname'] # 按照警报名称对警报进行分组
group_wait: 30s # 在将警报发送给接收者之前等待的时间,以便收集更多相关警报
group_interval: 5m # 分组后,每隔这个时长检查一次是否有新警报加入同一分组
repeat_interval: 1h # 对于同一个分组的警报,每隔这个时长重复发送一次通知
receiver: '163email' # 默认的警报通知接收者,这里引用了下面定义的receivers中的一个

# receivers中定义了警报通知的接收者,包括他们的联系方式
receivers:
- name: '163email' # 接收者的名称,用于在route中引用
email_configs:
- to: '[email protected]' # 接收警报邮件的邮箱地址
send_resolved: true # 当警报恢复时,是否发送恢复通知邮件

查看更多

Prometheus基于文件的自动发现

一、自动发现服务

每次修改Prometheus配置文件都需要重载服务,未免有些麻烦,而自动发现服务就是为了解决这种麻烦事儿的,自动发现服务又分为好几种,其中基于文件的服务发现是最通用的方式。这种方式不需要依赖于任何的平台或者第三方服务。Prometheus会定时从文件中读取最新的Target信息,因此,我们可以通过任意的方式将监控Target的信息写入即可。

二、配置

步骤1 修改prometheus.yml文件

1
2
3
4
- job_name: 'file_sd_default'
file_sd_configs:
- files: ['/etc/prometheus/config/sd_config/*.yml']
refresh_interval: 5s

查看更多

阿里云-使用Prometheus配置报警规则的最佳实践

使用Prometheus配置报警规则的最佳实践 - 阿里云

ACK从集群稳定性、集群节点异常、集群节点水位、应用容器副本异常、工作负载异常、存储异常、网络异常等多个方面,通过集群、应用的运维经验沉淀,总结梳理出以下Prometheus重要报警规则配置。

报警规则包含容器副本异常、工作负载异常等内容,分为以下级别。

查看更多