gpt4 book ai didi

java - Kubernetes SharedInformer 用法和定义

转载 作者:行者123 更新时间:2023-12-04 14:51:02 26 4
gpt4 key购买 nike

我一直在尝试观察我的 K8s 集群中的一些资源,在阅读了一些关于 watch vs informers 的博客后,我决定使用 Informers。

我看到了这个如何使用的例子:https://github.com/Netflix-Skunkworks/kubernetes-client-java/blob/master/examples/src/main/java/io/kubernetes/client/examples/InformerExample.java

在示例中,我看到 SharedIndexInformer 是这样定义的:

        factory.sharedIndexInformerFor(
(CallGeneratorParams params) -> {
return coreV1Api.listNodeCall(
null,
null,
null,
null,
null,
params.resourceVersion,
params.timeoutSeconds,
params.watch,
null,
null);
},
V1Node.class,
V1NodeList.class);

根据我对 lambda 表达式编写方式的理解,这基本上表示我们正在通过向工厂传递参数 Call(由 coreV1Api.listNodeCall 返回)来创建 sharedIndexInformer

Call 对象由这个接受 CallGeneratorParams 参数的动态方法创建。

在 SharedInformerFactory 的情况下,我似乎不明白这个参数是如何以及从哪里传入的。很明显,params 变量中的一些字段被用于构建 listNodeCall,但是这个对象是在哪里以及如何构建的?

最佳答案

好吧,这就像在兔子洞里骑行。

I suggest to keep the diagrams from the official docs open in separate tab/window in order to appreciate the whole picture better.

为了理解这一点,您必须查看 SharedInformerFactory 的实现,尤其是 sharedIndexInformerFor打电话。

注意 lambda 是如何进一步向下传递以构建一个新的 ListWatcher 的实例 (method at line 194) , 然后传递到一个新的 DefaultSharedIndexInformer实例 (statement at line 144) .

现在我们有一个 SharedIndexInformer 的实例,它传递 ListerWatcher 进一步向下到它的 Controller (constructor line 99) .现在 ControllerInformer 本身运行时启动(参见 run() 方法)。

为了让它变得更加复杂,Controller 使用了一个Reflector 来处理……东西。根据 reflector.goReflector

Reflector watches a specified resource and causes all changes to be reflected in the given store.

所以它的工作是调用 listwatch 直到它被告知停止。因此,当 Controller 启动时,它还会将其 Reflector 调度到 run periodically

最后。当 Reflector 运行时,它会调用 list 方法,该方法 .. drum roll .. executes the lambda你问的是而 lambda 中的 param 变量是.. 另一个鼓声 .. created in the Reflector here

非常整洁,你说不是吗?

如果您需要进一步的帮助/说明,请告诉我。

干杯

关于java - Kubernetes SharedInformer 用法和定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69113095/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com