Java Top.

使用Spring 5和Spring Boot 2开始,通过学习春天课程:

>>查看课程

1.介绍

在本教程中,我们将继续探索Java Kubernetes API。这次,我们将展示如何使用手表有效监控群集事件。

2. Kubernetes是什么手表?

在我们以前的文章中覆盖了Kubernetes API.,我们已经展示了如何恢复有关给定资源的信息或它们的集合。金宝搏官网188be如果我们想要的一切都是在给定的时间点获得这些资源的状态,这很好。然而,鉴于Kubernetes集群本质上是高度动态的,这通常不够。

最常,我们还希望在发生这些资源和跟踪事件时。例如,我们可能有兴趣跟踪POD生命周期事件或部署状态更改。虽然我们可以使用轮询,但这种方法会遭受几个限制。首先,它不会符号,因为监控的资源数量增加。其次,我们冒着失去碰巧发生在轮询周期之间的事件。

为了解决这些问题,Kubernetes有概念手表,的所有资源集合API调用都可用手表查询参数。当它的价值是错误的或省略,得到操作正常行为:服务器处理请求并返回与给定条件匹配的资源实例列表。但是,通过看= true急剧改变其行为:

  • 响应现在由一系列修改事件组成,其中包含修改类型和受影响的对象
  • 使用称为长轮询的技术发送初始批次事件后,连接将保持打开。

3.创建A.手表

支持Java Kubernetes API手表通过手表类,具有单个静态方法:createwatch。此方法需要三个参数:

  • 一个apiclient.,它处理对Kubernetes API服务器的实际REST调用
  • 一种称呼描述要观看的资源集合的实例
  • 一种typeToken.使用预期的资源类型

我们创建一个称呼来自任何一个的实例XXXAPI.库中使用的课程使用其中一个listxxxcall()方法。例如,创建一个手表那个检测事件,我们使用listpodforallnamespacescall()

corev1api api = new corev1api(客户);调用call = api.listpodforallnamespacescall(null,null,null,null,null,null,null,null,10,true,null);观看 watch = watch.createwatch(客户端,呼叫,新典型的typeetoken >(){}。gettype()));

在这里,我们使用空值有关大多数参数,含义“使用默认值”,只需两个例外:超时手表。后者必须设置为真正的对于观看电话。否则,这将是一个常规的休息电话。超时,在这种情况下,作为手表“time-to-live”的作品,这意味着服务器将停止发送事件并在到期后终止连接

找到一个很好的价值超时参数以秒为单位表示,需要一些试用和错误,因为它取决于客户端应用程序的确切要求。此外,检查Kubernetes群集配置非常重要。通常,手表有5分钟的硬限制,因此通过任何东西都不会产生所需的效果。

4.接收活动

仔细看看手表类,我们可以看到它的实现迭代器迭代从标准JRE中,我们可以使用返回的值createwatch()为期hasnext() - 下一个()循环:

