本文已超过一年。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已变得不正确。
在 Java 中开发 Kubernetes 控制器
官方 Kubernetes Java SDK 项目最近发布了他们在为 Java Kubernetes 开发人员提供方便的 Kubernetes 控制器构建器 SDK 方面的最新工作,该 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 存储开发他们的聚合 API 服务器,而 Java 在 SQL 支持方面做得更好。
如何使用?
以 maven 项目为例,将以下依赖项添加到您的依赖项中
<dependency>
<groupId>io.kubernetes</groupId>
<artifactId>client-java-extended</artifactId>
<version>6.0.1</version>
</dependency>
然后我们可以利用提供的构建器库来编写自己的控制器。例如,下面是一个简单的控制器,它在观察通知时打印节点信息,完整的示例请参见这里
...
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 与我们分享您的反馈。