python k8s库,read_namespaced_config_map:maximum recursion depth exceeded

文章描述了一个在Python环境中,使用gevent库并调用Kubernetes官方客户端时遇到的偶发性‘maximumrecursiondepthexceeded’异常问题。通过分析堆栈信息,发现问题可能由库的引用顺序引起。解决方案是将gevent库的monkey.patch_all()放在程序开头,这解决了问题,使得调用read_namespaced_config_map不再报错。
摘要由CSDN通过智能技术生成

使用背景

在python中,调用了gevent库,同时引用了官方的k8s库接口:

GitHub - kubernetes-client/python: Official Python client library for kubernetesOfficial Python client library for kubernetes. Contribute to kubernetes-client/python development by creating an account on GitHub.https://github.com/kubernetes-client/python调用read_namespaced_config_map时报出异常:

maximum recursion depth exceeded
maximum recursion depth exceeded while calling a Python object

并且是偶现问题,感觉比较奇怪,因为我没有使用过递归,官方库里应该也不会出这么低级的问题,于是输出堆栈信息看一下:

File "/opt/pgpool/agent/k8sClient.py", line 151, in read_secrets
    return self._k8s_core_api.read_namespaced_secret(name, self._namespace)
  File "/opt/pgpool/.local/lib/python3.7/site-packages/kubernetes/client/api/core_v1_api.py", line 24803, in read_namespaced_secret
    return self.read_namespaced_secret_with_http_info(name, namespace, **kwargs)  # noqa: E501
  File "/opt/pgpool/.local/lib/python3.7/site-packages/kubernetes/client/api/core_v1_api.py", line 24904, in read_namespaced_secret_with_http_info
    collection_formats=collection_formats)
  File "/opt/pgpool/.local/lib/python3.7/site-packages/kubernetes/client/api_client.py", line 353, in call_api
    _preload_content, _request_timeout, _host)
  File "/opt/pgpool/.local/lib/python3.7/site-packages/kubernetes/client/api_client.py", line 184, in __call_api
    _request_timeout=_request_timeout)
  File "/opt/pgpool/.local/lib/python3.7/site-packages/kubernetes/client/api_client.py", line 377, in request
    headers=headers)
  File "/opt/pgpool/.local/lib/python3.7/site-packages/kubernetes/client/rest.py", line 245, in GET
    query_params=query_params)
  File "/opt/pgpool/.local/lib/python3.7/site-packages/kubernetes/client/rest.py", line 218, in request
    headers=headers)
  File "/opt/pgpool/.local/lib/python3.7/site-packages/urllib3/request.py", line 75, in request
    method, url, fields=fields, headers=headers, **urlopen_kw
  File "/opt/pgpool/.local/lib/python3.7/site-packages/urllib3/request.py", line 96, in request_encode_url
    return self.urlopen(method, url, **extra_kw)
  File "/opt/pgpool/.local/lib/python3.7/site-packages/urllib3/poolmanager.py", line 376, in urlopen
    response = conn.urlopen(method, u.request_uri, **kw)
  File "/opt/pgpool/.local/lib/python3.7/site-packages/urllib3/connectionpool.py", line 710, in urlopen
    chunked=chunked,
  File "/opt/pgpool/.local/lib/python3.7/site-packages/urllib3/connectionpool.py", line 386, in _make_request
    self._validate_conn(conn)
  File "/opt/pgpool/.local/lib/python3.7/site-packages/urllib3/connectionpool.py", line 1042, in _validate_conn
    conn.connect()
  File "/opt/pgpool/.local/lib/python3.7/site-packages/urllib3/connection.py", line 397, in connect
    cert_reqs=resolve_cert_reqs(self.cert_reqs),
  File "/opt/pgpool/.local/lib/python3.7/site-packages/urllib3/util/ssl_.py", line 312, in create_urllib3_context
    context.options |= options
  File "/usr/lib/python3.7/ssl.py", line 507, in options
    super(SSLContext, SSLContext).options.__set__(self, value)
  File "/usr/lib/python3.7/ssl.py", line 507, in options
    super(SSLContext, SSLContext).options.__set__(self, value)
  File "/usr/lib/python3.7/ssl.py", line 507, in options
    super(SSLContext, SSLContext).options.__set__(self, value)

发现最后一直卡死在super(SSLContext, SSLContext).options.__set__(self, value)

 

解决方式

在网上发现了大量的类似报错,看来不是k8s库的原因。

解决方式调研:

python - "RecursionError: maximum recursion depth exceeded" from ssl.py: `super(SSLContext, SSLContext).options.__set__(self, value)` - Stack Overflow

python - Maximum recursion depth exceeded on SSLContext (eventlet, flask, flask-socketio, tweepy) - Stack Overflow

发现我的问题很可能是因为引用k8s库在引用gavent库之前。

于是按照他们的解决思路:

  1. 将引用gavent库放在程序最开头位置
  2. 将monkey.patch_all()放在最开头

 

 

再次尝试调用read_namespaced_config_map时,不再报错。

解决问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aiky哇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值