如何控制vhost_shared_traffic内存K8s nginx入口?

时间:2020-03-09 18:38:07

标签: nginx kubernetes kubernetes-ingress

背景

我们运行一个kubernetes集群来处理多个php / lumen微服务。我们开始在日志中看到应用程序php-fpm / nginx报告499状态代码,它似乎与客户端在应用程序记录499时得到空白响应(curl返回curl: (52) Empty reply from server)相对。

10.10.x.x - - [09/Mar/2020:18:26:46 +0000] "POST /some/path/ HTTP/1.1" 499 0 "-" "curl/7.65.3"

我的理解是,当客户端套接字不再打开/无法用于返回内容时,nginx将返回499代码。在这种情况下,这似乎意味着在nginx /应用程序层终止此连接之前。当前我们的配置是:

ELB-> k8s nginx入口->应用程序

所以我的想法是ELB还是入口,因为该应用程序是没有套接字可返回的应用程序。所以我开始点击入口日志...

潜在的核心问题?

在查看入口日志时,我看到了很多这样的记录:

2020/03/06 17:40:01 [crit] 11006#11006: ngx_slab_alloc() failed: no memory in vhost_traffic_status_zone "vhost_traffic_status"

潜在解决方案

我想如果我给vhost_traffic_status_zone多一点内存,至少该错误将消失并继续查找下一个错误..但我似乎找不到任何configmap值或注释可以让我控制它。我检查了文档:

https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/

https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/

在此先感谢您可能缺少的任何见解/建议/文档!

1 个答案:

答案 0 :(得分:2)

这是在入口控制器中查找如何修改nginx.conf的标准方法。之后,我将链接一些有关应该为区域分配多少内存的建议的信息。

首先通过检查部署中的映像版本来获取入口控制器版本 kubectl -n <namespace> get deployment <deployment-name> | grep 'image:'

从那里,您可以从以下URL检索适用于您版本的代码。在下面,我将使用版本0.10.2。 https://github.com/kubernetes/ingress-nginx/releases/tag/nginx-0.10.2

可以在代码中的rootfs / etc / nginx / template / nginx.tmpl或Pod上的/etc/nginx/template/nginx.tmpl中找到nginx.conf模板。可以针对感兴趣的行进行裁剪。在示例案例中,我们在nginx.tmpl

中找到以下行

vhost_traffic_status_zone shared:vhost_traffic_status:{{ $cfg.VtsStatusZoneSize }};

这为我们提供了在代码中查找的config变量。我们对VtsStatusZoneSize的下一个grep会将我们引到internal / ingress / controller / config / config.go

中的行。
    // Description: Sets parameters for a shared memory zone that will keep states for various keys. The cache is shared between all worker processe
    // https://github.com/vozlt/nginx-module-vts#vhost_traffic_status_zone
    // Default value is 10m
    VtsStatusZoneSize string `json:"vts-status-zone-size,omitempty"

这为我们提供了要添加到配置映射“ ingress-nginx-ingress-controller”的键“ vts-status-zone-size”。当前值可以在位于/etc/nginx/nginx.conf上的pod上呈现的nginx.conf模板中找到。

当您要设置区域的大小时,此处的文档建议将其设置为2 * usedSize:

如果在error_log中打印的消息(“ ngx_slab_alloc()失败:vhost_traffic_status_zone中没有内存”),请增加到大于(usedSize * 2)。

https://github.com/vozlt/nginx-module-vts#vhost_traffic_status_zone

可以通过点击nginx的统计信息页面或通过JSON端点找到

“ usedSize”。这是获取统计信息的JSON版本的请求,如果有jq,则指向值的路径:curl http://localhost:18080/nginx_status/format/json 2> /dev/null | jq .sharedZones.usedSize

希望这会有所帮助。