本文發表於一年多前。舊文章可能包含過時內容。請檢查頁面中的資訊自發布以來是否已變得不正確。
用 Java 開發 Kubernetes 控制器
官方的Kubernetes Java SDK專案最近釋出了他們最新的成果,為Java Kubernetes開發者提供了一個方便的Kubernetes控制器構建器SDK,有助於輕鬆開發高階工作負載或系統。
總覽
Java無疑是世界上最流行的程式語言之一,但對於那些非Golang開發者來說,由於社群中庫資源的缺乏,在一段時間內構建定製控制器/操作員一直很困難。在Golang世界中,已經有一些優秀的控制器框架,例如controller runtime、operator SDK。這些現有的Golang框架依賴於Kubernetes Golang SDK中的各種實用工具,這些工具多年來已被證明是穩定的。在進一步整合到Kubernetes平臺的新興需求的驅動下,我們不僅將Golang SDK中的許多基本工具(包括informers、work-queues、leader-elections等)移植到了kubernetes Java SDK中,而且還開發了一個控制器構建器SDK,它將所有元件無縫連線成一個可執行的控制器。
背景
為什麼要使用Java來實現Kubernetes工具?您可能會選擇Java來
整合遺留企業Java系統:許多公司都有用Java編寫的遺留系統或框架,以確保穩定性。我們無法輕易將所有內容遷移到Golang。
更多開源社群資源:Java是成熟的,幾十年來積累了豐富的開源庫,儘管Golang越來越受到開發者的青睞和歡迎。此外,如今開發者可以在SQL儲存上開發聚合的apiserver,而Java對SQL的支援要好得多。
如何使用?
以maven專案為例,將以下依賴項新增到您的依賴項中
<dependency>
<groupId>io.kubernetes</groupId>
<artifactId>client-java-extended</artifactId>
<version>6.0.1</version>
</dependency>
然後我們可以利用提供的構建器庫來編寫您自己的控制器。例如,以下是一個簡單的控制器,它在 watch 通知時列印節點資訊,完整示例請參閱此處
...
Reconciler reconciler = new Reconciler() {
@Override
public Result reconcile(Request request) {
V1Node node = nodeLister.get(request.getName());
System.out.println("triggered reconciling " + node.getMetadata().getName());
return new Result(false);
}
};
Controller controller =
ControllerBuilder.defaultBuilder(informerFactory)
.watch(
(workQueue) -> ControllerBuilder.controllerWatchBuilder(V1Node.class, workQueue).build())
.withReconciler(nodeReconciler) // required, set the actual reconciler
.withName("node-printing-controller") // optional, set name for controller for logging, thread-tracing
.withWorkerCount(4) // optional, set worker thread count
.withReadyFunc( nodeInformer::hasSynced) // optional, only starts controller when the cache has synced up
.build();
您會注意到,新的 Java 控制器框架借鑑了 controller-runtime 的設計,它成功地將控制器內部的複雜元件封裝成幾個清晰的介面。藉助 Java 泛型,我們甚至更進一步,以更好的方式簡化了封裝。
至於更高階的用法,我們可以將多個控制器封裝到一個控制器管理器或一個領導者選舉控制器中,這有助於在 HA 設定中進行部署。簡而言之,我們基本上可以在這裡找到 Golang SDK 中的大多數等效實現,並且我們正在積極開發更高階的功能。
未來步驟
官方 Kubernetes Java SDK 專案背後的社群將致力於為希望程式設計雲原生 Java 應用程式以擴充套件 Kubernetes 的開發者提供更多有用的工具。如果您對更多細節感興趣,請檢視我們的倉庫 kubernetes-client/java。歡迎透過 Issues 或 Slack 與我們分享您的反饋。