使用背景
在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库之前。
于是按照他们的解决思路:
- 将引用gavent库放在程序最开头位置
- 将monkey.patch_all()放在最开头
再次尝试调用read_namespaced_config_map时,不再报错。
解决问题。