- 情况 *
我想有一个pool
的serving
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上解决这个问题?
5条答案
按热度按时间xzlaal3s1#
所以我想这会有用。
首先设置一个ReadinessProbe来非常积极地(尽可能频繁地)轮询你的pod上的一个端点/tcp端口。
然后,一旦你得到一个连接,确保ReadinessProbe失败,但同时确保LivenessProbe不会失败。
最后,在客户端断开连接后终止应用程序。
您的部署需要有足够的副本来服务所有可以进入codeious的客户端,因为一个pod永远不会服务两个客户端。
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。nimxete23#
我认为在kubernetes之上使用无服务器技术是可能实现这一点的。检查Knative serving,这是一种无服务器技术。但在这种情况下,没有预先创建pod池,pod是在客户端请求时按需创建的,并在请求完成后销毁。
rvpgvaaj4#
您可以将
pods
与StatefulSet
一起部署,以便可以使用Headless Service。Headless Service不包含一个DNS IP。相反,它创建了几个用于生成DNS记录的端点。每个DNS记录都绑定到一个pod。所有这些都是由Kubernetes内部完成的,但最好了解一下它是如何做到的。
您可以阅读更多关于Kubernetes StatefulSets 101 - State of the Pods的内容。
然后,您可以实现一个脚本(部署在StatefulSet前面),将客户端路由到一个DNS记录。
您还可以查看一些消息队列代理。
有KubeMQ,RabbitMQ和Redis。还有GCP和AWS上的Pub/Sub。
qlckcl4x5#
我有同样的任务,我没有找到kubernetes内置的解决方案。所有的解决方案都在它之外。关键问题是没有像连接计数这样的内置指标可以用于自动缩放。这是荒谬的,因为服务知道它已经建立了多少连接到pod。所以HPA应该向服务询问这个数字,如果它超过配置的限制(可能至少为零),然后启动新的pod。