首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Java开发Kubernetes控制器

使用Java开发Kubernetes控制器

作者头像
CNCF
发布2019-12-04 15:37:31
1.5K0
发布2019-12-04 15:37:31
举报
文章被收录于专栏:CNCFCNCF

作者: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/

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CNCF 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档