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
相关产品推荐
相关产品推荐

