这篇文章已发表一年多。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否仍然准确。

使用 Java 开发 Kubernetes 控制器

官方 Kubernetes Java SDK 项目最近发布了其最新成果,为 Java Kubernetes 开发者提供了一个方便的 Kubernetes 控制器构建器 SDK,有助于轻松开发高级工作负载或系统。

总体而言

Java 无疑是世界上最流行的编程语言之一,但对于非 Golang 开发者来说,由于社区缺乏库资源,在一段时间内很难构建自己的定制控制器/操作符。在 Golang 世界中,已经有一些出色的控制器框架,例如 controller runtimeoperator SDK。这些现有的 Golang 框架依赖于多年来被证明稳定可靠的 Kubernetes Golang SDK 中的各种实用工具。在进一步集成到 Kubernetes 平台的日益增长的需求驱动下,我们不仅将 Golang SDK 中的许多基本工具(包括 informer、工作队列、领导者选举等)移植到了 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>

然后我们可以利用提供的构建器库来编写自己的控制器。例如,以下是一个简单的控制器,它在 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。也欢迎通过 Issue 或 Slack 与我们分享你的反馈。