我有一个statsd客户端,可将其推送到tcp中的kubernetes托管的statsd服务。
当我重新部署服务并在服务器上更新其pod时,数据停止流动,但在statsd客户端上没有错误。
基于this thread,我在golang库中添加了读取检测功能,以查看是否收到消息,但是什么也没有。
我开始连接,从客户端发送statsd数据包,然后过一会儿,我将statsd Service缩小到0个Pod,但是客户端继续从tcp channel 成功读取和写入,没有错误!
当我将部署扩展回1时,旧客户端不会重新连接,并且客户端和服务器将永远保持非通信状态。
服务器副本在Kubernetes服务中变为0时如何从客户端收到错误?
statsd客户端是https://github.com/alexcesaro/statsd的分支
请注意,我们知道statsd通常用在UDP中,但这是一种自定义方式,由于多种原因,我们需要在TCP中使用一个实例(已经有多个UDP,并且它们没有这个问题)
...
c.w, err = net.DialTimeout(c.network, c.addr, 5*time.Second)
...
func (c *conn) checkTCPConnectionOpen() error {
if c.network[:3] == "tcp" {
one := []byte{}
_, err := c.w.Read(one)
return err
}
return nil
}
func (c *conn) flush(n int) {
if len(c.buf) == 0 {
return
}
if n == 0 {
n = len(c.buf)
}
err := c.checkTCPConnectionOpen()
c.handleError(err)
_, err = c.w.Write(c.buf[:n])
c.handleError(err)
if n < len(c.buf) {
copy(c.buf, c.buf[n:])
}
c.buf = c.buf[:len(c.buf)-n]
}
最佳答案
好的,这不是Kubernetes的问题,而是golang的问题。
这基本上是How to know TCP connection is closed in Golang net package?的副本
关于go - 无法检测到Kubernetes中的TCP服务没有Golang应用程序的Pod,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55544914/