可观测性集成

最近更新时间:2024-09-14 16:10:21

我的收藏
注意:
ingress-nginx 是一个由社区维护的开源项目。本文内容仅供参考,不提供官方支持。如在使用过程中遇到问题,建议查阅 ingress-nginx 社区 的最新官方文档以获取帮助。

概述

本文介绍如何配置 Nginx Ingress 来集成监控和日志系统以提升可观测性,包括与腾讯云上托管的 Prometheus、Grafana 和 CLS 这些产品的集成;也包括与自建的 Prometheus 和 Grafana 的集成。

集成 Prometheus 监控

如果您使用了 腾讯云 Prometheus 监控服务关联 TKE 集群,或者是安装了 Prometheus Operator 来监控集群,都可以启用 ServiceMonitor 来采集 Nginx Ingress 的监控数据,values.yaml 配置方法:
commonLabels:
prom_id: prom-xxx # 通过这个 label 指定 Prometheus 实例的 ID,以便被 Prometheus 实例识别到 ServiceMonitor
controller:
metrics:
enabled: true # 专门创建一个 service 给 Prometheus 用作 Nginx Ingress 的服务发现
serviceMonitor:
enabled: true # 下发 ServiceMonitor 自定义资源,启用监控采集规则

集成 Grafana 监控面板

如果您使用了 腾讯云 Prometheus 监控服务关联 TKE 集群 且关联了 腾讯云 Grafana 服务,可以直接在 Prometheus 集成中心安装 Nginx Ingress 的监控面板:

如果是自建的 Grafana,直接将 Nginx Ingress 官方提供的 Grafana Dashboards 中两个监控面板(json 文件)导入 Grafana 即可。

集成 CLS 日志服务

以下内容将指导您如何将 Nginx Ingress Controller 的 access log 采集到 CLS,并结合 CLS 的仪表盘分析日志。
1. values.yaml 中配置 nginx 访问日志的格式,同时设置时区以便时间戳能展示当地时间(增强可读性):
controller:
config:
log-format-upstream:
$remote_addr - $remote_user [$time_local] "$request"
$status $body_bytes_sent "$http_referer" "$http_user_agent"
$request_length $request_time [$proxy_upstream_name] [$proxy_alternative_upstream_name] $upstream_addr
$upstream_response_length $upstream_response_time $upstream_status $req_id $host
extraEnvs:
- name: TZ
value: Asia/Shanghai
2. 确保集群启用了日志采集功能,详情请参见 开启日志采集
3. 为 Nginx Ingress Controller 准备好 CLS 日志集和日志主题,如果没有,请前往 CLS 控制台 根据自己的需求来创建,并记录日志主题的 ID。
4. 为日志主题开启索引:
进入 日志主题索引配置页面,单击编辑


启用索引,全文分词符为 @&?|#()='",;:<>[]{}/ \\n\\t\\r\\\\


批量添加索引字段 (需与下图中配置保持一致):



高级设置:


