skywalking监控nginx-ingress-controller

简介: skywalking监控nginx-ingress-controller

软件版本信息:


软件 版本
kubernetes 1.17.2
nginx-ingress-controller 0.34.1
skywalking 8.1.0
skywalking-nginx-lua 0.2.0


下面直接进入正题......


(1)下载skywalking-nginx-lua


git clone https://github.com/apache/skywalking-nginx-lua.git


(2)修改util.lua文件名,因为其和nginx-ingress默认的一个lua脚本名字冲突,这里改一下。


$ skywalking-nginx-lua/lib/skywalking
# 修改文件名
$ mv util.lua swutil.lua
# 修改文件调用
## 可以使用grep查看一下哪些文件有调用这个lua
$ grep util `find ./ -type f`
./correlation_context.lua:local Util = require('util')
./segment_ref.lua:local Util = require('util')
./span.lua:local Util = require('util')
./tracing_context.lua:local Util = require('util')
./swutil_test.lua:local Util = require('util')
# 将里面调用的util都改为swuitl


(3)修改Nginx-ingress的nginx.tmpl模板文件,增加Skywalking的配置。


  • 添加Skywalking Lua脚本扫描路径
  • 增加环境变量读取,如:SW_SERVICE_NAME、SW_SERVICE_INSTANCE_NAME、SW_BACKEND_SERVERS
  • 添加Tracing使用的缓存tracing_buffer
  • 设置Skywalking Lua Agent的初始化方法,并将相关配置从环境变量中提取。
  • 设置http节点的追踪配置。


