0

我正在使用 operator-sdk 实现 operator。

我对 operator SDK( )Patch中的 API有一些疑问。client.Client

有两个 Patch APIClient.PatchClient.Status().Patch.

据我所知,第一个(Client.Patch)将充当补丁字段,但Status在资源中除外。另一个(Client.Status().Patch)将修补Status资源中的字段。

在这一点上,我可以在一个 Reconcile 函数中多次使用Patch(无论是什么Client.Status().Patch或)API 吗?Client.Patch

我认为PatchAPI 会更改资源版本,因此当我在一个 Reconcile 函数中多次调用 API 时 API 不能正常工作Patch,但是 APIs( Patch) 工作良好(我实际上在一个 Reconcile 函数中调用了 2 次),正如我所观察到的。

如果有我误解的知识,请给我建议。

谢谢。

4

1 回答 1

1

我找到了一篇博客文章,标题为:编写 Kubernetes Operators 的 7 个最佳实践:一个 SRE 视角

第4点是:

4:一次一个自定义资源修改

每次您的控制器正在监视的自定义资源发生变化时,协调循环将再次运行。这包括用户所做的更改,但也包括您在 Reconcile 函数或其子例程中所做的更改。通常,您需要更新正在操作的自定义资源以添加信息。GCP Project Operator 的一个示例是它在 GCP 中创建的项目的 ID。此更新将导致协调循环获取自定义资源的更新版本并开始再次运行协调。

您需要注意这一点,因为更改自定义资源并继续处理可能会导致新创建的请求出现竞争条件。如果启用了并行处理,它会立即开始运行 Reconcile 功能。在这种情况下,您必须考虑在代码的每一行中可能同时有第二个请求处理此资源。即使请求不是并行处理的,当一遍又一遍地更新 CustomResource 时,协调请求也会堆积起来,使操作员不必要地忙碌。

为了降低竞争条件的风险并避免堆积请求,请确保您不会在一次 Reconcile 运行中对自定义资源或相关操作执行多项更改。每当您更新您正在观看的自定义资源时,只需退出协调循环,并让下一次运行继续。您之前执行的所有幂等函数都不会执行任何操作,您可以从中断的地方继续。


因此,如果我理解正确,您可以在一次协调功能中进行多项更改,但通常被认为是不好的做法。

于 2020-08-21T12:09:24.860 回答