注意:
概述
本文介绍如何配置 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 实例识别到 ServiceMonitorcontroller: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 $hostextraEnvs:- name: TZvalue: 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/v1kind: LogConfigmetadata:name: ingress-nginx-controller # 日志采集规则名称,如果是多个 nginx ingress 实例,这里不能冲突spec:clsDetail:topicId: "********-****-****-****-************" # 替换日志主题的 IDlogType: fullregex_logextractRule: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_addressinputDetail:type: container_stdoutcontainerStdout:namespace: ingress-nginx # nginx ingress 所在命名空间workload:kind: deploymentname: ingress-nginx-controller # 选中 nginx ingress controller 的 deployment 名称
采集日志文件:
apiVersion: cls.cloud.tencent.com/v1kind: LogConfigmetadata:name: ingress-nginx-controller # 日志采集规则名称,如果是多个 nginx ingress 实例,这里不能冲突spec:clsDetail:topicId: "********-****-****-****-************" # 替换日志主题的 IDlogType: fullregex_logextractRule: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_addressinputDetail:type: container_filecontainerFile:namespace: ingress-nginx # nginx ingress 所在命名空间workload:kind: deploymentname: ingress-nginx-controller # 选中 nginx ingress controller 的 deployment 名称container: controllerlogPath: /var/log/nginxfilePattern: nginx_access.log
6. 测试 Ingress 请求,产生日志数据。
7. 进入日志服务控制台的 检索分析 页面,选择 nginx ingress 所使用的日志主题,确认日志能够被正常检索。
8. 如果一切正常,可以使用日志服务的 Nginx 访问大盘 和 Nginx 监控大盘 两个预置仪表盘并选择 nginx ingress 所使用的日志主题来展示 nginx 访问日志的分析面板:
Nginx 访问大盘
Nginx 监控大盘
9. 在日志服务的 Nginx 访问大盘 和 Nginx 监控大盘 可以直接通过面板来设置监控告警规则,详情请参见 监控告警概述。