# Skywalking ENV
env SW_SERVICE_NAME;
env SW_SERVICE_INSTANCE_NAME;
env SW_BACKEND_SERVERS;
events {
    multi_accept        {{ if $cfg.EnableMultiAccept }}on{{ else }}off{{ end }};
    worker_connections  {{ $cfg.MaxWorkerConnections }};
    use                 epoll;
}
http {
        # 引入lua脚本
    lua_package_path "/etc/nginx/lua/?.lua;/etc/nginx/lua/skywalking/?.lua;;";
        # 使用缓存
    lua_shared_dict tracing_buffer 100m;
    {{ buildLuaSharedDictionaries $cfg $servers }}
    init_by_lua_block {
        collectgarbage("collect")
        -- init modules
        local ok, res
        ok, res = pcall(require, "lua_ingress")
        if not ok then
          error("require failed: " .. tostring(res))
        else
          lua_ingress = res
          lua_ingress.set_config({{ configForLua $all }})
        end
        ok, res = pcall(require, "configuration")
        if not ok then
          error("require failed: " .. tostring(res))
        else
          configuration = res
        end
        ok, res = pcall(require, "balancer")
        if not ok then
          error("require failed: " .. tostring(res))
        else
          balancer = res
        end
        {{ if $all.EnableMetrics }}
        ok, res = pcall(require, "monitor")
        if not ok then
          error("require failed: " .. tostring(res))
        else
          monitor = res
        end
        {{ end }}
        ok, res = pcall(require, "certificate")
        if not ok then
          error("require failed: " .. tostring(res))
        else
          certificate = res
          certificate.is_ocsp_stapling_enabled = {{ $cfg.EnableOCSP }}
        end
        ok, res = pcall(require, "plugins")
        if not ok then
          error("require failed: " .. tostring(res))
        else
          plugins = res
        end
        -- load all plugins that'll be used here
        plugins.init({ {{ range  $idx, $plugin := $cfg.Plugins }}{{ if $idx }},{{ end }}{{ $plugin | quote }}{{ end }} })
    }
    init_worker_by_lua_block {
......
        -- Skywalking
        local metadata_buffer = ngx.shared.tracing_buffer
        metadata_buffer:set('serviceName', os.getenv("SW_SERVICE_NAME"))
        metadata_buffer:set('serviceInstanceName', os.getenv("SW_SERVICE_INSTANCE_NAME"))
        -- set random seed
        require("swutil").set_randomseed()
        require("client"):startBackendTimer(os.getenv("SW_BACKEND_SERVERS"))
    }
......    
    rewrite_by_lua_block {
                lua_ingress.rewrite({{ locationConfigForLua $location $all }})
                balancer.rewrite()
                plugins.run()
                -- Skywalking
                require("tracer"):start({{ buildUpstreamName $location | quote }})
     }
......     
     body_filter_by_lua_block {
                -- Skywalking
                if ngx.arg[2] then
                    require("tracer"):finish()
                end
     }
......     
     log_by_lua_block {
                balancer.log()
                {{ if $all.EnableMetrics }}
                monitor.call()
                {{ end }}
                plugins.run()
                -- Skywalking
                require("tracer"):prepareForReport()
     }
.......


(4)将这些脚本添加到nginx-ingress镜像中,Dockerfile如下:


FROM quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.32.0
ADD --chown=www-data nginx.tmpl /etc/nginx/template
ADD --chown=www-data skywalking /etc/nginx/lua/skywalking


(5)构建镜像并上传仓库


$ docker build -t registry.cn-hangzhou.aliyuncs.com/rookieops/ingress-nginx-controller-skywalking:0.34.1 .
$ docker push registry.cn-hangzhou.aliyuncs.com/rookieops/ingress-nginx-controller-skywalking:0.34.1


(6)修改nginx-ingress的deployment文件,主要增加以下环境变量


......
      containers:
        - name: controller
          image: registry.cn-hangzhou.aliyuncs.com/rookieops/nginx-ingress-controller:0.32.0
          imagePullPolicy: IfNotPresent
......
            - name: SW_SERVICE_NAME
              value: Kubernetes Ingress
            - name: SW_BACKEND_SERVERS
              value: http://skywalking-oap.skywalking.svc.cluster.local:12800
            - name: SW_SERVICE_INSTANCE_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.uid
......


(7)然后重新部署ingress-controller应用。


然后可以在skywalking的面板上看到了。


640.png


已将所需的代码都放在github了,仓库地址:https://github.com/sunsharing-note/skywalking-ingress.git

相关文章
|
运维 监控 应用服务中间件
【运维知识进阶篇】zabbix5.0稳定版详解3(监控Nginx+PHP服务状态信息)(二)
【运维知识进阶篇】zabbix5.0稳定版详解3(监控Nginx+PHP服务状态信息)(二)
269 0
|
监控 数据可视化 Java
又一款Nginx 管理可视化神器!通过界面完成配置监控,一条龙!
又一款Nginx 管理可视化神器!通过界面完成配置监控,一条龙!
1027 0
又一款Nginx 管理可视化神器!通过界面完成配置监控,一条龙!
|
7月前
|
消息中间件 NoSQL Kafka
基于Kafka的nginx日志收集分析与监控平台(3)
基于Kafka的nginx日志收集分析与监控平台(3)
|
7月前
|
消息中间件 监控 Kafka
基于Kafka的nginx日志收集分析与监控平台(2)
基于Kafka的nginx日志收集分析与监控平台(2)
|
7月前
|
消息中间件 负载均衡 应用服务中间件
基于Kafka的nginx日志收集分析与监控平台(1)
基于Kafka的nginx日志收集分析与监控平台(1)
|
运维 监控 网络协议
【运维知识进阶篇】集群架构-Nginx常用模块(目录索引+状态监控+访问控制+访问限制)(下)
【运维知识进阶篇】集群架构-Nginx常用模块(目录索引+状态监控+访问控制+访问限制)(下)
108 0
|
运维 监控 应用服务中间件
【运维知识进阶篇】集群架构-Nginx常用模块(目录索引+状态监控+访问控制+访问限制)(上)
【运维知识进阶篇】集群架构-Nginx常用模块(目录索引+状态监控+访问控制+访问限制)
135 0
|
监控 应用服务中间件 BI
如何使用 Zabbix 监控 Nginx?
如何使用 Zabbix 监控 Nginx?
332 6
|
监控 数据可视化 应用服务中间件
吹爆,Nginx 可视化!配置监控一条龙
nginx-gui这个东西真的要吹一波,太好用了,而且源码公开。对于我这样一个作为Linux菜鸟的Java开发来说,这个可视化配置工具简直是福音!
|
监控 应用服务中间件 nginx
【2022】Nginx基础状态监控
【2022】Nginx基础状态监控
106 0
【2022】Nginx基础状态监控