我的 Kubernetes 集群使用 replicaSet 来运行 N 个类似的 pod。每个 Pod 只能处理一个 websocket 连接 du 以达到资源限制。我的 Kubernetes 使用 nginx 入口控制器。
有没有办法让nginx每个pod只调度一个传入的websocket连接,并且在缺少可用pod的情况下,拒绝传入连接?
我对 Kubernetes Nginx 入口设置不是很熟悉,但假设它公开了一些用于设置服务器组的 Nginx 配置选项,在server
函数中,有一个名为max_conns
的参数,可让您限制与给定服务器的连接数。假设入口控制器中有一个映射,应该可以为在后台创建并添加到 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
您可以使用句点秒相对较低的readinessProbe
,并且{success,failure}Threshold
设置为 1,以便尽快释放或不释放 Pod。
基本上,您可以设置一个脚本或一个简单的 HTTP 端点,以便在建立连接时返回失败状态代码:因此 Pod 端点将从服务端点列表中删除,并且入口控制器不会选择它。
请记住,此解决方案可能会受到争用条件的影响,但它是最简单的解决方案:更好的解决方案可能是使用服务网格,但意味着额外的复杂性。