python 如何通过 socks5 代理访问 k8s api client?
更新一下背景:
源端是 k8s 的 pod,socks 服务器是 k8s 同命名空间的一个 pod,源端通过 svc name 访问 socks 服务器:proxy = "socks-server:1080"
不使用代理时访问 k8s apiclient 如下:这一类请求是可以成功的。
from urllib3.contrib.socks import SOCKSProxyManagerfrom kubernetes.client import api_client
from kubernetes.client.api import core_v1_api
from kubernetes import client
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)
# 查询命名空间,该步骤成功
result = api.list_namespace()
由于k8s使用的是rest client,所以没办法传递socks5代理,手动对实例化后的 rest client 赋值,结果是访问超时(无法连通):
# 省略导入信息configuration = client.Configuration()
configuration.verify_ssl = False
configuration.api_key = {"authorization": "Bearer " + self.token}
c = api_client.ApiClient(configuration=configuration)
configuration.host = "xxx"
configuration.proxy = "socks5://xxx:1080"
# 该步骤设置socks代理
c.rest_client.pool_manager = SOCKSProxyManager(proxy_url=configuration.proxy)
api = core_v1_api.CoreV1Api(c)
# 查询命名空间,该步骤超时,无法连接
result = api.list_namespace()
通过以上方式发送请求依旧超时,查看socks代理服务器上的请求,发现tcp包里面没有host的信息。
请教下怎么通过 socks5 代理访问 k8s 的 api client,以上的方式是否有误?
回答:
你的代码已经正确地设置了代理,但是可能需要进行一些调整以确保使用代理时能正确传递host信息。可以试一下下面的代码,通过在 ApiClient 类中重写 request 方法来添加代理支持:
from kubernetes.client import ApiClientfrom kubernetes.client import Configuration
from kubernetes.client.api import CoreV1Api
from urllib3.contrib.socks import SOCKSProxyManager
class ApiClientWithSocksProxy(ApiClient):
def __init__(self, configuration):
super().__init__(configuration)
self.pool_manager = SOCKSProxyManager(proxy_url=configuration.proxy, socket_options=self.pool_manager.connection_pool_kw['socket_options'])
# 省略导入信息
configuration = Configuration()
configuration.verify_ssl = False
configuration.api_key = {"authorization": "Bearer " + self.token}
configuration.host = "xxx"
configuration.proxy = "socks5://xxx:1080"
# 使用自定义的 ApiClient 类创建实例
c = ApiClientWithSocksProxy(configuration=configuration)
api = CoreV1Api(c)
# 查询命名空间,该步骤超时,无法连接
result = api.list_namespace()
这段代码创建了一个自定义的 ApiClientWithSocksProxy 类,继承自 ApiClient 并重写了 init 方法,以使用 SOCKSProxyManager 替换默认的连接池管理器。这样做可以确保在使用代理时能正确传递host信息。
回答:
可以考虑使用第三方库 socks
来实现通过 socks5 代理访问 k8s 的 api client。具体步骤如下:
- 安装
socks
库。
pip install PySocks
- 导入
socks
库并使用socks.socksocket
替换默认的socket
模块。
import socksimport socket
from kubernetes.client import api_client
from kubernetes.client.api import core_v1_api
from kubernetes import client
socks.set_default_proxy(socks.SOCKS5, "localhost", 1080)
socket.socket = socks.socksocket
注意:这里的代理地址应该根据实际情况进行修改。
- 创建 kubernetes 的 api client。
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)
# 查询命名空间,该步骤应该成功
result = api.list_namespace()
参考文档:https://github.com/Anorov/PySocks
以上是 python 如何通过 socks5 代理访问 k8s api client? 的全部内容, 来源链接: utcz.com/p/938827.html