Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Client sent an HTTP request to an HTTPS server

Tags:

I have a python application running on a virtual machine, were a legacy, and now I'm migrating to a Kubernetes.

I use influxdb==5.2.3 package, connecting to this form Influx(host=r'influx_HOST', port=8086, username='MY_USER', password='***', database='DB_NAME', ssl=True). This python script calls an InfluxBD using an SSL certificate and when I run directly using python app.py works well, but, the problem is when:

 I dockerized the script shows me the following error.

Traceback (most recent call last):
  File "app.py", line 591, in <module>
    get_horas_stock()
  File "app.py", line 513, in get_horas_stock
    df_temp = influx_temperatura.multiple_query_to_df(queries_temperatura)
  File "/usr/src/app/analitica_py_lib_conexiones/conexion_influx.py", line 82, in multiple_query_to_df
    resultado = self.__cliente.query(";".join(queries))
  File "/usr/local/lib/python3.8/site-packages/influxdb/client.py", line 445, in query
    response = self.request(
  File "/usr/local/lib/python3.8/site-packages/influxdb/client.py", line 302, in request
    raise InfluxDBClientError(response.content, response.status_code)
influxdb.exceptions.InfluxDBClientError: 400: Client sent an HTTP request to an HTTPS server.

I understand to, from inside the container, the script is using https to call Influx, but I think the connection is redirected outside the container using Http and lose all SSL configuration, why? I don't know.

I tested deployed on Kubernetes

I tried to deploy on Kubernetes thinking I get the same error, but it`s changed.

Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/urllib3/response.py", line 360, in _error_catcher
    yield
  File "/usr/local/lib/python3.8/site-packages/urllib3/response.py", line 442, in read
    data = self._fp.read(amt)
  File "/usr/local/lib/python3.8/http/client.py", line 454, in read
    n = self.readinto(b)
  File "/usr/local/lib/python3.8/http/client.py", line 498, in readinto
    n = self.fp.readinto(b)
  File "/usr/local/lib/python3.8/socket.py", line 669, in readinto
    return self._sock.recv_into(b)
ConnectionResetError: [Errno 104] Connection reset by peer

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/requests/models.py", line 750, in generate
    for chunk in self.raw.stream(chunk_size, decode_content=True):
  File "/usr/local/lib/python3.8/site-packages/urllib3/response.py", line 494, in stream
    data = self.read(amt=amt, decode_content=decode_content)
  File "/usr/local/lib/python3.8/site-packages/urllib3/response.py", line 459, in read
    raise IncompleteRead(self._fp_bytes_read, self.length_remaining)
  File "/usr/local/lib/python3.8/contextlib.py", line 131, in __exit__
    self.gen.throw(type, value, traceback)
  File "/usr/local/lib/python3.8/site-packages/urllib3/response.py", line 378, in _error_catcher
    raise ProtocolError('Connection broken: %r' % e, e)
urllib3.exceptions.ProtocolError: ("Connection broken: ConnectionResetError(104, 'Connection reset by peer')", ConnectionResetError(104, 'Connection reset by peer'))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "app.py", line 591, in <module>
    get_horas_stock()
  File "app.py", line 513, in get_horas_stock
    df_temp = influx_temperatura.multiple_query_to_df(queries_temperatura)
  File "/usr/src/app/analitica_py_lib_conexiones/conexion_influx.py", line 82, in multiple_query_to_df
    resultado = self.__cliente.query(";".join(queries))
  File "/usr/local/lib/python3.8/site-packages/influxdb/client.py", line 445, in query
    response = self.request(
  File "/usr/local/lib/python3.8/site-packages/influxdb/client.py", line 274, in request
    response = self._session.request(
  File "/usr/local/lib/python3.8/site-packages/requests/sessions.py", line 533, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/local/lib/python3.8/site-packages/requests/sessions.py", line 686, in send
    r.content
  File "/usr/local/lib/python3.8/site-packages/requests/models.py", line 828, in content
    self._content = b''.join(self.iter_content(CONTENT_CHUNK_SIZE)) or b''
  File "/usr/local/lib/python3.8/site-packages/requests/models.py", line 753, in generate
    raise ChunkedEncodingError(e)
requests.exceptions.ChunkedEncodingError: ("Connection broken: ConnectionResetError(104, 'Connection reset by peer')", ConnectionResetError(104, 'Connection reset by peer'))

I don't know if is related to the previous error.

enter image description here

Edited

Dockerfile

FROM python:3.8.2-buster

WORKDIR /usr/src/app

COPY . .

RUN pip install --no-cache-dir -r requirements.txt

EXPOSE 8080

CMD ["python", "app.py"]

Kubernetes Deployment YML

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-ms
spec:
  replicas: 1
  selector:
    matchLabels:
      ip-service: my-ms
  template:
    metadata:
      labels:
        ip-service: my-ms
    spec:
      containers:
        - name: my-ms
          image: myprivate.azurecr.io/my-ms:latest
          ports:
            - containerPort: 8080
          resources:
            requests:
              cpu: 100m
              memory: 10Mi
      imagePullSecrets:
        - name: tecnoregistry

Edited 2

I get the same error I have on Kubernetes, but running the script locally, I change the SSL value from True to False in the service call Influx(host=r'influx_HOST', port=8086, username='MY_USER', password='***', database='DB_NAME', ssl=False).

~$ python3 app.py
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/urllib3/response.py", line 360, in _error_catcher
    yield
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/urllib3/response.py", line 442, in read
    data = self._fp.read(amt)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/http/client.py", line 457, in read
    n = self.readinto(b)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/http/client.py", line 501, in readinto
    n = self.fp.readinto(b)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/socket.py", line 589, in readinto
    return self._sock.recv_into(b)
ConnectionResetError: [Errno 54] Connection reset by peer

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/requests/models.py", line 750, in generate
    for chunk in self.raw.stream(chunk_size, decode_content=True):
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/urllib3/response.py", line 494, in stream
    data = self.read(amt=amt, decode_content=decode_content)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/urllib3/response.py", line 459, in read
    raise IncompleteRead(self._fp_bytes_read, self.length_remaining)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/contextlib.py", line 130, in __exit__
    self.gen.throw(type, value, traceback)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/urllib3/response.py", line 378, in _error_catcher
    raise ProtocolError('Connection broken: %r' % e, e)
urllib3.exceptions.ProtocolError: ("Connection broken: ConnectionResetError(54, 'Connection reset by peer')", ConnectionResetError(54, 'Connection reset by peer'))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "app.py", line 1272, in <module>
    generate_excels_consumo()
  File "/Volumes/DATA/IdeaProjects/australia/analitica_py_sw_recolect_info/calculo_excels.py", line 206, in generate_excels_consumo
    df_sector = influx_kpis.multiple_query_to_multiple_df(queries)
  File "/Volumes/DATA/IdeaProjects/australia/analitica_py_sw_recolect_info/analitica_py_lib_conexiones/conexion_influx.py", line 126, in multiple_query_to_multiple_df
    resultado = self.__cliente.query(";".join(query))
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/influxdb/client.py", line 450, in query
    expected_response_code=expected_response_code
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/influxdb/client.py", line 283, in request
    timeout=self._timeout
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/requests/sessions.py", line 533, in request
    resp = self.send(prep, **send_kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/requests/sessions.py", line 686, in send
    r.content
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/requests/models.py", line 828, in content
    self._content = b''.join(self.iter_content(CONTENT_CHUNK_SIZE)) or b''
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/requests/models.py", line 753, in generate
    raise ChunkedEncodingError(e)
requests.exceptions.ChunkedEncodingError: ("Connection broken: ConnectionResetError(54, 'Connection reset by peer')", ConnectionResetError(54, 'Connection reset by peer'))
like image 666
Isma90 Avatar asked Apr 03 '20 17:04

Isma90


People also ask

Can HTTP request send https?

Yes we can request a https URL using AJAX from a web page which is opened in http web site. Also we can post some data to https website from http web page using form post.

What is HTTP request example?

HTTP works as a request-response protocol between a client and server. Example: A client (browser) sends an HTTP request to the server; then the server returns a response to the client. The response contains status information about the request and may also contain the requested content.


1 Answers

It seems to be a network problem. I faced a similar problem connecting with MongoDB because of Proxy.

By default, each container run by Docker has its own network namespace.

Offering Some Solution Methods:

  1. traceroute <cluster-ip> perform this command and check whether arrive to cluster inside of container attach container and perform the command docker exec -it container /bin/bash.
  2. Check Proxy. export check environment variables related with proxy.
  3. curl www.google.com
  4. Try to connect another things in the cluster. For example MySQL, etc. (Once time a machine write me blacklist automatically I tried to solve connection problem 2 day)
  5. Try to use python-slim image. slim image is based from ubuntu.

It is very good document to understand and solve docker connection problem.

https://pythonspeed.com/articles/docker-connection-refused/

like image 149
Aziz F Dagli Avatar answered Sep 30 '22 17:09

Aziz F Dagli