我在Kubernetes中运行了一堆Java应用程序。这主要是具有很大代码基础的遗留代码。问题是几乎所有的应用程序都使用一些第三方库。这会导致Java(或确切地说是那些库)忽略Docker容器中的http_proxy
和https_proxy
环境变量。它也忽略Java选项。
由于代码库庞大且具有多个依赖关系,因此将其重写以正确使用http代理是一项艰巨的任务。我们在一个应用程序中重新配置了与Jsoup相关的全部代码。这很容易做到,但是我们有更复杂的应用程序,甚至有些根本没有源代码。
因此,有什么方法可以使整个HTTP代理系统的AKA对Java透明?只需通过代理强制任何http / s流量即可。
我已经尝试了许多技巧和调整,但一无所获。请记住,我无法在k8s节点上设置全局规则。我不想与多个HTTP代理一起使用。
感谢任何帮助。
更新:
运行Java与:
-Dhttp.proxyHost=my_proxy_ip -Dhttp.proxyPort=my_proxy_port
或:
-Djava.net.useSystemProxies=true
不幸的是,它不起作用。像这样进行硬编码:
System.getProperties().put("http.proxyHost", "someProxyURL");
System.getProperties().put("http.proxyPort", "someProxyPort");
也失败。
这是因为有第三方库,例如Jsoup。除非我们将该库配置为使用代理,否则它不会。仅具有Java本地http工具的代理才能正确使用此类设置。
您可以在Docker主机本身中设置代理,而不是在容器中设置。
$ sudo mkdir -p /etc/systemd/system/docker.service.d
创建一个名为/etc/systemd/system/docker.service.d/http-proxy.conf的文件,该文件添加HTTP_PROXY环境变量:
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:80/"
刷新更改并重新启动
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
您可以找到废弃的Docker文档HERE