如何解决Google Kubernetes Engine上Python库不兼容问题
问题与错误日志
你的GKE Pod启动时报错,核心是依赖版本不兼容:
During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/env/lib/python3.7/site-packages/gunicorn/workers/sync.py", line 135, in handle self.handle_request(listener, req, client, addr) File "/env/lib/python3.7/site-packages/gunicorn/workers/sync.py", line 178, in handle_request respiter = self.wsgi(environ, resp.start_response) File "/env/lib/python3.7/site-packages/django/core/handlers/wsgi.py", line 133, in __call__ response = self.get_response(request) File "/env/lib/python3.7/site-packages/django/core/handlers/base.py", line 130, in get_response response = self._middleware_chain(request) File "/env/lib/python3.7/site-packages/django/core/handlers/exception.py", line 49, in inner response = response_for_exception(request, exc) File "/env/lib/python3.7/site-packages/django/core/handlers/exception.py", line 114, in response_for_exception response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info()) File "/env/lib/python3.7/site-packages/django/core/handlers/exception.py", line 152, in handle_uncaught_exception callback = resolver.resolve_error_handler(500) File "/env/lib/python3.7/site-packages/django/urls/resolvers.py", line 615, in resolve_error_handler callback = getattr(self.urlconf_module, 'handler%s' % view_type, None) File "/env/lib/python3.7/site-packages/django/utils/functional.py", line 48, in __get__ res = instance.__dict__[self.name] = self.func(instance) File "/env/lib/python3.7/site-packages/django/urls/resolvers.py", line 595, in urlconf_module return import_module(self.urlconf_name) File "/opt/python3.7/lib/python3.7/importlib/__init__.py", line 127, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1006, in _gcd_import File "<frozen importlib._bootstrap>", line 983, in _find_and_load File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 677, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 728, in exec_module File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed File "/home/vmagent/app/mysite/urls.py", line 38, in <module> re_path(r'^rosetta/', include('rosetta.urls')) File "/env/lib/python3.7/site-packages/django/urls/conf.py", line 34, in include urlconf_module = import_module(urlconf_module) File "/opt/python3.7/lib/python3.7/importlib/__init__.py", line 127, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1006, in _gcd_import File "<frozen importlib._bootstrap>", line 983, in _find_and_load File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 677, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 728, in exec_module File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed File "/env/lib/python3.7/site-packages/rosetta/urls.py", line 4, in <module> from . import views File "/env/lib/python3.7/site-packages/rosetta/views.py", line 30, in <module> from .translate_utils import TranslationException, translate File "/env/lib/python3.7/site-packages/rosetta/translate_utils.py", line 4, in <module> import requests File "/env/lib/python3.7/site-packages/requests/__init__.py", line 43, in <module> import urllib3 File "/env/lib/python3.7/site-packages/urllib3/__init__.py", line 42, in <module> "urllib3 v2.0 only supports OpenSSL 1.1.1+, currently " ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1+, currently the 'ssl' module is compiled with 'OpenSSL 1.0.2g 1 Mar 2016'. See: https://github.com/urllib3/urllib3/issues/2168
解决方法
核心矛盾是urllib3 v2.0要求OpenSSL 1.1.1+,但GKE Pod的基础环境用的是OpenSSL 1.0.2g,以下是不用大改现有配置的方案:
- 锁定urllib3兼容版本:在项目的
requirements.txt里添加一行urllib3<2.0,这样部署时会自动安装v2.0以下的版本,适配旧版OpenSSL。不用修改其他依赖或项目配置,仅需加这一行版本限制。 - 更换基础镜像:如果不想限制urllib3版本,把Dockerfile里的基础镜像换成带有OpenSSL 1.1.1+的Python 3.7镜像,比如
python:3.7-slim-buster。这个镜像的系统默认搭载OpenSSL 1.1.1,能满足urllib3 v2.0的要求,仅需替换镜像地址,无需改动项目代码或依赖配置。 - 临时测试方案(不推荐生产用):设置环境变量
URLLIB3_DISABLE_WARNINGS=1,但这只能屏蔽警告,无法解决导入错误,仅适合临时调试。
内容的提问来源于stack exchange,提问作者Kuth
相关产品推荐
相关产品推荐