for(响应事件:watch){v1pod pod = event.Object;v1objectmeta meta = pod.getmetadata();switch(event.type){case“添加”:案例“修改”:案例“已删除”:// ...流程POD数据中断;默认值:log.warn(“未知事件类型:{}”,event.type);}}

类型每个事件的字段告诉我们对象发生了什么事件 - 我们的案例中的豆荚。一旦我们消耗所有活动,我们必须完成新的呼叫Watch.createwatch()重新开始接收事件。在示例代码,我们围绕着手表创建和结果处理尽管环形。其他方法也是可能的,例如使用ExecutorService.或类似于在后台接收更新。

5.使用资源版本和书签

上面的代码问题是每次创建新的问题都是这样的事实手表,具有初始事件流,具有给定类型的所有现有资源实例。这是因为服务器假定我们没有关于它们的任何先前信息,所以它只发送它们全部金宝搏官网188be

但是,这样做会有效地击败处理事件的目的,因为我们只需要在初始负载后需要新事件。为防止再次接收所有数据,但是手表机制支持两个附加概念:资源版本和书签。

5.1。资源版本

Kubernetes中的每个资源都包含一个ResourceVersion.字段,它只是一个不透明的字符串,由服务器在每次发生变化时设置。此外,由于资源集合也是一种资源,所以存在ResourceVersion.与它相关联的。当从集合中添加、删除和/或修改新资源时,该字段将相应地更改。

当我们制作一个返回集合的API调用时包括这一点ResourceVersion.参数,服务器将使用其值作为查询的“起始点”。为了手表API调用,这意味着只包含创建知情版本的时间后发生的事件。

但是,我们如何得到一个ResourceVersion.包括在我们的电话中?简单:我们只是执行初始同步调用来检索包含集合的初始资源列表ResourceVersion,然后在随后使用它手表呼叫:

String ResourceVersion = null;while(true){if(resourceversion == null){v1podlist podlist = api.listpodforallnamespaces(null,null,null,null,null,“false”,resourceversion,null,10,null);resourceversion = podlist.getmetadata()。getResourceversion();尝试(观察 watch = watch.createwatch(client,api.listpodforallnamespacescall(null,null,null,null,null,null,null,null,10,true,null),new typeetoken >(){}。gettype())){for(响应事件:watch){// ...进程事件}} catch(apiexception ex){if(exgetcode()== 504 || exgetCode()== 410){ResourceVersion = ExtractresourceVersionFromexception(EX);} else {resourceversion = null;}}}

异常处理代码,在这种情况下是相当重要的。由于某些原因,Kubernetes服务器将返回一个504或410错误代码ResourceVersion.不存在。在这种情况下,返回的消息通常包含当前版本。不幸的是,此信息并未以任何结构化方式出现,而是作为错误消息本身的一部分。

提取代码(a.k.a. ugly hack)使用正则表达式此目的,但由于错误消息往往依赖于实现,因此代码返回到a空值价值。通过这样做,主循环返回到其起点,恢复新列表ResourceVersion.并恢复观察操作。

无论如何,即使是这种警告,关键点也是现在事件列表不会从每张手表的划痕开始。

5.2。书签

书签是一个可选功能,可实现特殊功能书签关于事件流的事件从a返回手表称呼。此事件包含在其元数据中ResourceVersion.我们可以在随后使用的价值手表呼叫作为一个新的起点。

由于这是一个选择选择功能,我们必须通过传递显式启用它真正的alletwatchbookmarks.在API呼叫。此选项仅在创建A时才有效手表否则忽略。此外,服务器可以完全忽略它,因此客户端不应依赖于收到这些事件。

与先前的方法相比使用ResourceVersion.单独,书签允许我们大多逃避昂贵的同步呼叫:

String ResourceVersion = null;while(true){//每当我们需要重新同步(resourceversion == null)时{//获取一个新鲜的列表(ResourceVersion == null){v1podlist podlist = api.listpodforallnamespaces(true,null,null,null,null,“false”,resourceversion,null,null, 空值);resourceversion = podlist.getmetadata()。getResourceversion();} while(true){try(watch  watch = watch.createwatch(client,api.listpodforallnameSpaceScall(true,null,null,null,null,“false”,ResourceVersion,Null,10,True,Null),Newtypeetoken >(){} {}。gettype())){for(response 事件:watch){v1pod pod = event.object;v1objectmeta meta = pod.getmetadata();切换(event.type){case“bookmark”:ResourceVersion = Meta.getResourceVersion();休息;案例“添加”:案例“修改”:案例“已删除”:// ...事件处理省略了断裂;默认值:log.warn(“未知事件类型:{}”,event.type); } } } } catch (ApiException ex) { resourceVersion = null; break; } } }

在这里,我们只需要在第一次通过,每当我们在内部循环中获得APIException时,只需要获取完整列表。注意书签事件具有与其他事件相同的对象类型,因此我们不需要在此处进行任何特殊的铸造。但是,我们关心的唯一领域是金宝搏官网188beResourceVersion.,我们为下一个保存手表称呼。

六,结论

在本文中,我们已经涵盖了不同的方式来创建Kubernetes手表使用Java API客户端。像往常一样,可以找到示例的完整源代码在github上

Java底部

使用Spring 5和Spring Boot 2开始,通过学习春天课程:

>>查看课程
来宾
0.评论
内联反馈
查看所有评论