通过Fabric8io kubernetes客户端加载yaml Kafka配置时出现JsonMappingExcepti



我在使用fabric8io kubernetes客户端时遇到问题。

我想要的是:在Kubernetes中使用Strimzi操作符创建Kafka集群。如果我用CLI和kubectl完成Strimzi快速启动指南中的所有步骤,那就太好了。

但是,当我从Java代码中用kubernetes-client:5.2.1库加载yaml资源时,会出现异常:

io.fabric8.kubernetes.client.KubernetesClientException: An error has occurred.
at io.fabric8.kubernetes.client.KubernetesClientException.launderThrowable(KubernetesClientException.java:64)
at io.fabric8.kubernetes.client.KubernetesClientException.launderThrowable(KubernetesClientException.java:53)
at io.fabric8.kubernetes.client.utils.Serialization.unmarshal(Serialization.java:140)
at io.fabric8.kubernetes.client.utils.Serialization.unmarshal(Serialization.java:101)
at io.fabric8.kubernetes.client.dsl.internal.NamespaceVisitFromServerGetWatchDeleteRecreateWaitApplicableListImpl.<init>(NamespaceVisitFromServerGetWatchDeleteRecreateWaitApplicableListImpl.java:272)
at io.fabric8.kubernetes.client.dsl.internal.NamespaceVisitFromServerGetWatchDeleteRecreateWaitApplicableListImpl.<init>(NamespaceVisitFromServerGetWatchDeleteRecreateWaitApplicableListImpl.java:252)
at io.fabric8.kubernetes.client.DefaultKubernetesClient$1.<init>(DefaultKubernetesClient.java:175)
at io.fabric8.kubernetes.client.DefaultKubernetesClient.load(DefaultKubernetesClient.java:175)
at app.test.main(test.java:38)
Caused by: com.fasterxml.jackson.databind.JsonMappingException: No resource type found for:kafka.strimzi.io/v1#Kafka
at [Source: (String)"{"apiVersion":"kafka.strimzi.io/v1","kind":"Kafka","metadata":{"name":"my-cluster"},"spec":{"kafka":{"replicas":1,"listeners":[{"name":"plain","port":9092,"type":"internal","tls":false},{"name":"tls","port":9093,"type":"internal","tls":true,"authentication":{"type":"tls"}},{"name":"external","port":9094,"type":"nodeport","tls":false}],"storage":{"type":"jbod","volumes":[{"id":0,"type":"persistent-claim","size":"1Gi","deleteClaim":false}]},"config":{"offsets.topic.replication.factor":1,"transacti"[truncated 226 chars]; line: 1, column: 726]

当我加载这个文件时出现问题:yaml-config。

我加载资源,如:

KubernetesClient client = new DefaultKubernetesClient();
InputStream is = ...;
client.load(is).inNamespace("my_namespace").createOrReplace();

请帮帮我!

p.S.:对不起我的英语。

我来自Fabric8团队。Kafka是一个自定义资源,这意味着它的模型没有在KubernetesClient中注册,所以这就是您面临来自Kubernetes Client的No resource type found for:kafka.strimzi.io/v1#Kafka错误的原因。KubernetsClient提供了两种处理自定义资源的方法:

  1. 无类型API-将CustomResources用作原始哈希映射
  2. 类型化API-为CustomResource类型提供POJO

我将提供使用这两个API加载Kafkayaml片段的示例。

无类型API:

对于无类型API,您需要提供一个CustomResourceDefinitionContext,一个包含CustomResource组、版本、种类、复数等详细信息的对象KafkaLoadTypeless.java

try (KubernetesClient client = new DefaultKubernetesClient()) {
CustomResourceDefinitionContext context = new CustomResourceDefinitionContext.Builder()
.withScope("Namespaced")
.withVersion("v1beta2")
.withGroup("kafka.strimzi.io")
.withPlural("kafkas")
.build();
InputStream is = KafkaLoadTypeles.class.getResourceAsStream("/test-kafka.yml");
Map<String, Object> createdKafka = client.customResource(context).inNamespace("default").createOrReplace(is);
} catch (IOException ioException) {
ioException.printStackTrace();
}

类型API:

对于类型化的API,您需要提供Kafka资源的类型。您可以在Strimzi API依赖项中找到这些类型。为了使用Kafka类,我不得不在我的项目中添加这个依赖项:

<dependency>
<groupId>io.strimzi</groupId>
<artifactId>api</artifactId>
<version>0.22.0</version>
<exclusions>
<exclusion>
<groupId>io.fabric8</groupId>
<artifactId>kubernetes-client</artifactId>
</exclusion>
</exclusions>
</dependency>

添加了这个之后,我就可以像这样使用Typed API了:KafkaLoadTyped.java

try (KubernetesClient client = new DefaultKubernetesClient()) {
MixedOperation<Kafka, KafkaList, Resource<Kafka>> kafkaClient = client.customResources(Kafka.class, KafkaList.class);
InputStream is = KafkaLoadTyped.class.getResourceAsStream("/test-kafka.yml");
Kafka myClusterkafka = kafkaClient.load(is).get();
kafkaClient.inNamespace("default").createOrReplace(myClusterkafka);
}

最新更新