從零上手 Fabric8 KubernetesClient

FunTester發表於2025-02-24

為何選擇 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: v1
kind: Pod
metadata:
  name: FunTester-pod
spec:
  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 管理不再是難題!

FunTester 原創精華

【連載】從 Java 開始效能測試

  • 故障測試與 Web 前端
  • 服務端功能測試
  • 效能測試專題
  • Java、Groovy、Go
  • 白盒、工具、爬蟲、UI 自動化
  • 理論、感悟、影片
如果覺得我的文章對您有用,請隨意打賞。您的支援將鼓勵我繼續創作!
打賞支援
暫無回覆。

相關文章