【发布时间】:2023-03-28 13:58:01
【问题描述】:
我能够将我的问题缩小到以下情况:
我正在使用两个容器创建 Kubernetes pod:
- couchbase - 带有一个来自官方 Couchbase 3.1 映像的存储桶的初始化版本
- 我的 Java 应用程序尝试连接到 Couchbase 并使用此存储桶
我的应用程序代码如下(主要功能的全部内容):
CouchbaseEnvironment ce = DefaultCouchbaseEnvironment.builder()
.connectTimeout(10000)
.build();
CouchbaseCluster cluster = CouchbaseCluster.create(ce, "127.0.0.1");
Bucket bucket = cluster.openBucket("my_user", "some_pass");
JsonObject jo = JsonObject.empty();
jo.put("SomeName", "someValue");
bucket.upsert(JsonDocument.create("my_id", jo));
最后一个命令超时失败:
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:54)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.RuntimeException: java.util.concurrent.TimeoutException
at com.couchbase.client.java.util.Blocking.blockForSingle(Blocking.java:93)
at com.couchbase.client.java.CouchbaseBucket.upsert(CouchbaseBucket.java:267)
at com.couchbase.client.java.CouchbaseBucket.upsert(CouchbaseBucket.java:262)
at CConfig.main(CConfig.java:19)
... 6 more
Caused by: java.util.concurrent.TimeoutException
... 10 more
Exception in thread "main" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:62)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:54)
... 1 more
Caused by: java.lang.RuntimeException: java.util.concurrent.TimeoutException
at com.couchbase.client.java.util.Blocking.blockForSingle(Blocking.java:93)
at com.couchbase.client.java.CouchbaseBucket.upsert(CouchbaseBucket.java:267)
at com.couchbase.client.java.CouchbaseBucket.upsert(CouchbaseBucket.java:262)
at CConfig.main(CConfig.java:19)
... 6 more
Caused by: java.util.concurrent.TimeoutException
... 10 more
我不知道如何解决这个问题或找到根本原因,因为 Couchbase 只有一个空桶,所以不太可能超时。
PS 为 Couchbase 客户端配置日志时,我能够看到 keep-alive 条目工作得很好。
我正在使用 2.1.0 版的官方 Couchbase java 客户端。也尝试了 2.1.6 和 2.2.5 但没有运气。
【问题讨论】:
-
错误信息表明应用程序无法连接到 Couchbase 服务器。为什么要使用 127.0.0.1 连接? Kubernetes pod IP 地址是短暂的,永远不应直接访问。 blog.couchbase.com/2016/couchbase-on-kubernetes 解释了如何公开 Couchbase pod 并使其在 Kubernetes 集群外部可访问。
-
问题是我能够连接到 Couchbase 服务器。正如我所提到的,我正在保持活动成功等。此外,我认为如果它无法连接到 Couchbase,它会在几行之前失败......
-
我使用 127.0.0.1 因为这两个容器位于同一个 pod 中。我这样做是为了缩小我的问题,因为即使是单独的豆荚我也有问题:/
-
您是否明确将两个容器打包为一个 pod?这不被认为是推荐的做法 AIU。你真的应该在你的 pod 前端添加一个 Service,然后使用这个 IP 地址连接到 Couchbase。
-
相信我,我完全清楚这一点。我遇到了麻烦,所以我将案例简化为我遇到的问题,但我仍然无法说出为什么只有“部分”连接有效:/
标签: java couchbase kubernetes