不使用代理访问k8s apiclient成功,如下:
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()
但是由于k8s api是自动生成的,所以不能直接设置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)
根据 lasks 的回答更新:
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()
您正在将
configuration.host
设置为 socks5://
url,但这没有任何意义(socks5://
url 是 proxy 的地址,而不是远程服务器)。
你会期望设置
configuration.proxy
,除了当你调用创建一个 ApiClient
时这将失败。
如果在
实例化客户端对象后设置
pool_manager
它似乎工作。也就是说,如果我在 localhost:2080
上运行了一个 socks5 代理,下面的代码将通过代理连接:
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'))