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

升级后Spring Boot应用在Minikube中无法创建/替换ConfigMap

问题描述

我有一个本地运行的Spring Boot应用,通过Fabric8 Kubernetes Client与Minikube集群交互,管理ConfigMap等Kubernetes资源。此前应用运行正常,但升级环境后,调用createOrReplaceConfigMap创建或替换ConfigMap时失败。

相关代码片段

private ConfigMap createOrReplaceConfigMap(String resourceName, Map<String, Object> config) throws JsonProcessingException {
    ObjectMapper om = new ObjectMapper();
    Map<String, String> configData = new HashMap<>();
    for (Object key : config.keySet()) {
        configData.put((String) key, om.writeValueAsString(config.get(key)));
    }

    ConfigMap configMap = new ConfigMapBuilder()
        .withMetadata(
            new ObjectMetaBuilder().withName(resourceName).withNamespace("my-namespace").build())
        .withData(configData)
        .build();

    return kubernetesClient.resource(configMap).createOrReplace();
}

环境信息

  • Spring Boot版本:3.1.4,JDK 21
  • Fabric8 Kubernetes Client版本:Gradle依赖 io.fabric8:kubernetes-client:4.6.1
  • Minikube版本:v1.34.0
  • Minikube内Kubernetes版本:客户端v1.31.1,Kustomize v5.4.2

观察结果

  • Spring Boot应用连接本地Minikube集群
  • Minikube运行的Docker容器信息:
CONTAINER ID   IMAGE                                 COMMAND                  CREATED       STATUS       PORTS                                                                                                                                  NAMES
5e189a09c71a   gcr.io/k8s-minikube/kicbase:v0.0.45   "/usr/local/bin/entr…"   11 days ago   Up 11 days   127.0.0.1:53462->22/tcp, 127.0.0.1:53463->2376/tcp, 127.0.0.1:53465->5000/tcp, 127.0.0.1:53466->8443/tcp, 127.0.0.1:53464->32443/tcp   minikube

错误详情

仅执行createOrReplace操作时出错,怀疑原因包括Spring Boot/Fabric8客户端版本变更、Minikube集群Kubernetes API变更、Minikube本身变更;启动时Fabric8客户端能找到~/.kube/config文件。

具体错误日志:

2024-12-03T16:23:36.098Z  INFO 19728 --- [nio-8080-exec-5] c.m.h.service.CampEventService       : Status updated to=NOT_STARTED for camp id=1 was with the status=NOT_STARTED
2024-12-03T16:23:36.104Z ERROR 19728 --- [nio-8080-exec-5] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: io.fabric8.kubernetes.client.KubernetesClientException: Operation: [get]  for kind: [ConfigMap]  with name: [config-1]  in namespace: [test-agents]  failed.] with root cause
java.net.ConnectException: Connection refused
        at java.base/sun.nio.ch.Net.pollConnect(Native Method) ~[na:na]
        ...
        at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na]

疑问

  1. 上述提及的版本是否存在已知兼容性问题?
  2. 可采取哪些额外调试步骤来定位根本原因?
  3. 近期Fabric8或Kubernetes版本中,createOrReplace的行为是否有变更?

解答

1. 版本兼容性问题

Fabric8 Kubernetes Client 4.6.1是2020年的旧版本,与你使用的Kubernetes v1.31.1(2024年发布)跨了多个大版本,存在明确兼容性问题:

  • Fabric8客户端的版本支持范围通常与Kubernetes版本保持±1-2个大版本,4.x系列最高仅适配到Kubernetes 1.19左右,无法兼容1.31的API变化
  • Spring Boot 3.1.4基于Jakarta EE规范,旧版Fabric8客户端仍依赖Java EE,存在依赖冲突或API适配问题
  • JDK 21是较新版本,Fabric8 4.6.1未针对其做适配,可能存在底层网络、反射相关的兼容性问题

2. 额外调试步骤

  • 验证集群连通性:在应用所在机器执行kubectl get configmaps -n test-agents config-1,确认能正常访问集群,排除网络或kubeconfig配置问题
  • 启用Fabric8调试日志:在application.properties中添加logging.level.io.fabric8.kubernetes.client=DEBUG,查看客户端与集群交互的详细请求、URL和认证信息,确认是否是请求地址错误或认证失败
  • 检查kubeconfig集群地址:查看~/.kube/config中clusters.cluster.server地址,确认是否与Minikube暴露的8443端口映射(当前为127.0.0.1:53466)一致,确保客户端使用正确端口
  • 临时升级客户端测试:将Fabric8客户端升级到最新稳定版(如6.x系列),验证是否能解决连接问题,快速定位是否为版本兼容问题
  • 测试基础API调用:编写简单测试代码调用kubernetesClient.configMaps().inNamespace("test-agents").list(),确认基础资源列表请求是否正常,排除createOrReplace特定逻辑问题

3. createOrReplace行为变更

  • Fabric8客户端5.x及之后版本调整了createOrReplace的实现逻辑:旧版4.x是先执行get操作,不存在则create,存在则replace;新版会优先使用Kubernetes API的apply语义(若服务器支持),或调整了冲突处理逻辑
  • Kubernetes 1.22+版本废弃了部分旧API组,ConfigMap相关API虽未废弃,但部分元数据字段处理逻辑有变化,旧版客户端可能无法正确处理这些变化导致请求失败
  • 新版Fabric8客户端对命名空间处理更严格,若代码指定的命名空间与kubeconfig默认命名空间不一致,需确保该命名空间存在,否则会触发连接或资源不存在错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 17:44:53