记一次调整k8s的nginx-ingress记录respons_header并记录到阿里云SLS
前言
开发说近期用户出现偶发的登陆退出问题, 需要协助排查为什么用户会退出登录。其中涉及response的头部排查。需要知道用户在哪一次请求时触发了退出登录。
问题解析及处理方式判断
由于项目相对复杂,涉及JAVA、redis等这里不深入探讨。结合目前运行的环境,借鉴资源通过验证发现运行异常,主要是server-snippet 使用header_filter_by_lua_block 不生效。
通过查看nginx.conf 及 plugs.lua的说明,发现通过nginx-ingress内置的lua插件即可完成获取返回头的需求。
借鉴资源:
- https://cloud.tencent.com/developer/article/2064817 server-snippet 增加脚本
- https://blog.csdn.net/be5yond/article/details/121999456 【nginx】记录response body和header到access.log
环境
- 阿里云容器服务:ACK 托管版 1.20.11-aliyun.1
- Nginx Ingress Controller v0.44.0.9-7b9e93e7e-aliyun
风险事项
本次调整后,Nginx Ingress Controller不能随便升级,涉及configmap挂载 plugs
日志格式不能随意变更
需要掌握nginx、lua 、 k8s 等相关操作,涉及技术面较广
遇到的问题
- response_header 以table类型组合而成,其中value 存在字符类型及表格类型。调试期间可以查看 nginx-ingress 的日志,查询lua相关异常进行迭代。
- server-snippet 使用header_filter_by_lua_block 不生效
- lua 脚步不能创建ngx.var. 需要通过ingress的注解完成变量创建
annotations: nginx.ingress.kubernetes.io/server-snippet: set $response_header "-";
改造过程
1 创建 nginx-ingress 基于lua语言的plugs
get_response_header]$ cat main.lua
local ngx = ngx local _M = {} function _M.header_filter() local h = ngx.resp.get_headers() if h ~= nil then for k, v in pairs(h) do local v_type = type(v) if v_type == 'table' then for k2 , v2 in pairs(v) do ngx.var.response_header=ngx.var.response_header..k2..": "..v2 end end if v_type ~= 'table' then ngx.var.response_header=ngx.var.response_header..k..": "..v end end end end return _M
2 创建confimap , 注意需要与nginx-ingress-controller 同命名空间,其中文件命名为main.lua
kubectl create cm -nkube-system ngx-get-response-header --from-file=get_response_header/main.lua
3 确认 ingress 已经存在 set $response_header "-";
4 调整 deployments.apps -n kube-system nginx-ingress-controller , 引入插件到plugins目录中
--- volumeMounts: - mountPath: /etc/nginx/lua/plugins/get_response_header/ name: ngx-get-response-header readOnly: true --- volumes: - configMap: defaultMode: 420 name: ngx-get-response-header name: ngx-get-response-header
5 调整 configmaps -n kube-system nginx-configuration 增加参数 plugins ,调整log-format-upstream参数
plugins: hello_world, get_response_header
log-format-upstream: $remote_addr - [$remote_addr] - $remote_user [$time_local]
"$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $request_length
$request_time [$proxy_upstream_name] $upstream_addr $upstream_response_length
$upstream_response_time $upstream_status $req_id $host "$response_header" [$proxy_alternative_upstream_name]
6. 检测nginx-ingress的日志,看lua脚步运行是否正常
7. 检测输入日志是否符合需求
8. 调整SLS相关参数 。。 略
最终效果