pid 1中的java.net.UnknownHostException,用于kube-dns解析的地址

时间:2016-08-26 21:25:02

标签: java ubuntu docker dns kubernetes

我在机器上收到java.net.UnknownHostException: postgres-service,我可以在命令行上ping postgres-service。这是在Kubernetes(更具体地说是GKE)服务和Docker镜像的背景下。可能是Java需要安装额外的软件包(与ping相比)才能解析符号IP地址,例如postgres-service?我同时猜测答案是否定的,问题在于解决postgres-service来自kube-dns这种特殊情况(见更新)。

UPDATE 证据(包括下面的堆栈跟踪)表明,当Tomcat 9尝试使用connectionURL="jdbc:postgresql://postgres-service/mydb"设置JDBC领域时会触发异常。 URL在Web应用程序的上下文描述符中配置,该应用程序在从tomcat:9派生的Docker镜像内运行。上下文描述符由配置为图像ENTRYPOINT的脚本生成,该脚本也启动Tomcat(就像原始tomcat:9一样),即Dockerfile的最后几行如下所示:

COPY tomcat-entrypoint.sh /
ENTRYPOINT [ "/tomcat-entrypoint.sh" ]
CMD ["catalina.sh", "run"]

我输入ping postgres-service的shell后可以kubectl exec -it <image> bash。可能是Tomcat(当通过Dockerfile的CMD作为图像的“单个进程”与pid 1一起运行时)看到的DNS配置与在其兄弟中运行的bash不同吗?实际DNS configuration使用了kube-dns/etc/resonf.conf显示了这一点。

org.postgresql.util.PSQLException: The connection attempt failed.
    at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:280)
    at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:66)
    at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:211)
    at org.postgresql.Driver.makeConnection(Driver.java:407)
    at org.postgresql.Driver.connect(Driver.java:275)
    at org.apache.catalina.realm.JDBCRealm.open(JDBCRealm.java:661)
    at org.apache.catalina.realm.JDBCRealm.startInternal(JDBCRealm.java:724)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:152)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5054)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:152)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:724)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:700)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734)
    at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:596)
    at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1805)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.net.UnknownHostException: postgres-service
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at org.postgresql.core.PGStream.<init>(PGStream.java:64)
    at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:150)
    ... 19 more

1 个答案:

答案 0 :(得分:0)

到目前为止,我一直在使用没有范围compute-rw的VM实例进行开发(请参阅here)。我现在已经重新创建了它,包括那个范围并在那里重建了所有相关的Docker镜像。显然这已经解决了这个问题。

更新还有第二个问题,我clusterIP: None作为postgres-service服务规范的一部分(现已消失)。它打败了我为什么我仍然能够从同一群集中的另一个pod ping postgres-service