如何使用 nginx ingress controller 每个 pod 只允许一个连接
How to allow only one connection per pod using nginx ingress controller
我的 Kubernetes 集群使用了一个与 运行 N 相似的副本集 pods。由于资源限制,每个 pod 只能处理一个 websocket 连接。我的 Kubernetes 使用 nginx 入口控制器。
有没有办法让 nginx 为每个 pod 仅分配一个传入的 websocket 连接,并且在缺少可用的情况下 pods,拒绝传入连接?
您可以使用 readinessProbe
和 periodSecond 相对较低,显然,{success,failure}Threshold
设置为 1 以便释放或不释放 Pod越快越好。
基本上,您可以设置一个脚本或一个简单的 HTTP 端点,在建立连接的情况下 returns 一个失败的状态代码:因此 Pod 端点将从服务端点列表中删除,并将未被 Ingress Controller 选择。
请记住,此解决方案可能会受到竞争条件的影响,但它是最简单的解决方案:更好的解决方案可能是使用服务网格,但这意味着额外的复杂性。
我不是很熟悉 Kubernetes Nginx 入口设置,但假设它公开了一些用于设置服务器组的 Nginx 配置选项,在 server
函数中有一个名为 [=11 的参数=] 这将允许您限制到给定服务器的连接数。假设在入口控制器中有一个映射,应该可以为每个正在创建并添加到引擎盖下的 Nginx 配置的服务器设置 max_conns=1
。
http://nginx.org/en/docs/http/ngx_http_upstream_module.html#server
编辑:粗略的研究一下,看起来这确实是可能的。看起来您可以根据此处的参数主列表在 ConfigMap
中将其指定为 nginx.org/max-conns
:https://github.com/nginxinc/kubernetes-ingress/blob/master/docs/configmap-and-annotations.md
我的 Kubernetes 集群使用了一个与 运行 N 相似的副本集 pods。由于资源限制,每个 pod 只能处理一个 websocket 连接。我的 Kubernetes 使用 nginx 入口控制器。
有没有办法让 nginx 为每个 pod 仅分配一个传入的 websocket 连接,并且在缺少可用的情况下 pods,拒绝传入连接?
您可以使用 readinessProbe
和 periodSecond 相对较低,显然,{success,failure}Threshold
设置为 1 以便释放或不释放 Pod越快越好。
基本上,您可以设置一个脚本或一个简单的 HTTP 端点,在建立连接的情况下 returns 一个失败的状态代码:因此 Pod 端点将从服务端点列表中删除,并将未被 Ingress Controller 选择。
请记住,此解决方案可能会受到竞争条件的影响,但它是最简单的解决方案:更好的解决方案可能是使用服务网格,但这意味着额外的复杂性。
我不是很熟悉 Kubernetes Nginx 入口设置,但假设它公开了一些用于设置服务器组的 Nginx 配置选项,在 server
函数中有一个名为 [=11 的参数=] 这将允许您限制到给定服务器的连接数。假设在入口控制器中有一个映射,应该可以为每个正在创建并添加到引擎盖下的 Nginx 配置的服务器设置 max_conns=1
。
http://nginx.org/en/docs/http/ngx_http_upstream_module.html#server
编辑:粗略的研究一下,看起来这确实是可能的。看起来您可以根据此处的参数主列表在 ConfigMap
中将其指定为 nginx.org/max-conns
:https://github.com/nginxinc/kubernetes-ingress/blob/master/docs/configmap-and-annotations.md