Не удается обнаружить, что у службы TCP в Kubernetes нет пакетов с приложением Golang - PullRequest
1 голос
/ 06 апреля 2019

У меня есть клиент statsd, который отправляет службу statsd, размещенную в kubernetes, в tcp.

При повторном развертывании службы и обновлении ее модулей на сервере данные перестают передаваться, но у меня нет ошибок на сервере.statsd client.

На основе этой темы я добавил обнаружение чтения в свою библиотеку golang, чтобы посмотреть, получаю ли я сообщение, но ничего.

Я запускаюСоединение, отправка пакетов statsd с клиента, затем через некоторое время я уменьшаю Сервис statsd до 0 pods, но клиент продолжает успешно читать и записывать с канала tcp без ошибок!

Когда я масштабируюразвертывание обратно на 1, старый клиент не переподключается, а клиент и сервер продолжают оставаться не связанными навсегда.

Как я могу получить ошибку от клиента, когда реплики сервера переходят в 0 в Kubernetesservice?

Клиент 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]
}

Ответы [ 2 ]

0 голосов
/ 10 апреля 2019

Хорошо, так что это не проблема Кубернетеса, а проблема Голанга.

Это в основном дубликат Как узнать, что TCP-соединение закрыто в сетевом пакете Golang?

0 голосов
/ 06 апреля 2019

Есть ли конкретная причина, по которой вы хотите использовать TCP-соединение?Похоже, что Statsd поддерживает режим UDP , см. Здесь .Похоже, что ваше желание добиться устойчивости на вашем клиенте Statsd будет лучше удовлетворено, если вы решите запустить сервер по UDP.

...