怎么用nginx exporter去监控k8s集群内的业务nginx容器
时间: 2025-06-22 22:21:47 浏览: 12
<think>好的,我需要帮助用户了解如何使用Nginx Exporter来监控Kubernetes集群内的业务Nginx容器。首先,用户可能已经了解Prometheus的基本概念,但可能需要具体指导在K8s环境中的实施步骤。
首先,我需要回忆一下Nginx Exporter的工作原理。Nginx Exporter通过访问Nginx的stub_status模块来收集指标,所以用户需要确保他们的Nginx容器已经启用了这个模块,并且暴露了对应的端点。如果用户的Nginx配置中没有启用stub_status,可能需要指导他们修改配置。
接下来,用户的问题涉及Kubernetes集群内的部署。这意味着需要考虑如何在K8s中部署Nginx Exporter,可能作为Sidecar容器或者独立的Pod,并通过Service暴露指标。同时,需要配置Prometheus的ServiceMonitor或PodMonitor来自动发现并抓取Exporter的指标。
用户可能对如何配置Nginx Exporter的部署不太清楚,因此需要详细说明Deployment或DaemonSet的配置。例如,使用Sidecar模式时,Exporter需要能够访问Nginx容器的stub_status端点,可能需要共享网络命名空间或通过localhost访问。
另外,需要解释如何配置Prometheus的ServiceMonitor,以便自动发现Exporter。这里可能需要涉及Helm chart的配置,或者直接编写YAML文件。如果用户使用的是Prometheus Operator,那么ServiceMonitor的创建是关键步骤。
还有可能需要注意的细节包括:Nginx的配置是否需要重新加载,Exporter的版本兼容性,以及如何验证Exporter是否正常工作。例如,通过curl命令检查/metrics端点是否返回数据。
最后,可能需要提供一些常见的PromQL查询示例,帮助用户开始监控关键指标,如请求数、延迟和错误率。同时,提醒用户注意标签的使用和可能的性能问题,比如高基数标签的影响。
总结步骤应该是:启用Nginx的stub_status,部署Exporter(Sidecar或独立Pod),配置服务发现,验证指标抓取,最后设置监控和告警。需要确保每个步骤都清晰,并提供代码示例或配置片段,方便用户直接应用。</think>以下是在Kubernetes集群中监控业务Nginx容器的完整方案,采用Nginx Exporter实现:
---
### 一、前置条件准备
1. **确认Nginx配置**:所有Nginx容器必须启用`stub_status`模块
```nginx
# 在nginx.conf中增加配置
server {
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1; # 仅允许本机访问
deny all;
}
}
```
2. **验证stub_status访问**(在容器内执行):
```bash
curl http://localhost:80/nginx_status
# 预期输出:
# Active connections: 3
# server accepts handled requests
# 5 5 2
# Reading: 0 Writing: 1 Waiting: 2
```
---
### 二、部署Nginx Exporter
#### 方案1:Sidecar模式(推荐)
```yaml
# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
annotations:
prometheus.io/scrape: "true" # 自动发现标记
prometheus.io/port: "9113" # Exporter端口
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
- name: exporter # 关键部分:添加Exporter容器
image: nginx/nginx-prometheus-exporter:0.11
args:
- "-nginx.scrape-uri=http://localhost:80/nginx_status"
ports:
- containerPort: 9113
```
#### 方案2:独立DaemonSet模式(适合集群级监控)
```yaml
# nginx-exporter-daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx-exporter
spec:
selector:
matchLabels:
app: nginx-exporter
template:
metadata:
labels:
app: nginx-exporter
spec:
containers:
- name: exporter
image: nginx/nginx-prometheus-exporter:0.11
args:
- "-nginx.scrape-uri=http://<nginx-service>:80/nginx_status"
ports:
- containerPort: 9113
```
---
### 三、服务发现配置
#### 1. 创建Service对象(针对Sidecar模式)
```yaml
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
selector:
app: nginx
ports:
- name: web
port: 80
- name: metrics # 暴露Exporter端口
port: 9113
targetPort: 9113
```
#### 2. 配置Prometheus ServiceMonitor(需安装Prometheus Operator)
```yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: nginx-monitor
spec:
jobLabel: nginx
endpoints:
- port: metrics # 对应Service中定义的端口名称
interval: 30s
selector:
matchLabels:
app: nginx # 选择目标Service的标签
namespaceSelector:
any: true
```
---
### 四、核心监控指标
#### 1. 关键指标说明
| 指标名称 | 说明 |
|--------------------------------------|-------------------------------|
| nginx_http_requests_total | 总请求数(按状态码分类) |
| nginx_http_request_duration_seconds | 请求延迟分布直方图 |
| nginx_connections_active | 当前活跃连接数 |
| nginx_connections_handled | 已处理连接总数 |
#### 2. 常用PromQL示例
```sql
# 实时QPS
sum(rate(nginx_http_requests_total{namespace="prod"}[1m])) by (pod)
# 错误率(5xx状态码)
sum(rate(nginx_http_requests_total{status=~"5.."}[5m]))
/
sum(rate(nginx_http_requests_total[5m]))
# 延迟P99
histogram_quantile(0.99,
sum(rate(nginx_http_request_duration_seconds_bucket[5m])) by (le, pod)
)
# 连接利用率
avg(nginx_connections_active / nginx_connections_limit)
```
---
### 五、Grafana仪表板配置
1. 导入官方仪表板:ID **12006**(Nginx Ingress Controller)
2. 自定义面板示例:
```sql
# 按命名空间统计请求量
sum(rate(nginx_http_requests_total{namespace=~"$namespace"}[5m]))
by (namespace, status)
```
---
### 六、排错指南
1. **指标不可见检查**:
```bash
# 进入Nginx容器验证stub_status
kubectl exec -it <nginx-pod> -c nginx -- curl localhost/nginx_status
# 检查Exporter日志
kubectl logs <pod-name> -c exporter
```
2. **Prometheus目标检查**:
- 访问Prometheus Web UI -> Status -> Targets
- 确认对应Endpoint显示**UP**状态
3. **网络连通性验证**:
```bash
# 从Prometheus Pod发起测试请求
kubectl exec -it prometheus-pod -- curl http://nginx-service:9113/metrics
```
---
### 七、高级配置建议
1. **指标重命名**(在Prometheus配置中):
```yaml
metric_relabel_configs:
- source_labels: [__name__]
regex: 'nginx_(.*)'
replacement: 'app_$1'
target_label: __name__
```
2. **资源限制**(防止Exporter影响业务):
```yaml
resources:
limits:
cpu: 100m
memory: 128Mi
requests:
cpu: 50m
memory: 64Mi
```
3. **多集群监控**:通过Thanos或VictoriaMetrics实现跨集群指标聚合
---
通过以上配置,可以实现对K8s集群内Nginx容器的全方位监控,建议结合HPA实现基于指标的自动扩缩容。
阅读全文
相关推荐

















