You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Quarkus升级至3.6.6后Kubernetes Client出现TimeoutException求助

升级Quarkus到3.6.6后Kubernetes Client异步调用TimeoutException问题解决

问题背景

将Quarkus从2.11.1版本升级到3.6.6版本后,原本运行正常的Kubernetes Client出现TimeoutException异常。异常发生在vert.x-worker-thread-10线程的异步加载过程中,抛出io.fabric8.kubernetes.client.KubernetesClientException。目前给方法添加@Blocking(io.smallrye.common.annotation)注解可临时解决,但引入阻塞行为并非最佳实践,期望实现无阻塞的正常运行。

完整异常栈

(vert.x-worker-thread-10) Exception thrown during asynchronous load: io.fabric8.kubernetes.client.KubernetesClientException
        at io.fabric8.kubernetes.client.dsl.internal.OperationSupport.waitForResult(OperationSupport.java:509)
        at io.fabric8.kubernetes.client.dsl.internal.OperationSupport.handleResponse(OperationSupport.java:524)
        at io.fabric8.kubernetes.client.dsl.internal.OperationSupport.handleGet(OperationSupport.java:467)
        at io.fabric8.kubernetes.client.dsl.internal.BaseOperation.handleGet(BaseOperation.java:791)
        at io.fabric8.kubernetes.client.dsl.internal.BaseOperation.requireFromServer(BaseOperation.java:192)
        at io.fabric8.kubernetes.client.dsl.internal.BaseOperation.get(BaseOperation.java:148)
        at io.fabric8.kubernetes.client.dsl.internal.BaseOperation.get(BaseOperation.java:97)
        at com.rockwell.idp.security.identity.cache.IdentityProviderCache.getConfigMap(IdentityProviderCache.java:112)
        at com.rockwell.idp.security.identity.cache.IdentityProviderCache.lambda$getIdentityProviderDetailsByTenantId$0(IdentityProviderCache.java:103)
        at io.smallrye.context.impl.wrappers.SlowContextualFunction.apply(SlowContextualFunction.java:21)
        at io.smallrye.mutiny.operators.uni.UniOnItemTransform$UniOnItemTransformProcessor.onItem(UniOnItemTransform.java:36)
        at io.smallrye.mutiny.operators.uni.UniOnItemTransform$UniOnItemTransformProcessor.onItem(UniOnItemTransform.java:43)
        at io.smallrye.mutiny.vertx.AsyncResultUni.lambda$subscribe$1(AsyncResultUni.java:35)
        at io.smallrye.mutiny.vertx.DelegatingHandler.handle(DelegatingHandler.java:25)
        at io.vertx.core.impl.future.FutureImpl$3.onSuccess(FutureImpl.java:141)
        at io.vertx.core.impl.future.FutureBase.lambda$emitSuccess$0(FutureBase.java:54)
        at io.vertx.core.impl.WorkerContext.execute(WorkerContext.java:111)
        at io.vertx.core.impl.WorkerContext.execute(WorkerContext.java:53)
        at io.vertx.core.impl.WorkerContext.execute(WorkerContext.java:65)
        at io.vertx.core.impl.DuplicatedContext.execute(DuplicatedContext.java:184)
        at io.vertx.core.impl.future.FutureBase.emitSuccess(FutureBase.java:51)
        at io.vertx.core.impl.future.FutureImpl.tryComplete(FutureImpl.java:211)
        at io.vertx.core.impl.future.PromiseImpl.tryComplete(PromiseImpl.java:23)
        at io.vertx.core.Promise.complete(Promise.java:66)
        at io.vertx.core.eventbus.impl.ReplyHandler.dispatch(ReplyHandler.java:97)
        at io.vertx.core.eventbus.impl.HandlerRegistration$InboundDeliveryContext.execute(HandlerRegistration.java:137)
        at io.vertx.core.eventbus.impl.DeliveryContextBase.next(DeliveryContextBase.java:80)
        at io.vertx.core.eventbus.impl.DeliveryContextBase.dispatch(DeliveryContextBase.java:43)
        at io.vertx.core.eventbus.impl.HandlerRegistration.dispatch(HandlerRegistration.java:98)
        at io.vertx.core.eventbus.impl.ReplyHandler.doReceive(ReplyHandler.java:81)
        at io.vertx.core.eventbus.impl.HandlerRegistration.lambda$receive$0(HandlerRegistration.java:49)
        at io.vertx.core.impl.WorkerContext.lambda$null$1(WorkerContext.java:92)
        at io.vertx.core.impl.TaskQueue.run(TaskQueue.java:76)
        at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
        at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2513)
        at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1538)
        at org.jboss.threads.DelegatingRunnable.run(DelegatingRunnable.java:29)
        at org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:29)
        at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
        at java.base/java.lang.Thread.run(Thread.java:840)
Caused by: java.util.concurrent.TimeoutException
        at io.fabric8.kubernetes.client.utils.AsyncUtils.lambda$withTimeout$0(AsyncUtils.java:42)
        at io.fabric8.kubernetes.client.utils.Utils.lambda$schedule$6(Utils.java:473)
        at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
        ... 1 more

问题根源

Quarkus 3.x对Vert.x线程模型和上下文传递做了更严格的约束,Fabric8 Kubernetes Client的同步API(如get())在Vert.x工作线程中调用时,内部异步等待逻辑无法正确绑定当前Vert.x上下文,导致任务超时。

无阻塞解决方案

1. 替换为Kubernetes Client异步API

直接使用Client提供的异步方法,返回Uni类型,保持调用链非阻塞:

// 原同步代码
ConfigMap configMap = client.configMaps().inNamespace(namespace).withName(name).get();

// 替换为异步API
Uni<ConfigMap> configMapUni = client.configMaps().inNamespace(namespace).withName(name).getAsync();

在Mutiny流中直接订阅该Uni,无需额外处理阻塞。

2. 开启Kubernetes Client上下文传递

在application.properties中添加配置,确保Client操作继承Quarkus的Vert.x上下文:

quarkus.kubernetes-client.context-propagation=true

该配置会自动绑定上下文,避免因上下文丢失导致的超时。

3. 调整超时参数(临时应急)

如果上述方案暂未生效,可先调整超时时间给操作足够执行窗口:

quarkus.kubernetes-client.request-timeout=30s
quarkus.kubernetes-client.connection-timeout=10s

注意这只是临时方案,核心还是要解决上下文或API调用方式问题。

4. 优化Vert.x Worker线程池配置

Quarkus 3.x默认Worker线程池可能无法支撑升级后的负载,调整线程池参数:

quarkus.vertx.worker-pool-size=16
quarkus.vertx.max-worker-execution-time=5s

确保Worker线程有足够资源处理异步任务。

内容的提问来源于stack exchange,提问作者mitesh_ra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 17:42:23