Python - Модуль запроса - удаленное закрытое соединение без ответа - PullRequest
0 голосов
/ 06 мая 2020

Я столкнулся с проблемой, из-за которой я получаю общую c ошибку закрытого подключения удаленного конца:

Remote end closed connection without response

при использовании Python 3.5 и модуля запросов.

Вот пример кода - но я сейчас не использую kwargs:

response = self._requests_session.get(self._nextUri, **self._requests_kwargs)

Вот полная ошибка:

   Traceback (most recent call last):
  File "/usr/local/lib/python3.5/dist-packages/urllib3/connectionpool.py", line 672, in urlopen
    chunked=chunked,
  File "/usr/local/lib/python3.5/dist-packages/urllib3/connectionpool.py", line 421, in _make_request
    six.raise_from(e, None)
  File "<string>", line 3, in raise_from
  File "/usr/local/lib/python3.5/dist-packages/urllib3/connectionpool.py", line 416, in _make_request
    httplib_response = conn.getresponse()
  File "/usr/lib/python3.5/http/client.py", line 1213, in getresponse
    response.begin()
  File "/usr/lib/python3.5/http/client.py", line 307, in begin
    version, status, reason = self._read_status()
  File "/usr/lib/python3.5/http/client.py", line 276, in _read_status
    raise RemoteDisconnected("Remote end closed connection without"
http.client.RemoteDisconnected: Remote end closed connection without response

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.5/dist-packages/requests/adapters.py", line 449, in send
    timeout=timeout
  File "/usr/local/lib/python3.5/dist-packages/urllib3/connectionpool.py", line 720, in urlopen
    method, url, error=e, _pool=self, _stacktrace=sys.exc_info()[2]
  File "/usr/local/lib/python3.5/dist-packages/urllib3/util/retry.py", line 400, in increment
    raise six.reraise(type(error), error, _stacktrace)
  File "/usr/local/lib/python3.5/dist-packages/urllib3/packages/six.py", line 734, in reraise
    raise value.with_traceback(tb)
  File "/usr/local/lib/python3.5/dist-packages/urllib3/connectionpool.py", line 672, in urlopen
    chunked=chunked,
  File "/usr/local/lib/python3.5/dist-packages/urllib3/connectionpool.py", line 421, in _make_request
    six.raise_from(e, None)
  File "<string>", line 3, in raise_from
  File "/usr/local/lib/python3.5/dist-packages/urllib3/connectionpool.py", line 416, in _make_request
    httplib_response = conn.getresponse()
  File "/usr/lib/python3.5/http/client.py", line 1213, in getresponse
    response.begin()
  File "/usr/lib/python3.5/http/client.py", line 307, in begin
    version, status, reason = self._read_status()
  File "/usr/lib/python3.5/http/client.py", line 276, in _read_status
    raise RemoteDisconnected("Remote end closed connection without"
urllib3.exceptions.ProtocolError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response',))

Интересно, что за дополнительный код, который я добавляю, чтобы получить дополнительную информацию об этой ошибке или сделать соединение более отказоустойчивым.

Я попытался сделать снимок этой проблемы TCPDump, но после просмотра у меня ничего не осталось, я ищу для некоторых деталей высокого уровня, которые я могу получить из Python, или некоторых дополнительных вещей, которые я могу сделать, чтобы сделать сеанс более устойчивым.

1 Ответ

0 голосов
/ 07 июля 2020

Проблема оказалась в EKS и Kubernetes.

Проблема заключалась в том, что, похоже, произошла коллизия порта с SNAT, которая вызвала эти неожиданные ошибки подключения.

Это хорошо задокументировано здесь и здесь :

Решение заключалось в обновлении до Kubernetes 1.15 и добавлении переменной CNI ниже: AWS_VPC_K8S_CNI_RANDOMIZESNAT=prng

...