【问题标题】:Couchbase timeout on bucket operation when in K8S pod在 K8S pod 中存储桶操作的 Couchbase 超时
【发布时间】: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


【解决方案1】:

问题是我造成的 - 我创建的存储桶没有设置密码,我尝试使用密码连接到它...

我想删除整个答案,但我认为如果其他人遇到类似问题可能会有所帮助

【讨论】:

  • 很高兴你知道了。错误消息似乎不正确。您介意在issues.couchbase.com 提交错误吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-20
  • 1970-01-01
  • 2015-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多