在Kubernetes中部署Prometheus后如何抓取Django应用的监控指标
问题排查与解决步骤
1. 修正Prometheus抓取配置的目标地址
你当前Prometheus ConfigMap中my-app任务的target配置为localhost:8000,这个地址指向的是Prometheus Pod自身,无法跨命名空间访问到default命名空间下的Django服务。
K8S集群内部跨命名空间访问Service的标准域名格式为<服务名>.<命名空间>.svc.cluster.local:<端口号>,你的Django Service端口为80,所以将对应配置修改为:
- job_name: my-app metrics_path: /metrics static_configs: - targets: - my_app.default.svc.cluster.local:80
修改后需重启Prometheus Pod加载新配置。
2. 对齐Django侧的端口链路配置
你当前Deployment暴露的containerPort为80、Service的targetPort为80,但给出的gunicorn启动命令中未指定绑定参数,gunicorn默认监听127.0.0.1:8000,会导致集群流量无法进入应用进程。
你可以二选一修改:
- 方案1:修改supervisord的gunicorn启动命令,添加绑定参数:
command=gunicorn --bind 0.0.0.0:80 --reload --timeout 200000 --workers=5 --limit-request-line 0 --limit-request-fields 32768 --limit-request-field_size 0 --chdir /code/ my_app.wsgi - 方案2:保持gunicorn默认配置,将Deployment的
containerPort改为8000,同时将Service的targetPort改为8000。
3. 无需单独暴露多worker端口
django_prometheus内置了多worker指标聚合逻辑,只要应用的/metrics端点可正常访问,会自动汇总所有gunicorn worker的指标,完全不需要单独暴露8000-8005端口,也不需要针对每个worker做单独的抓取配置。
可选:使用K8S服务发现自动抓取(更易维护)
如果后续需要添加更多监控目标,静态配置的维护成本较高,可以改用K8S服务发现能力实现自动抓取:
- 给Django Service添加监控注解:
apiVersion: v1 kind: Service metadata: name: my_app namespace: default annotations: prometheus.io/scrape: "true" prometheus.io/port: "80" prometheus.io/path: "/metrics" spec: # 其余原有配置保持不变 - 在Prometheus的
scrape_configs中添加通用抓取任务,可替换原来的静态my-app任务:- job_name: 'kubernetes-service-endpoints' kubernetes_sd_configs: - role: endpoints relabel_configs: - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape] action: keep regex: true - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path] action: replace target_label: __metrics_path__ regex: (.+) - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port] action: replace target_label: __address__ regex: ([^:]+)(?::\d+)?;(\d+) replacement: $1:$2
配置修改完成后,可以通过Prometheus UI的Status -> Targets页面查看my-app任务的状态,状态为UP即代表抓取正常。
内容的提问来源于stack exchange,提问作者everspader
相关产品推荐
相关产品推荐

