写点什么

从零上手 Fabric8 KubernetesClient

作者:FunTester
  • 2025-02-24
    河北
  • 本文字数:2849 字

    阅读完需:约 9 分钟

为何选择 Fabric8 KubernetesClient

在 Kubernetes 的世界里,管理容器资源的方法可谓是八仙过海,各显神通。最直接的方式当然是使用 kubectl 命令,但如果想在 Java 代码里优雅地操作 Kubernetes,那就得借助 Kubernetes Java 客户端了。虽然官方提供了 kubernetes-client-java,但相比之下,Fabric8 KubernetesClient 更加简洁、强大,API 设计友好,特别适合 Java 开发者。


为什么推荐 Fabric8 KubernetesClient?


  • 链式调用,API 设计简洁:用起来比原生客户端更顺手,简直是如鱼得水。

  • 支持 CRD(自定义资源定义):适用于 Operator 开发,拓展性强,能够以一当十。

  • 自动解析 KubeConfig:无论是本地开发还是 Kubernetes 集群环境,都能自动适配,省去了东奔西走的麻烦。

  • 与 Spring Boot、Quarkus 无缝集成:云原生 Java 应用的最佳拍档,堪称珠联璧合。


说白了,Fabric8 KubernetesClient 就是 Kubernetes 的 Java 版万能遥控器,让你轻松管理 PodDeploymentConfigMapCRD 等各种资源,简直是手到擒来。

如何使用 Fabric8 KubernetesClient?

1. 依赖引入

只需在 pom.xml 里加上以下 Maven 依赖:


<dependency>    <groupId>io.fabric8</groupId>    <artifactId>kubernetes-client</artifactId>    <version>6.10.1</version></dependency>
复制代码


Fabric8 KubernetesClient 会自动解析 Kubernetes 配置:


  • 本地开发时,读取 ~/.kube/config

  • 运行在 Kubernetes 集群里时,使用 ServiceAccount,无需额外配置。

2. 基础操作:管理 Kubernetes 资源

(1)查询指定命名空间的 Pod

try (KubernetesClient client = new DefaultKubernetesClient()) {    List<Pod> pods = client.pods().inNamespace("default").list().getItems();    for (Pod pod : pods) {        if (pod.getMetadata().getName().contains("FunTester")) {            System.out.println("Pod Name: " + pod.getMetadata().getName());        }    }}
复制代码


这段代码相当于执行了以下命令:


kubectl get pods -n default | grep FunTester
复制代码


链式调用简洁直观,一行代码就能搞定 Pod 查询,并且通过 contains("FunTester") 筛选特定 Pod,简直是快刀斩乱麻。

(2)创建 Pod

Pod pod = new PodBuilder()        .withNewMetadata().withName("FunTester-pod").endMetadata()        .withNewSpec()        .addNewContainer()        .withName("nginx")        .withImage("nginx:latest")        .endContainer()        .endSpec()        .build();
client.pods().inNamespace("default").create(pod);
复制代码


这段代码相当于以下 YAML 配置:


apiVersion: v1kind: Podmetadata:  name: FunTester-podspec:  containers:  - name: nginx    image: nginx:latest
复制代码


不需要手写 YAML,直接在 Java 代码里动态创建 Pod,适用于自动化任务,简直是事半功倍。

(3)删除 Pod

client.pods().inNamespace("default").withName("FunTester-pod").delete();
复制代码


这段代码相当于以下命令:


kubectl delete pod FunTester-pod -n default
复制代码


管理 Kubernetes 资源,一行代码搞定,方便高效,简直是一箭双雕。

(4)监听 Pod 变化

如果你想实时监听 Kubernetes 里的 Pod 变化(比如自动触发告警或扩容),可以用 watch 机制:


client.pods().inNamespace("default").watch(new Watcher<Pod>() {    @Override    public void eventReceived(Action action, Pod pod) {        if (pod.getMetadata().getName().contains("FunTester")) {            System.out.println("Event: " + action + " Pod: " + pod.getMetadata().getName());        }    }
@Override public void onClose(WatcherException cause) { System.out.println("Watcher closed"); }});
复制代码


适用场景:


  • 监听 Pod 创建、删除、重启,触发自动扩容或故障恢复。

  • 实时监控 Kubernetes 事件,作为日志采集或指标收集的触发条件。

进阶功能

1. 读取 ConfigMap

ConfigMap cm = client.configMaps().inNamespace("default")        .withName("FunTester-config")        .get();System.out.println("ConfigMap Data: " + cm.getData());
复制代码


这段代码相当于以下命令:


kubectl get cm FunTester-config -o yaml
复制代码


可以直接在 Java 代码里读取 Kubernetes 配置,适用于动态加载应用配置。

2. 操作 Deployment

获取 Deployment 副本数:


Deployment deployment = client.apps().deployments()        .inNamespace("default")        .withName("FunTester-deployment")        .get();
System.out.println("Replicas: " + deployment.getSpec().getReplicas());
复制代码


动态扩容 Deployment:


client.apps().deployments()        .inNamespace("default")        .withName("FunTester-deployment")        .edit(d -> new DeploymentBuilder(d)        .editSpec().withReplicas(5).endSpec()        .build());
复制代码


这段代码相当于以下命令:


kubectl scale deployment FunTester-deployment --replicas=5 -n default
复制代码


适用于弹性扩容、故障恢复、智能调度等场景。

3. 操作 CRD(自定义资源)

MixedOperation<MyCustomResource, MyCustomResourceList, Resource<MyCustomResource>> customResources =        client.resources(MyCustomResource.class, MyCustomResourceList.class);
MyCustomResource resource = customResources.inNamespace("default").withName("FunTester-crd").get();System.out.println("Custom Resource Data: " + resource);
复制代码


适用于 Kubernetes Operator 开发,轻松管理 CRD!

真实应用场景

1. 日志采集

LogWatch logWatch = client.pods().inNamespace("default")        .withName("FunTester-pod")        .watchLog(System.out);
复制代码


实时获取 Pod 日志,适用于日志收集系统。

2. 故障自愈

client.pods().inNamespace("default").watch(new Watcher<Pod>() {    @Override    public void eventReceived(Action action, Pod pod) {        if (action == Action.DELETED && pod.getMetadata().getName().contains("FunTester")) {            System.out.println("Pod " + pod.getMetadata().getName() + " deleted, restarting...");            client.pods().inNamespace("default").create(pod);        }    }});
复制代码


自动拉起崩溃的 Pod,保证服务高可用!

3. 动态扩容

client.apps().deployments()        .inNamespace("default")        .withName("FunTester-deployment")        .scale(10);
复制代码


结合监控数据,实现智能弹性伸缩!

总结

Fabric8 KubernetesClient 让 Java 开发者能够轻松管理 Kubernetes 资源,相比官方 Java 客户端,它更易用、更灵活,适用于监控、自动化运维、日志采集、弹性扩容等场景。


如果你是测试开发工程师,正在做 Kubernetes 相关项目,Fabric8 KubernetesClient 绝对值得一试!正所谓工欲善其事,必先利其器,有了它,Kubernetes 管理不再是难题!

发布于: 刚刚阅读数: 3
用户头像

FunTester

关注

公众号:FunTester,800篇原创,欢迎关注 2020-10-20 加入

Fun·BUG挖掘机·性能征服者·头顶锅盖·Tester

评论

发布
暂无评论
从零上手 Fabric8 KubernetesClient_FunTester_InfoQ写作社区