Подключение к внешним сетям из виртуальной машины minikube за прокси-сервером в док-контейнере

У меня есть активный кластер kubernetes внутри виртуальной машины Minikube (с использованием VirtualBox в качестве драйвера), поэтому для развертывания новых контейнеров я могу загружать образы, поскольку это соединение уже установлено с помощью службы istio, теперь, если я в первую очередь подключаюсь к своей виртуальной машине minikube по ssh Я не могу получить содержимое https, но содержимое http подключается после установки прокси и no_proxy, но если я хочу получить доступ к какой-либо ссылке внутри моих контейнеров, скажем, простой модуль с изображением python и библиотекой urllib, и я хочу подключиться изнутри этого модуля а затем распечатать содержимое по любой ссылке (например, http://python.org). Я не могу этого сделать, все, что я получаю, это отсутствие маршрута к ошибке хоста в журналах, которая указывает на некоторую проблему с подключением из-за прокси .

def basic():
    import urllib.request
    print("inside basic funtion")
    with urllib.request.urlopen('http://python.org/') as response:
        html = response.read()
        print(html)

это код Python, который я запускаю из своего контейнера в качестве компонента конвейера.

Самая последняя ошибка, которую я получил-

Traceback (most recent call last):
  File "/usr/local/lib/python3.7/urllib/request.py", line 1317, in do_open
    encode_chunked=req.has_header('Transfer-encoding'))
  File "/usr/local/lib/python3.7/http/client.py", line 1229, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "/usr/local/lib/python3.7/http/client.py", line 1275, in _send_request
    self.endheaders(body, encode_chunked=encode_chunked)
  File "/usr/local/lib/python3.7/http/client.py", line 1224, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "/usr/local/lib/python3.7/http/client.py", line 1016, in _send_output
    self.send(msg)
  File "/usr/local/lib/python3.7/http/client.py", line 956, in send
    self.connect()
  File "/usr/local/lib/python3.7/http/client.py", line 928, in connect
    (self.host,self.port), self.timeout, self.source_address)
  File "/usr/local/lib/python3.7/socket.py", line 727, in create_connection
    raise err
  File "/usr/local/lib/python3.7/socket.py", line 716, in create_connection
    sock.connect(sa)
TimeoutError: [Errno 110] Operation timed out
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "<string>", line 11, in <module>
  File "<string>", line 3, in basic
  File "/usr/local/lib/python3.7/urllib/request.py", line 222, in urlopen
    return opener.open(url, data, timeout)
  File "/usr/local/lib/python3.7/urllib/request.py", line 525, in open
   response = self._open(req, data)
  File "/usr/local/lib/python3.7/urllib/request.py", line 543, in _open
    '_open', req)
  File "/usr/local/lib/python3.7/urllib/request.py", line 503, in _call_chain
    result = func(*args)
  File "/usr/local/lib/python3.7/urllib/request.py", line 1345, in http_open
    return self.do_open(http.client.HTTPConnection, req)
  File "/usr/local/lib/python3.7/urllib/request.py", line 1319, in do_open
    raise URLError(err)
urllib.error.URLError: <urlopen error [Errno 110] Operation timed out>

Я начал миникубе как-

minikube start --cpus 6 --memory 12288 --disk-size=80g --extra-config=apiserver.service-account-issuer=api --extra-config=apiserver.service-account-signing-key-file=/var/lib/minikube/certs/apiserver.key --extra-config=apiserver.service-account-api-audiences=api --kubernetes-version v1.14.0

после установки переменных env.

Обновление: я создал другой контейнер только для проверки завитка внутри компонента как (я использую библиотеки kfp для создания контейнеров)

def curl_op(text):
    return dsl.ContainerOp(
        name='curl',
        image='tutum/curl',
        command=['sh', '-c'],
        arguments=['curl -x http://<proxy-server>:<proxy-port> "$0"', text]
    )

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


person Chinmay Singh    schedule 07.01.2021    source источник
comment
Поскольку вы говорите, что http работает, а https нет, я думаю, что вы добавили порт 8443 к вашему Service в файле k8s yml. Кроме того, пожалуйста, опубликуйте yml файлов.   -  person Felipe    schedule 07.01.2021
comment
Вы взглянули на stackoverflow.com/questions/43728355/ stackoverflow.com/questions/53894597/?   -  person Malgorzata    schedule 07.01.2021
comment
Да, я проверил это, к сожалению, в моем случае это не проблема, я могу подключаться к внешним ссылкам изнутри моей виртуальной машины Minikube и, следовательно, могу извлекать образы докеров и тому подобное для создания модулей, проблема заключается в том, когда я пытаюсь подключиться из внутри модулей, которые в моем случае являются частью компонента конвейера, случай с urllib - это просто базовый тестовый пример, который я создал, более общий тестовый пример заключался в том, что я пытался загрузить данные csv из этих модулей изображений python, а затем выполнить некоторые манипуляции, где я снова не смог скачать файл csv, так как это внешние ссылки.   -  person Chinmay Singh    schedule 07.01.2021
comment
@Felipe На самом деле порт и узлы установлены правильно, поскольку проблема с http характерна для wget, я могу закручивать веб-сайты с протоколами http и https, проблема возникает только при попытке подключения изнутри модулей.   -  person Chinmay Singh    schedule 08.01.2021
comment
Попробуйте установить файл /proc/sys/net/bridge/bridge-nf-call-iptables с 1, если он еще не установлен внутри vm. Есть некоторые проблемы с этим с minikube. Это может помочь. sudo echo 1 › /proc/sys/net/bridge/bridge-nf-call-iptables   -  person Luffy    schedule 08.01.2021
comment
Странно, что все эти файлы по умолчанию пусты и доступны только для чтения — /proc/sys/net/bridge/bridge-nf-call-iptables, /etc/kubernetes/manifests (все файлы yaml внутри — etcd.yaml, kube-controller -manager.yaml, kube-apiserver.yaml, kube-scheduler.yaml). Не могу также сделать chmod, чтобы изменить разрешения.   -  person Chinmay Singh    schedule 08.01.2021


Ответы (1)


Итак, для запуска приведенного выше кода Python я упомянул компонент конвейера. Я добавил переменные среды, используя библиотеку os, и эта отдельная часть смогла подключиться к внешним сетям. Обновленный код Python-

def basic():
    import urllib.request
    import os
    proxy = 'http://proxy-path:port'

    os.environ['http_proxy'] = proxy 
    os.environ['HTTP_PROXY'] = proxy
    os.environ['https_proxy'] = proxy
    os.environ['HTTPS_PROXY'] = proxy

    print("inside basic funtion")
    with urllib.request.urlopen('http://python.org/') as response:
        html = response.read()
        print(html)

И если образ докера создается с нуля без помощи функции конвейерной библиотеки, нам нужно просто добавить детали env в наш файл докера обычным способом после вызова базового образа:

ENV HTTP_PROXY http://proxy-path:port
ENV HTTPS_PROXY http://proxy-path:port
person Chinmay Singh    schedule 03.02.2021