通过Jenkins调用api设置Kong的权重不正确日志中出现no memory

背景描述】:通过调用kongAPI编写脚本,实现对kong的target权重的设置,即流量的摘除与添加操作。

问题描述】:通过Jenkins构建完成后,出现两种异常情况:
1、kong的target少了一个节点,比如本应该是3个节点,最后只添加了2个节点
2、kong的target权重非100,即有时候权限值居然是1
日志中出现异常报错:

127.0.0.1 - - [26/Jun/2019:04:04:24 +0000] "POST /config?check_hash=1 HTTP/1.1" 201 7242 "-" "Go-http-client/1.1"
2019/06/26 04:04:25 [error] 33#0: 68787 [lua] events.lua:254: post(): worker-events: failed posting event "targets" by "balancer"; no memory, context: ngx.timer
2019/06/26 04:04:25 [error] 33#0:
68787 [lua] handler.lua:265: failed broadcasting target create to workers: failed posting event "targets" by "balancer"; no memory, context: ngx.timer
2019/06/26 04:04:25 [error] 39#0: 68788 [lua] events.lua:254: post(): worker-events: failed posting event "targets" by "balancer"; no memory, context: ngx.timer
2019/06/26 04:04:25 [error] 39#0:
68788 [lua] handler.lua:265: failed broadcasting target create to workers: failed posting event "targets" by "balancer"; no memory, context: ngx.timer
2019/06/26 04:04:25 [error] 37#0: 68758 [lua] balancer.lua:581: on_target_event(): target create: balancer not found for nginx-ingress-controller-live.events.svc, context: ngx.timer
2019/06/26 04:04:25 [error] 33#0:
68787 [lua] balancer.lua:581: on_target_event(): target create: balancer not found for nginx-ingress-controller-live.events.svc, context: ngx.timer```

The error logs suggest that the kong_worker_events sh

【排查分析】:
通过排查,发现是Kong的一个bug:
The error logs suggest that the kong_worker_events shm is full. Further looking at the shm metrics from Kong‘s /status endpoint gives the following information for the shm used for this library:

"allocated_slabs": "5.00 MiB",
"capacity": "5.00 MiB"
In conversation with @thibaultcha and @Tieske, it was noted that this is due to fragmentation issue inside the shm due to insertion of tables of varied sizes into the shm. The shm actually might have space for insertion but requires multiple evictions to find a single slab to allocate the table being inserted. This possibly requires using shm_set_tries in lua-resty-mlcache.

,具体参考链接:https://www.gitmemory.com/hbagdi

解决方案】:

Spin up Kong (>=1.1) in dbless mode
Use /config endpoint to change Kong‘s configuration. Make sure that plugins, upstreams and targets are also changed in each reload.
This should result in shm getting fragmented over time and expose this problem

原文地址:https://blog.51cto.com/zhaowl/2421019

时间: 2024-11-04 09:10:42

通过Jenkins调用api设置Kong的权重不正确日志中出现no memory的相关文章

调用API接口下载腾讯CDN访问日志

公司使用腾讯cdn为网站静态内容加速,由于业务需求,需要每天下载昨天的日志(因为腾讯方面给出回复,访问日志会有2个小时或以上时间的延迟,所以不建议下载当天日志,所以每天统计前一天的日志以做分析).因为cdn是由运维来管理,但是这个需求是业务的,如果每天都由运维进行下载,再通过邮件或其他工具发送,可能就显得麻烦.所幸腾讯CDN提供了API接口,因此采用shell脚本调用API进行下载的方式,定期下载日志,这样只要业务人员运行这个脚本就能自行下载日志,解放了运维的工作. #!/bin/bash ##

VC和VS调用Lua设置以及Lua C API使用。

通过c++调用lua 脚本,    环境VC++6.0    lua  sdk 5.1.4 在调用前先认识几个函数.1.调用lua_open()将创建一个指向Lua解释器的指针.2. luaL_openlibs()函数加载Lua库.3.使用luaL_dofile()加载脚本并运行脚本.4. lua_close()来关闭Lua指向解释器的指针. 5.调用lua_getglobal()将add()函数压入栈顶,add()为lua函数.6.第一个参数x,通过调用lua_pushnumber()入栈.7

jenkins全局安全设置

如何进入安全设置界面 在Jenkins的主界面,点击 configure Global Security 选项,进入Jenkins的系统安全设置界面.安全界面如下图.在这里我们分别介绍各个选项的功能. 启用安全 启用安全,如果启动此项,你必须使用用户名/密码登录才能配置和执行构建,如果Jenkins在内网环境(或者是一个"可信任"的环境),通常会禁用此项,以便项目开发人员能够配置他们自己的项目,而不用麻烦管理员.如果Jenkins暴露在公网环境,你最好启用此项.Jenkins如果在一个

sphinx调用API参考(官方手册)

Sphnix有几种不同编程语言的searchd客户端API的实现.在本文完成之时,我们对我们自己的PHP,Python和java实现提供官方支持.此外,也有一些针对Perl,Ruby和C++的第三方免费.开源API实现. API的参考实现是用PHP写成的,因为(我们相信)较之其他语言,Sphinx在PHP中应用最广泛.因此这份参考文档基于PHP API的参考,而且这节中的所有的代码样例都用PHP给出. 当然,其他所有API都提供相同的方法,也使用完全相同的网络协议.因此这份文档对他们同样适用.在

C# 调用API接口处理公共类 自带JSON实体互转类

using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Net.Security; using System.Security.Cryptography.X509Certificates; using System.Text; using System.Threading.Tasks; using System.Web; n

C#调用API向外部程序发送数据

C#调用API向外部程序发送数据 最近有可能要做一个项目.在项目中有这么一个功能,在A程序中调用B程序,同时在A程序中进行登陆后,要将A程序的登录名和密码自动填充到B程序的登陆对话框中,这样B程序就不需要再输入一次用户名和密码了,简化操作人员的操作.刚好最近闲着没事,就在怎么想怎么去实现.经过两天的折腾,基本上完成了上述功能的实现.下面就把实现方法.过程与大家进行分享. 一.原理 要实现上述功能,需要调用Win API来实现.Win32 API即为Microsoft 32位平台的应用程序编程接口

Coreseek:第三步调用api搜索php版

有三个步骤 1.讲searchd进程写成一个服务,不然每次调用都要打开这个进程很麻烦. g:\service\coreseek\bin\searchd --install --config g:/service/coreseek/etc/csft_mysql.conf --servicename Coreseek 同样的万变不离其宗还是跟配置文件有关系 一个参数是你searchd的路径 ,第二个固定是--install,第三个是指后面跟配置文件--config,第三个是配置文件路径 后面是定义服

VB调用API函数

API函数快速入门--怎样在VB中声明和使用API函数-- 一.在VB中声明API函数有两种方法:如果我们只在某个窗体中使用API函数,我们可以在窗体代码的 General部分声明它: 声明的语法是: Private Declare Function ... Private Declare Sub..... 这里必须采用Private声明,因为这个API函数只能被一个窗体内的程序所调用. 如果我们的程序有多个窗体构成,而且我们需要在多个窗体中使用同一个API函数,就需要在模块中 声明了. 先添加

destoon6.0调用公司设置任意信息的方法-最新

destoon6.0调用公司设置任意信息的方法 用法: 把以下函数加入到api/extend.func.php 中 function company_setting($userid, $key = '', $cache = '') { global $db; if($key) { $r = $db->get_one("SELECt * FROM {$db->pre}company_setting WHERe userid=$userid AND item_key='$key'&quo