5. 创建 TKE 日志采集规则(根据实际情况二选一):
注意:
必须替换的配置项是 topicId,即日志主题 ID,表示采集的日志将会发送到该 CLS 日志主题里。
根据自己实际情况选择配置采集标准输出还是日志文件,nginx ingress 默认是将日志输出到标准输出,您也可以选择将日志落盘到日志文件,详情请参见 日志轮转
采集标准输出:
apiVersion: cls.cloud.tencent.com/v1
kind: LogConfig
metadata:
name: ingress-nginx-controller # 日志采集规则名称,如果是多个 nginx ingress 实例,这里不能冲突
spec:
clsDetail:
topicId: "********-****-****-****-************" # 替换日志主题的 ID
logType: fullregex_log
extractRule:
beginningRegex: (\\S+)\\s-\\s(\\S+)\\s\\[([^\\]]+)\\]\\s\\"(\\w+)\\s(\\S+)\\s([^\\"]+)\\"\\s(\\S+)\\s(\\S+)\\s\\"([^\\"]*)\\"\\s\\"([^\\"]*)\\"\\s(\\S+)\\s(\\S+)\\s\\[([^\\]]*)\\]\\s\\[([^\\]]*)\\]\\s(\\S+)\\s(\\S+)\\s(\\S+)\\s(\\S+)\\s(\\S+)\\s(\\S+)
logRegex: (\\S+)\\s-\\s(\\S+)\\s\\[([^\\]]+)\\]\\s\\"(\\w+)\\s(\\S+)\\s([^\\"]+)\\"\\s(\\S+)\\s(\\S+)\\s\\"([^\\"]*)\\"\\s\\"([^\\"]*)\\"\\s(\\S+)\\s(\\S+)\\s\\[([^\\]]*)\\]\\s\\[([^\\]]*)\\]\\s(\\S+)\\s(\\S+)\\s(\\S+)\\s(\\S+)\\s(\\S+)\\s(\\S+)
keys:
- remote_addr
- remote_user
- time_local
- timestamp
- method
- url
- version
- status
- body_bytes_sent
- http_referer
- http_user_agent
- request_length
- request_time
- proxy_upstream_name
- proxy_alternative_upstream_name
- upstream_addr
- upstream_response_length
- upstream_response_time
- upstream_status
- req_id
- sys_address
inputDetail:
type: container_stdout
containerStdout:
namespace: ingress-nginx # nginx ingress 所在命名空间
workload:
kind: deployment
name: ingress-nginx-controller # 选中 nginx ingress controller 的 deployment 名称
采集日志文件:
apiVersion: cls.cloud.tencent.com/v1
kind: LogConfig
metadata:
name: ingress-nginx-controller # 日志采集规则名称,如果是多个 nginx ingress 实例,这里不能冲突
spec:
clsDetail:
topicId: "********-****-****-****-************" # 替换日志主题的 ID
logType: fullregex_log
extractRule:
beginningRegex: (\\S+)\\s-\\s(\\S+)\\s\\[([^\\]]+)\\]\\s\\"(\\w+)\\s(\\S+)\\s([^\\"]+)\\"\\s(\\S+)\\s(\\S+)\\s\\"([^\\"]*)\\"\\s\\"([^\\"]*)\\"\\s(\\S+)\\s(\\S+)\\s\\[([^\\]]*)\\]\\s\\[([^\\]]*)\\]\\s(\\S+)\\s(\\S+)\\s(\\S+)\\s(\\S+)\\s(\\S+)\\s(\\S+)
logRegex: (\\S+)\\s-\\s(\\S+)\\s\\[([^\\]]+)\\]\\s\\"(\\w+)\\s(\\S+)\\s([^\\"]+)\\"\\s(\\S+)\\s(\\S+)\\s\\"([^\\"]*)\\"\\s\\"([^\\"]*)\\"\\s(\\S+)\\s(\\S+)\\s\\[([^\\]]*)\\]\\s\\[([^\\]]*)\\]\\s(\\S+)\\s(\\S+)\\s(\\S+)\\s(\\S+)\\s(\\S+)\\s(\\S+)
keys:
- remote_addr
- remote_user
- time_local
- timestamp
- method
- url
- version
- status
- body_bytes_sent
- http_referer
- http_user_agent
- request_length
- request_time
- proxy_upstream_name
- proxy_alternative_upstream_name
- upstream_addr
- upstream_response_length
- upstream_response_time
- upstream_status
- req_id
- sys_address
inputDetail:
type: container_file
containerFile:
namespace: ingress-nginx # nginx ingress 所在命名空间
workload:
kind: deployment
name: ingress-nginx-controller # 选中 nginx ingress controller 的 deployment 名称
container: controller
logPath: /var/log/nginx
filePattern: nginx_access.log
6. 测试 Ingress 请求,产生日志数据。
7. 进入日志服务控制台检索分析 页面,选择 nginx ingress 所使用的日志主题,确认日志能够被正常检索。
8. 如果一切正常,可以使用日志服务Nginx 访问大盘Nginx 监控大盘 两个预置仪表盘并选择 nginx ingress 所使用的日志主题来展示 nginx 访问日志的分析面板:
Nginx 访问大盘



Nginx 监控大盘


9. 日志服务Nginx 访问大盘Nginx 监控大盘 可以直接通过面板来设置监控告警规则,详情请参见 监控告警概述