使用Kubernetes Java客户端的Config.fromConfig读取YAML配置失败
Kubernetes Java客户端加载k8s.config.yaml配置失败问题解决
问题情况
在Java应用中使用Kubernetes API客户端读取k8s.config.yaml文件时出现异常,已通过调试确认YAML内容已正确加载为字符串,但Config.fromConfig方法仍抛出异常。
代码片段
private ApiClient readConfigFromFile(String filePath) throws IOException { String yamlContent = new String(Files.readAllBytes(Paths.get(filePath))); return Config.fromConfig(yamlContent); }
k8s.config.yaml配置内容
apiVersion: v1 clusters: - cluster: certificate-authority-data: xxxxx server: https://api.mydomain.com.bd:port name: kubernetes contexts: - context: cluster: kubernetes user: kubernetes-super name: kubernetes-super@kubernetes current-context: kubernetes-super@kubernetes kind: Config preferences: {} users: - name: kubernetes-super user: client-certificate-data: xxxxx client-key-data: xxxxx
完整堆栈追踪
at java.base/java.io.FileInputStream.open0(Native Method) at java.base/java.io.FileInputStream.open(FileInputStream.java:213) at java.base/java.io.FileInputStream.<init>(FileInputStream.java:152) at java.base/java.io.FileInputStream.<init>(FileInputStream.java:106) at io.kubernetes.client.util.Config.fromConfig(Config.java:80) at com.mua.testservice.k8s.K8sService.readConfigFromFile(K8sService.java:39) at com.mua.testservice.k8s.K8sService.readPods(K8sService.java:47) at com.mua.testservice.k8s.K8sService$$FastClassBySpringCGLIB$$f7a2349d.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) at org.springframework.aop.framework.adapter.AfterReturningAdviceInterceptor.invoke(AfterReturningAdviceInterceptor.java:57) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:58) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) at com.mua.testservice.k8s.K8sService$$EnhancerBySpringCGLIB$$305cd403.readPods(<generated>) at com.mua.testCliRun.run(CliRun.java:25) at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:768) at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:752) at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) at com.mua.testK8sExpApplication.main(K8sExpApplication.java:10)
使用的依赖
<dependency> <groupId>io.kubernetes</groupId> <artifactId>client-java</artifactId> <version>15.0.1</version> </dependency>
解决方案
错误原因
io.kubernetes.client.util.Config.fromConfig(String)方法的参数是文件路径字符串,而非YAML内容字符串。你传入已读取的YAML内容后,方法会将该字符串当作文件路径尝试读取,导致找不到文件抛出异常。
修复方法
方法一:直接传入文件路径
无需自行读取文件内容,直接将文件路径传给fromConfig方法:
private ApiClient readConfigFromFile(String filePath) throws IOException { return Config.fromConfig(filePath); }
方法二:将字符串转为InputStream传入
如果必须先读取文件内容为字符串,可将其转为InputStream后调用重载方法:
import java.io.ByteArrayInputStream; import java.nio.charset.StandardCharsets; // ... private ApiClient readConfigFromFile(String filePath) throws IOException { String yamlContent = new String(Files.readAllBytes(Paths.get(filePath))); try (InputStream inputStream = new ByteArrayInputStream(yamlContent.getBytes(StandardCharsets.UTF_8))) { return Config.fromConfig(inputStream); } }
方法三:用YAML解析器直接解析为Config对象
使用客户端自带的YAML工具类将字符串解析为Config对象,再构建ApiClient:
import io.kubernetes.client.util.Yaml; // ... private ApiClient readConfigFromFile(String filePath) throws IOException { String yamlContent = new String(Files.readAllBytes(Paths.get(filePath))); Config config = Yaml.load(yamlContent, Config.class); return Config.fromConfig(config); }
内容的提问来源于stack exchange,提问作者Maifee Ul Asad
相关产品推荐
相关产品推荐

