本文发表于一年多前。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。
用 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 与我们分享您的反馈。