专栏首页CNCF使用Java开发Kubernetes控制器

使用Java开发Kubernetes控制器

作者:Min Kim,Tony Ado

Kubernetes Java SDK官方项目最近发布了他们的最新工作成果,为Java Kubernetes开发人员提供了一个方便的Kubernetes控制器-构建器SDK(controller-builder SDK),有助轻松地开发高级工作负载或系统。

https://github.com/kubernetes-client/java

整体

Java无疑是世界上最流行的编程语言之一,但由于社区中缺少库资源,一段时间以来,那些非Golang开发人员很难构建他们定制的控制器/操作器(controller/operator)。在Golang的世界里,已经有了一些优秀的控制器框架,例如controller runtime、operator SDK。这些现有的Golang框架依赖于Kubernetes Golang SDK提供的各种实用工具,这些工具经过多年证明是稳定的。由新兴需要进一步融入Kubernetes的平台,我们不仅移植许多重要从Golang SDK工具到Kubernetes Java SDK包括informers、work-queues、leader-elections等,还开发了一个controller-builder SDK,连接所有到一个可运行的控制器。

https://github.com/kubernetes-sigs/controller-runtime

https://github.com/operator-framework/operator-sdk

https://github.com/kubernetes/client-go

背景

为什么使用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>

然后我们可以使用提供的构建器(builder)库来编写自己的控制器。例如,下面是一个简单的控制器打印出节点信息的观察通知,这里看完整的例子:

https://github.com/kubernetes-client/java/blob/master/examples/src/main/java/io/kubernetes/client/examples/ControllerExample.java

...
    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 Generics的帮助下,我们甚至更进一步,以更好的方式简化了封装。

https://github.com/kubernetes-sigs/controller-runtime

至于更高级的用法,我们可以将多个控制器封装到一个控制器-管理器(controller-manager)或一个选举领导(leader-electing)控制器中,这有助于在HA设置中进行部署。总之,我们基本上可以从这里找到大部分Golang SDK等价实现,我们正在积极开发更高级的特性。

下一步

Kubernetes Java SDK项目背后的社区,将专注为希望编写云原生Java应用程序来扩展Kubernetes的开发人员,提供更有用的实用程序。如果您对更详细的信息感兴趣,请查看我们的kubernetes-client/java仓库。请通过Issue或Slack与我们分享您的反馈。

https://github.com/kubernetes-client/java

http://kubernetes.slack.com/messages/kubernetes-client/

本文分享自微信公众号 - CNCF(lf_cncf),作者:Kubernetes

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • CNCF网研会:利用Vitess地理分片技术透明地解决数据本地化问题(视频+PDF)

    随着各国政府通过数据本地化法律,具有管辖权的数据库集群变得越来越重要。通常,支持数据本地化意味着重新设计应用程序的架构,并对新特性的交付进行打击。此外,将现有数...

    CNCF
  • Kubernetes:核心概念

    https://medium.com/yld-engineering-blog/kubernetes-core-concepts-324ea7028c29

    CNCF
  • Kubernetes项目

    说明:Kubernetes是一个开源系统,用于管理多个主机上的容器化应用程序;提供应用程序部署、维护和扩展的基本机制。Kubernetes建立在Google使用...

    CNCF
  • MVC设计模式(持续更新中)

        MVC设计模式---》英文全称为: model(模型)  View (视图)  Controller(控制)   ?     MVC是一种设计思想。这种...

    Gxjun
  • web api添加拦截器

    实现思路 1.标识控制器有拦截特性; 2.控制器拦截处理; 代码实现 1.标识控制器有拦截特性,代码: [MyFilter] public string Pos...

    Java中文社群_老王
  • matplotlib的基本用法——figure的使用

    Tyan
  • Spring Cloud OpenFeign:基于 Ribbon 和 Hystrix 的声明式服务调用

    Feign 是声明式的服务调用工具,我们只需创建一个接口并用注解的方式来配置它,就可以实现对某个服务接口的调用,简化了直接使用 RestTemplate 来调用...

    macrozheng
  • WINDOWS之NDK安装

    最近在做视频相关的功能,虽然摸不到头脑但好多框架都是需要NDK的所以记录一下我的安装过程。 1.下载NDK 我在看ijkPLayer它需要的NDK版本为an...

    longzeqiu
  • LibreOffice v6.2.4.2 中文安装版

    Libreoffice是openoffice的下一代版本,同样是免费开源支持Windows、Linux、Mac OS X和 Solaris 等操作系统上执行;L...

    萌海无涯
  • go基础入门(四)

    先打印的顺序跟defer出现的顺序相反,这是为啥呢?其实defer是一个延缓处理的过程,采用压栈和出栈来完成整个流程。内部流程大致如下图

    大话swift

扫码关注云+社区

领取腾讯云代金券