Как Python получает доступ к API-клиенту k8s через прокси-сервер Socks5

Доступ к апиклиенту k8s проходит успешно без использования прокси следующим образом:

      configuration = client. Configuration()
configuration.verify_ssl = False
configuration.host = "xxx"
configuration.api_key = {"authorization": "Bearer " + self.token}
c = api_client. ApiClient(configuration=configuration)
api = core_v1_api.CoreV1Api(c)
# Query the namespace, the step is successful
result = api.list_namespace()

Однако, поскольку API-интерфейс k8s генерируется автоматически, прокси-сервер socks не может быть установлен напрямую:https://github.com/kubernetes-client/python/issues/1064

Поскольку k8s использует restClient, передать прокси-сервер socks5 невозможно. В настоящее время для подключения используется этот метод, но он недействителен:

      configuration = client. Configuration()
configuration.verify_ssl = False
configuration.api_key = {"authorization": "Bearer " + self.token}
configuration.host = "xxx"
c = api_client. ApiClient(configuration=configuration)
proxy = "socks5://xxx:1080"
c.rest_client.pool_manager = self.build_socks_proxy_manager(configuration)
api = core_v1_api.CoreV1Api(c)
# Query namespace, this step timed out, unable to connect
result = api.list_namespace()

def build_socks_proxy_manager(self, configuration, pools_size=4, maxsize=None):
  # skip some initialization steps
  return SOCKSProxyManager(num_pools=pools_size,
                    maxsize=maxsize,
                    cert_reqs = cert_reqs,
                    ca_certs=ca_certs,
                    cert_file=configuration.cert_file,
                    key_file=configuration.key_file,
                    proxy_url=configuration.proxy,
                    **addition_pool_args)

Обновлено на основе ответа Ларкса:

      configuration = client. Configuration()
configuration.verify_ssl = False
configuration.api_key = {"authorization": "Bearer " + self.token}
configuration.host = "xxx"
c = api_client. ApiClient(configuration=configuration)
proxy = "socks5://xxx:1080"
c.rest_client.pool_manager = SOCKSProxyManager(proxy_url=proxy)
api = core_v1_api.CoreV1Api(c)
# Query namespace, this step still timed out, unable to connect
result = api.list_namespace()

1 ответ

Вы устанавливаетеconfiguration.hostна URL-адрес, но это не имеет никакого смысла (socks5://url — это адрес прокси , а не удаленного сервера).

Вы ожидаете установитьconfiguration.proxy, за исключением того, что это не удастся при вызове createApiClient.

Если вы установитеpool_manager после создания экземпляра клиентского объекта кажется, что он работает. То есть, если у меня работает прокси-сервер Socks5localhost:2080, следующий код будет подключаться через прокси:

      import os
from kubernetes import client, config
from urllib3.contrib.socks import SOCKSProxyManager

configuration = client.Configuration()
configuration.verify_ssl = False
configuration.api_key = {
    "authorization": "Bearer ...",
}
configuration.host = "https://api.example.com:6443"
c = client.ApiClient(configuration=configuration)
c.rest_client.pool_manager = SOCKSProxyManager(proxy_url="socks5h://localhost:2080")
api = client.CoreV1Api(c)
print(api.list_namespaced_pod('example-namespace'))
Другие вопросы по тегам