中心、辐条以及其他轮子隐喻

由于我们现在有两个不同的版本,并且用户可以请求任一版本,我们需要定义一种在我们的版本之间转换的方法。对于 CRD(自定义资源定义),这可以通过 webhook 实现,类似于我们在基本教程中定义的默认和验证 webhook。和之前一样,controller-runtime 将帮助我们将这些细节连接在一起,我们只需要实现实际的转换。

在我们进行之前,我们需要了解controller-runtime如何看待版本。具体而言:

完全图在航海方面不够充分。

定义转换的一个简单方法可能是定义转换函数,以在我们每个版本之间进行转换。然后,每当我们需要转换时,就查找适当的函数,并调用它来执行转换。

当我们只有两个版本时,这很好,但如果我们有 4 种类型呢?8 种类型呢?那将需要很多转换函数。

相反,controller-runtime 将转换建模为“中心与辐射“模型——我们将一个版本标记为“中心“,所有其他版本只定义与中心之间的转换:

becomes

然后,如果我们需要在两个非中心版本之间进行转换,我们首先转换为中心版本,然后再转换为我们所需的版本:

这减少了我们需要定义的转换函数的数量,并且是基于 Kubernetes 在内部的做法。

这与 Webhook 有什么关系?

当 API 客户端,如 kubectl 或者你的控制器,请求某个特定版本的资源时,Kubernetes API 服务器需要返回该版本的结果。然而,该版本可能与 API 服务器存储的版本不匹配。

在这种情况下,API 服务器需要知道如何在所需版本和存储版本之间进行转换。由于 CRD 并没有内置转换功能,Kubernetes API 服务器会调用一个 webhook 来执行转换。对于 Kubebuilder,这个 webhook 是由 controller-runtime 实现的,执行我们上面讨论的中心-辐射转换。

现在我们已经掌握了转换模型,我们可以实际执行我们的转换。