记一次调整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 等相关操作,涉及技术面较广

遇到的问题

  1.   response_header 以table类型组合而成,其中value 存在字符类型及表格类型。调试期间可以查看 nginx-ingress 的日志,查询lua相关异常进行迭代。
  2.       server-snippet  使用header_filter_by_lua_block 不生效
  3.       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相关参数 。。 略

 

最终效果

 

posted @ 2022-10-15 00:28  伟成  阅读(243)  评论(0编辑  收藏  举报