作者 | Nicolas Fränkel

译者 | 天道酬勤 责编 | 徐威龙

封图| CSDN 下载于视觉中国

在本文中,我们将开始开发自己的Kubernetes控制器。

技术栈可以是Python、NodeJS或Ruby。因为这个博客被命名为为“ Java极客”,因此选择Java是很正常的。

作为一个用例,我们将实现sidecar模式:每当一个pod被调度时,sidecar pod也会随之被调度。如果将前者删除,则后者也必须删除。

选择合适的工具

为了用Java执行REST调用,首先需要生成绑定。有几种方法可以做到这些。最繁琐的操作是手动执行此操作:需要仔细掌握所有可能的JSON请求和响应组合,开发相应的Java对象,选择JSON序列化框架以及HTTP客户端。第二个最佳选择是使用专有代码生成器,例如Swagger(https://swagger.io/)或Apiary(https://apiary.io/)。这就要求API提供程序以一种可能的格式提供模型。不利的一面是,需要使用相关工具。有时,格式或多或少是开放的,例如OpenAPI规范(https://swagger.io/specification/)。在这种情况下,可以从实现该格式的工具中选择工具。在最好的情况下,可能已经提供了绑定。

Kubernetes就是这种情况:该项目为各种语言提供了自己的绑定(https://kubernetes.io/docs/reference/using-api/client-libraries/)。问题在于语言包装器与REST API非常接近,对于作者来说太熟悉了。例如,这是列出所有名称空间中所有pod的方式:

ApiClient client = Config.defaultClient();
CoreV1Api core = new CoreV1Api(client);
V1PodList pods =core.listPodForAllNamespaces(null, null, null, null, null, null, null, null);

注意:所有的null参数需要传递。

这就是“包装器代码非常接近REST API”的意思。幸运的是,还有另一个选择。Fabric8组织在Github上提供了流畅的Java API。与上述代码等效的代码是:

KubernetesClient client = new DefaultKubernetesClient();
PodList pods = client.pods().inAnyNamespace().list();    注意:无需传递无用的null参数。

Fabric8组织在Github上提供了流畅的Java API:

https://github.com/fabric8io/kubernetes-client)

Fabric8快速概述

简单来说,使用Fabric8的API,所有Kubernetes资源都可以在KubernetesClient实例上使用,例如:

  • client.namespaces()

  • client.services()

  • client.nodes()

根据资源的性质,它的作用域可以是一个名称空间,也可以不是:

  • client.pods().inAnyNamespace()

  • client.pods().inNamespace("ns")

此时,可以调用这个动作:

列出所有名称空间中的所有Pod:

client.pods().inAnyNamespace().list();

删除名称空间ns中的所有pod:

client.pods().delete(client.pods().inNamespace("ns").list().getItems());
创建一个名为ns的新名称空间:
client.namespaces().createNew().withApiVersion("v1").withNewMetadata().withName("ns").endMetadata().done();

实现控制循环

注意,Kubernetes控制器只是一个控制循环,它监视集群的状态,并将其与所需状态进行协调。为了能够调度/删除事件,需要使用Observer模式。应用程序将订阅此类事件,当他们发生时,相关回调将被触发。

下图是一个非常简单的API图:

要真正实现一个监视程序,只需执行以下几行代码:

public class DummyWatcher implements Watcher<Pod> {@Overridepublic void eventReceived(Action action, Pod pod) {switch (action) {case ADDED:    //注意1        break;case MODIFIED: //注意2       break;case DELETED:  //注意3break;case ERROR:    //注意4       break;}}@Overridepublic void onClose(KubernetesClientException cause) {//注意5               }
}client.pods().inAnyNamespace().watch(DummyWatcher());注意:
  1. 添加新pod时起作用

  2. 修改现有pod时起作用

  3. 删除pod时起作用

  4. 发生错误时起作用

  5. 清理任何资源。如果客户端正确关闭,cause将为null

具体细节

现在,我们拥有了实现sidecar模式所需的一切。我不会展示全部代码,它可以在GitHub上找到:https://github.com/nfrankel/jvm-controller,但需要重点强调一些关键内容。

1) 标记sidecar

从本质上讲,观察者需要在添加新的pod时添加一个sidecar pod,并在移除它时删除它。这种基本方法行不通:如果安排了sidecar pod,则将触发观察者,并向sidecar添加新的sidecar pod。而且这种情况还会持续下去。因此,标记sidecar pod至关重要。检测到此类pod时,不应触发创建逻辑。

有几种标记sidecar pod的方法:

  • 在sidecar pod的名称后加上特定的字符串,例如sidecar

  • 添加如下特定标签:

client.pods().inNamespace("ns").createNew().withNewMetadata().addToLabels("sidecar", "true").endMetadata().done();

2) 连同pod一起移除sidecar

pod应只有一个sidecar。如上所述,应在添加Pod时创建它,而在删除后者时应删除它。

因此,应将对主pod的引用添加到sidecar中。这样,当pod被删除时,如果它不是一个sidecar,我们应该找到分配的sidecar并将其删除。

第一种简单的方法是在删除主pod时显式删除sidecar。但是,这是一项繁重的工作,需要花很多时间。Kubernetes允许将pod的生命周期绑定到另一个Pod的生命周期。然后,删除逻辑由Kubernetes本身处理。这由ownerReference的概念支持。

该API使其易于实现:

client.pods().inNamespace("ns").createNew().withNewMetadata().addNewOwnerReference().withApiVersion("v1").withKind("Pod").withName(podName).withUid(pod.getMetadata().getUid()).endOwnerReference().endMetadata().done();3) 始终保持一个sidecar

添加一个sidecar并不意味着它将永远保持这种方式。例如,可以删除属于部署的pod。部署的目标是重新创建一个pod,以达到所需的副本数量。

同样,如果在保留主pod的同时删除了sidecar,则应使用正确的引用生成一个新的sidecar。

结论

在这篇文章中,我们描述了如何在JVM上使用Java语言实现Kubernetes控制器。借助Fabric8的API,实现的操作非常简单。主要问题来自调度/删除逻辑中的极端情况。在本系列的下一篇(也是最后一篇)文章中,我们将最终看到如何部署和运行代码。

这篇文章的完整源代码可以在Github上以Maven格式找到:

https://github.com/nfrankel/jvm-controller

希望这篇文章对你有用,欢迎评论区和我们讨论。

原文:https://blog.frankel.ch/your-own-kubernetes-controller/2/

防疫、复工如何并行?天云数据推出人工智能监测方案!到底如何做到事前预防,而不是事后诸葛亮?本周四晚8点,天云数据VP陈勇为各位揭晓答案!扫描下方二维码免费报名~

今日福利:点击阅读原文,凭优惠码“AIP1510”都可获得价值299元的「2020 AI开发者万人大会」在线直播门票一张。  

推荐阅读:为什么要在油气行业中应用 IoT?这 8 个应用场景告诉你 IoT 在油气行业中可以做什么
生产环境使用HBase,你必须知道的最佳实践
Java 14 来了!
字节跳动武汉招聘 2000  人,距离大厂 Offer,你还差这篇 Java 干货!| 原力计划
数字合约如何将所有权下放?如何使用脚本系统将交易转换为可编程的智能合约?答案就在这篇文章里!
人生苦短,不光要用Python,还要在VSCode里用
真香,朕在看了!

用Java开发自己的Kubernetes控制器,想试试吗?相关推荐

  1. 用 Java 开发自己的 Kubernetes 控制器,想试试吗?

    作者 | Nicolas Fränkel 译者 | 天道酬勤,责编 | 徐威龙 封图 | CSDN 下载于视觉中国 在本文中,我们将开始开发自己的Kubernetes控制器. 技术栈可以是Python ...

  2. java 换行分割_用Java开发自己的Kubernetes控制器,想试试吗?

    简洁清爽的代码风格应该是大多数工程师所期待的.在工作中笔者常常因为起名字而纠结,夸张点可以说是编程 5 分钟,命名两小时!究竟为什么命名成为了工作中的拦路虎. 每个公司都有不同的标准,目的是为了保持统 ...

  3. surface pro4 java开发_写给那些想买Surface Pro4的童鞋们

    微软推出的Surface系列,开启平板电脑二合一的时代,同品牌的还有苹果的pro系列,因为这两款相对来说,是我当时纠结和难以决定的选择,最终我选择了一个我认为是错误的答案. 从外观来说,Surface ...

  4. [原]java开发中遇到的问题及解决方法(持续更新)

    工作中,以C/C++开发为主,难免与其他服务和Web进行交换,Java开发必不可少,又不想动用Eclipse大家伙,只能自己动手编写脚本进行Java代码的编译和运行,期间遇到的一些问题,记录下来供自己 ...

  5. 黑马2016java_2016年成功的Java开发人员简介

    黑马2016java 2015年即将结束. 现在该总结过去一年中已完成的工作和未完成的工作. 此外,现在是预测下一个2016年的好时机. 您已经猜到这篇文章是关于2016年理想的Java开发人员的. ...

  6. 2016年成功的Java开发人员简介

    2015年即将结束. 现在是时候总结过去一年做了什么和没有做什么的时候了. 此外,现在是预测下一个2016年的好时机. 您已经猜到这篇文章是关于2016年理想的Java开发人员的. 我想给你一个惊喜, ...

  7. 爬取了BOSS直聘、拉勾等近1000+招聘需求,总结出3年+Java开发的高频技术需求

    工作3-5年,是很多技术人的职业发展分水岭. 在这个阶段,如果你能迈过「写业务代码」到「高级开发&架构师」的坎,未来的 5-10 年还将是你的上升期,你的年薪也将越来越高,甚至有机会迈入 50 ...

  8. java开发中遇到的问题_java开发中遇到的问题及解决方法(持续更新)

    摘自 http://blog.csdn.net/pony12/article/details/38456261 工作中,以C/C++开发为主,难免与其他服务和Web进行交换,Java开发必不可少,又不 ...

  9. 32位、64位与Java开发研究分析

    1 32位与64位五大不同 1.1 设计初衷不同 64位操作系统的设计初衷是:满足机械设计和分析.三维动画.视频编辑和创作,以及科学计算和高性能计算应用程序等领域中需要大量内存和浮点性能的客户需求.换 ...

最新文章

  1. leetcode17 电话号码的字母组合
  2. Java基础day20
  3. idea页面简单介绍
  4. this关键字+super关键字
  5. Teams App如何选择用户
  6. linux 版本的scipy,linux安装scipy
  7. asp mysql 设置编码_ASP对数据库各种操作的代码
  8. ACL2021 | 把关键词生成看成集合预测问题
  9. postgre 主键_PostgreSQL – 随机主键
  10. iphone GCDAsyncSocket 详解
  11. PphpStorm常用操作整理
  12. 匿名mahony互补滤波代码详解
  13. kali linux暴力破解wifi密码
  14. 合作博弈(coalitional game)——核仁(Nucleolus)初解
  15. 三绕组变压器参数计算matlab,三绕组变压器等值参数计算
  16. 互联网大脑进化简史,类脑智能巨系统产生与兴起
  17. Windows在后台自动启动cmd命令
  18. CIMISS数据获取流程
  19. php做引流脚本,自动引流脚本你知道是怎么实现的自动化引流?
  20. mac清理磁盘空间_Mac磁盘清理-如何释放Mac上的空间

热门文章

  1. netcore quartz job用不了services_.NetCore开源集成框架
  2. int是不是python保留字_下面不属于Python保留字的是:
  3. python操作redis集群_python 连接管理作redis集群
  4. android 天气接口简书,天气API接口说明
  5. python一些简单操作_python列表的基本操作有哪些
  6. 飞秋本机如何与虚拟机传送文件_某度扩容之虚拟机
  7. 数学家比10个师更有威力?
  8. 学物理也能拿数学世界级奖!每逢实验失败就跑步......河大女生太励志了!!
  9. 悲痛!高校一研究生在校内被撞身亡,肇事者为该校博导,警方已介入
  10. 关于kafka中acks是否可以为all