我有一个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中,但这是一种自定义方式,由于多种原因,我们需要在T​​CP中使用一个实例(已经有多个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/

10-10 02:45