在Kubernetes中,如何确保一个Pod只服务于一个连接

iaqfqrcu  于 2023-11-17  发布在  Kubernetes
关注(0)|答案(5)|浏览(147)
  • 情况 *

我想有一个poolserving pod(假设我有50个serving pod)。它们将通过LoadBalancer服务公开。
我想确保:
1.每个pod只为一个TCP连接服务,并保持该连接活动,直到客户端终止它。直到该pod的生命周期结束,它将不会接收任何其他TCP连接。
1.一旦客户端终止连接,pod就会清理并自行销毁。
1.另一个pod被旋转以匹配所需的副本号。由于它当前没有服务任何TCP连接,因此可以选择它来服务进入LoadBalancer服务的下一个TCP连接。

  • 示例 *
1. Initially, a `Deployment` specifies a pool of 2 pods behind a LoadBalancer Service.

[1] [2]

------LoadBalancer-------


2. A client initiates a TCP connection to the LoadBalancer (e.g. telnet loadbalancer.domain.com 80) and the TCP connection is routed to the first vacant pod.

[1] [2]
 |
 |
------LoadBalancer-------
 |
 |
cl1


3. 24 hours after that (assuming data has been passing between client1 & pod1), another client hits to the same Load Balancer public domain. Since pod1 is serving client1, I want the second client to be routed to another vacant pod, such as pod 2.

[1] [2]
 |   |
 |   |
------LoadBalancer-------
 |   |
 |   |
cl1 cl2


4. 24 hours after that, client 1 terminates the connection, I want pod1 to do clean up and destroy itself shortly afterwards. No new connections should be routed to it. That leaves pod2 the only one still running.

[2]
 |
 |
------LoadBalancer-------
 |
 |
cl2


5. `Deployment` will create additional pods to ensure the number of replicas. So pod3 is created.

[1] [3]
 |   
 |   
------LoadBalancer-------
 |   
 |   
cl1 


6. Another client hits the same endpoint and is routed to a vacant pod (pod 3 in this case).

[1] [3]
 |   |
 |   |
------LoadBalancer-------
 |   |
 |   |
cl1 cl3

And so on and so forth.

字符串
有谁知道如何在K8上解决这个问题?

xzlaal3s

xzlaal3s1#

所以我想这会有用。
首先设置一个ReadinessProbe来非常积极地(尽可能频繁地)轮询你的pod上的一个端点/tcp端口。
然后,一旦你得到一个连接,确保ReadinessProbe失败,但同时确保LivenessProbe不会失败。
最后,在客户端断开连接后终止应用程序。
您的部署需要有足够的副本来服务所有可以进入codeious的客户端,因为一个pod永远不会服务两个客户端。

a6b3iqyw

a6b3iqyw2#

你看过k8s的sessionAffinity,它可能会帮助我想.这个链接说:
kube-proxy在决定使用哪个后端Pod时会考虑Service的SessionAffinity设置。

如果您想确保来自某个客户端的连接每次都传递到同一个Pod,您可以根据客户端的IP地址选择会话亲和度,将service.spec.sessionAffinity设置为“ClientIP”(默认为“None”)。您也可以通过适当设置service.spec.sessionAffinityConfig.clientIP.timeoutSeconds来设置最大会话粘性时间。
客户端终止后,让服务器返回一个失败码,路径类似/clientstatus,每秒使用readinessProbe/livenessProbe检查此路径,如果readinessProbe/livenessProbe失败,则删除pod。

nimxete2

nimxete23#

我认为在kubernetes之上使用无服务器技术是可能实现这一点的。检查Knative serving,这是一种无服务器技术。但在这种情况下,没有预先创建pod池,pod是在客户端请求时按需创建的,并在请求完成后销毁。

rvpgvaaj

rvpgvaaj4#

您可以将podsStatefulSet一起部署,以便可以使用Headless Service。
Headless Service不包含一个DNS IP。相反,它创建了几个用于生成DNS记录的端点。每个DNS记录都绑定到一个pod。所有这些都是由Kubernetes内部完成的,但最好了解一下它是如何做到的。
您可以阅读更多关于Kubernetes StatefulSets 101 - State of the Pods的内容。
然后,您可以实现一个脚本(部署在StatefulSet前面),将客户端路由到一个DNS记录。
您还可以查看一些消息队列代理。
KubeMQRabbitMQRedis。还有GCPAWS上的Pub/Sub。

qlckcl4x

qlckcl4x5#

我有同样的任务,我没有找到kubernetes内置的解决方案。所有的解决方案都在它之外。关键问题是没有像连接计数这样的内置指标可以用于自动缩放。这是荒谬的,因为服务知道它已经建立了多少连接到pod。所以HPA应该向服务询问这个数字,如果它超过配置的限制(可能至少为零),然后启动新的pod。

相关问题