Kubernetes 具有IPVS模式的Kube代理不';我不能保持联系
我有一个具有Kubernetes 具有IPVS模式的Kube代理不';我不能保持联系,kubernetes,kube-proxy,ipvs,Kubernetes,Kube Proxy,Ipvs,我有一个具有ipvskube代理模式的k8s集群和一个位于k8s之外的数据库集群 为了访问DB群集,我创建了服务和端点资源: --- apiVersion: v1 kind: Service metadata: name: database spec: type: ClusterIP ports: - protocol: TCP port: 3306 targetPort: 3306 --- apiVersion: v1 kind: Endpoints meta
ipvs
kube代理模式的k8s集群和一个位于k8s之外的数据库集群
为了访问DB群集,我创建了服务和端点资源:
---
apiVersion: v1
kind: Service
metadata:
name: database
spec:
type: ClusterIP
ports:
- protocol: TCP
port: 3306
targetPort: 3306
---
apiVersion: v1
kind: Endpoints
metadata:
name: database
subsets:
- addresses:
- ip: 192.168.255.9
- ip: 192.168.189.76
ports:
- port: 3306
protocol: TCP
然后,我使用MySQL客户端运行一个pod,并尝试连接到此服务:
mysql -u root -p password -h database
在网络转储中,我看到成功的TCP握手和成功的MySQL连接。在pod正在运行的节点(以下称为工作节点)上,我看到下一个建立的连接:
sudo netstat-nat -n | grep 3306
tcp 10.0.198.178:52642 192.168.189.76:3306 ESTABLISHED
然后,我在打开的MySQL会话中从pod发送一些测试查询。它们都被发送到同一个节点。这是预期的行为
然后,我监视工作节点上已建立的连接。大约5分钟后,与数据库节点建立的连接将丢失
但是在网络转储中,我看到TCP终结数据包没有从工作节点发送到数据库节点。结果,我在数据库节点上得到了一个泄漏的连接
ipvs
如何决定断开已建立的连接?如果ipvs
断开连接,为什么不能正确完成TCP连接?这是一个bug还是我误解了kube proxy中的ipvs
模式?kube proxy和Kubernetes不能帮助平衡持久连接
Kubernetes中长寿命连接的整个概念如所述:
Kubernetes无法平衡长期存在的连接和一些POD
可能会收到比其他人更多的请求。如果您使用的是HTTP/2、gRPC,
RSockets、AMQP或任何其他长寿命连接,如数据库
连接时,您可能需要考虑客户端负载平衡。
我建议将整个过程进行一遍,但总的来说可以总结为:
- Kubernetes服务旨在涵盖web应用程序的最常见用途
- 但是,一旦您开始使用使用持久TCP连接的应用程序协议,例如数据库、gRPC或 WebSocket,它们会散开
- Kubernetes不提供任何内置机制来负载平衡长寿命TCP连接
- 相反,您应该对应用程序进行编码,以便它能够在客户端检索和负载平衡上游
有相关日志吗?谢谢,解释得很清楚。