集成 CLS 日志服务
本文介绍 Nginx Ingress Controller 的 accesslog 的可视化。
采集 ingress-nginx 的 accesslog 到到腾讯云的 CLS日志服务,并结合 CLS 的仪表盘进行分析日志。
准备条件
容器服务控制台开启日志采集:
设置 Nginx 日志格式
在 values.yaml
中配一下 nginx 访问日志的格式,也设置下时区以便时间戳能展示当地时间(增强可读性):
controller:
config:
# nginx 日志落盘到日志文件,避免高并发下占用过多 CPU
access-log-path: /var/log/nginx/nginx_access.log
error-log-path: /var/log/nginx/nginx_error.log
# 自定义日志格式,在 $req_id 之后的是在生产环境中的经验积累增加的字段
log-format-upstream:
$remote_addr - $remote_user [$time_iso8601] $msec "$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 $namespace $ingress_name
$service_name $service_port $http_x_forwarded_for $host
extraEnvs:
- name: TZ
value: Asia/Shanghai
其中末尾处的这几个字段,是我另外加上的,目的是为了在 Nginx 访问日志中,能够定位 来源的 域名、Ingress 名称: $namespace $ingress_name $service_name $service_port $http_x_forwarded_for $host
创建 CLS 日志主题
在 CLS 日志服务控制台,创建自定义日志集 “Nginx访问日志”
再创建日志集,获取其 id
使用 CRD 进行日志采集配置
这里使用 YAML 编排进行配置:crd-logconfig.yaml
apiVersion: cls.cloud.tencent.com/v1
kind: LogConfig
metadata:
name: ingress-nginx-controller # 日志采集规则名称,如果是多个 nginx ingress 实例,这里不能冲突
spec:
clsDetail:
topicId: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" # 替换日志主题的 ID
logType: fullregex_log
extractRule:
beginningRegex: (\S+)\s-\s(\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+)\s(\S+)\s(\S+)\s(\S+)
logRegex: (\S+)\s-\s(\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+)\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
- namespace
- ingress_name
- service_name
- service_port
- http_x_forwarded_for
- host
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
- 必须替换的配置是 topicId,即日志主题 ID,表示采集的日志将会吐到该 CLS 日志主题里。
- 根据自己实际情况选择配置采集标准输出还是日志文件,nginx ingress 默认是将日志输出到标准输出,但也可以像 日志轮转 这里介绍的一样将日志落盘到日志文件。
TKE 容器服务 -> 日志,就可以自动创建出采集策略:
配置索引
查看日志
实时查看日志
后台的检索分析,能够实时查看 Nginx 访问日志:
可视化仪表板1:K8S 监控大盘
通过实时收集的 ingress-nginx accesslog,可以创建两种可视化大盘:
- K8S 监控大盘:反应的是业务状态码、成功率、接口TOP10等业务行为
- K8S 访问大盘:反应的是客户端行为,TOP客户端IP,监控爬虫封堵高频访问IP,全球、全国客户端分布,客户端类型等
PV,UV,状态码分布:
PV,UV,RT(响应时间) 趋势图:
接口URL,域名请求 TOP10 等:
可视化仪表板2:K8S 访问大盘
PV,UV 国家、省份间的地域分布:
PV,UV 趋势图:
客户端真实 IP数(反刷反爬虫防御
日志预警
当然,还可以根据日志进行部署预警,例如状态码 5xx > 1% 告警:
订阅报表
按日、周、月订阅【日志报表】,时刻掌握【业务动态、业务流量PV、UV】
总结
使用 CLS日志服务实时收集 ingress-nginx 日志后,可以通过创建可视化仪表板对日志进行有效分析,从而有助于监控业务状态、优化业务行为、防范爬虫、防御异常盗刷,以及了解客户端分布和类型等情况,为业务运营和管理提供有力支持。
日志只有赋予了可视化能力,才更具有价值。