java.net.SocketException 在简单的 Kubernetes pod 中
java.net.SocketException in simple Kubernetes pod
TL;DR
java.net.SocketException:在可以卷曲到互联网的简单 Kubernetes pod 中无法访问网络(连接失败)。
简短说明
我在 Kubernetes 中设置了一个简单的 Job 对象,它生成一个简单的 pod 以使用 Slack-Api 通过 slack 轮询对话历史记录。
运行 这个应用程序在本地或 dockerized 的工作就像一个魅力。但是当尝试在 Kubernetes 中执行它时,我得到了
java.net.SocketException: Network is unreachable (connect failed)
at java.base/java.net.PlainSocketImpl.socketConnect(Native Method)
at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399)
at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:242)
at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224)
at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.base/java.net.Socket.connect(Socket.java:609)
at okhttp3.internal.platform.Platform.connectSocket(Platform.kt:120)
Kubernetes 配置
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: my-app-job
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: name
image: myimage
imagePullPolicy: Always
ports:
- containerPort: 443
protocol: TCP
- containerPort: 80
protocol: TCP
env:
- name: http_proxy
value: myproxy
- name: https_proxy
value: myproxy
- name: no_proxy
value: myproxy
restartPolicy: OnFailure
试图调试正在发生的事情,我注意到我可以从我的 pod 中卷曲一些东西(所以可以访问 public 互联网)但是当我尝试 ping 时,我得到套接字:不允许操作。
例如:
bash-4.2$ ping www.google.com
ping: socket: Operation not permitted
bash-4.2$ curl -I www.google.com
HTTP/1.1 200 OK
content-type: text/html; charset=ISO-8859-1
p3p: CP="This is not a P3P policy! See g.co/p3phelp for more info."
date: Wed, 29 Sep 2021 09:18:36 GMT
server: gws
x-xss-protection: 0
x-frame-options: SAMEORIGIN
expires: Wed, 29 Sep 2021 09:18:36 GMT
cache-control: private
set-cookie: XXXXXXXXXXX
expires=Thu, 31-Mar-2022 09:18:36 GMT; path=/; domain=.google.com; HttpOnly
x-cache: MISS from XXXXXXXXXXX
x-cache-lookup: MISS fXXXXXXXXX
bash-4.2$ command terminated with exit code 137
我认为我缺少一些配置。我尝试使用 NodePort
服务打开端口,但没有成功。有什么调试方法吗?
Java 不从环境继承代理设置。
您需要使用Java系统属性
指定代理
-Dhttp.proxyHost=locahost -Dhttp.proxyPort=9900
TL;DR
java.net.SocketException:在可以卷曲到互联网的简单 Kubernetes pod 中无法访问网络(连接失败)。
简短说明
我在 Kubernetes 中设置了一个简单的 Job 对象,它生成一个简单的 pod 以使用 Slack-Api 通过 slack 轮询对话历史记录。
运行 这个应用程序在本地或 dockerized 的工作就像一个魅力。但是当尝试在 Kubernetes 中执行它时,我得到了
java.net.SocketException: Network is unreachable (connect failed)
at java.base/java.net.PlainSocketImpl.socketConnect(Native Method)
at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399)
at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:242)
at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224)
at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.base/java.net.Socket.connect(Socket.java:609)
at okhttp3.internal.platform.Platform.connectSocket(Platform.kt:120)
Kubernetes 配置
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: my-app-job
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: name
image: myimage
imagePullPolicy: Always
ports:
- containerPort: 443
protocol: TCP
- containerPort: 80
protocol: TCP
env:
- name: http_proxy
value: myproxy
- name: https_proxy
value: myproxy
- name: no_proxy
value: myproxy
restartPolicy: OnFailure
试图调试正在发生的事情,我注意到我可以从我的 pod 中卷曲一些东西(所以可以访问 public 互联网)但是当我尝试 ping 时,我得到套接字:不允许操作。
例如:
bash-4.2$ ping www.google.com
ping: socket: Operation not permitted
bash-4.2$ curl -I www.google.com
HTTP/1.1 200 OK
content-type: text/html; charset=ISO-8859-1
p3p: CP="This is not a P3P policy! See g.co/p3phelp for more info."
date: Wed, 29 Sep 2021 09:18:36 GMT
server: gws
x-xss-protection: 0
x-frame-options: SAMEORIGIN
expires: Wed, 29 Sep 2021 09:18:36 GMT
cache-control: private
set-cookie: XXXXXXXXXXX
expires=Thu, 31-Mar-2022 09:18:36 GMT; path=/; domain=.google.com; HttpOnly
x-cache: MISS from XXXXXXXXXXX
x-cache-lookup: MISS fXXXXXXXXX
bash-4.2$ command terminated with exit code 137
我认为我缺少一些配置。我尝试使用 NodePort
服务打开端口,但没有成功。有什么调试方法吗?
Java 不从环境继承代理设置。
您需要使用Java系统属性
指定代理-Dhttp.proxyHost=locahost -Dhttp.proxyPort=9900