管理与多个 Config Connector 资源的冲突

本页面介绍了 Config Connector 如何处理冲突。如果同一个资源由多个资源管理,可能会发生冲突。

Config Connector 通过映射 Kubernetes 资源名称、容器注释(如果适用)以及地区或位置的组合管理或获取资源。在最简单的情况下,您可以使用 Google Cloud 项目组织资源。

Google Cloud 还支持项目以外的更多层次结构:文件夹、项目和组织。您可以使用注释将资源映射到文件夹、项目和组织。当您使用 Config Connector 创建不带注释的资源时,该资源是在共享该资源命名空间的项目中创建的。

最好在管理同一 Google Cloud 资源的不同命名空间中创建两个 Config Connector 资源,但不建议这样做。配置连接器仅在能够获得对 Google Cloud 资源的租用并且已启用冲突预防时管理相应的 Google Cloud 资源。

租赁属于命名空间范围。如需获取命名空间级租约,Config Connector 将向资源添加两个标签:

  1. cnrm-lease-holder-id:Config Controller 会为每个管理启用了冲突防范的资源的命名空间生成一个唯一 ID。此唯一 ID 是用于设置 cnrm-lease-holder-id 的。如需查看命名空间到 cnrm-lease-holder-id 值的映射,您可以查看 cnrm-system 命名空间中的 namespace-id ConfigMap。
  2. cnrm-lease-expiration:以 Unix 纪元时间表示的到期时间。

如果满足以下任一条件,Config Connector 便能够更新这些值:

  • cnrm-lease-holder-id 的值与命名空间的全局唯一 ID 匹配。
  • cnrm-lease-holder-id 的值为空或不存在。
  • cnrm-lease-expiration 的值为过去的时间。

当 Config Connector 实例获得资源的租用时,到期时间设置为将来的 40 分钟。只要资源位于命名空间中,Config Config 的同一实例就会保留管理。如果剩余的连接器不到 20 分钟,Config Connector 会将到期时间延长 40 分钟。

如果 Config Connector 无法获取给定资源的租用,则该资源上 kubectl describe 的输出将列出 ManagementConflict 状态。

修改冲突防护

您可以通过使用以下某个值向资源添加 cnrm.cloud.google.com/management-conflict-prevention-policy 注释来控制冲突预防:

  • resource:通过将适当的租约标签保存到资源中,在资源级层防止管理冲突(如上一部分所述)。
  • none:无法防止管理冲突。

默认值为 none

在以下示例中,默认 ComputeNetwork 的清单使用 none 管理政策,这意味着没有发生冲突:

apiVersion: compute.cnrm.cloud.google.com/v1beta1
kind: ComputeNetwork
metadata:
 annotations:
   cnrm.cloud.google.com/management-conflict-prevention-policy: "none"
   cnrm.cloud.google.com/project-id: "PROJECT-ID"
   cnrm.cloud.google.com/deletion-policy: "abandon"
 name: default
spec:
 description: Default network for the project

局限性

冲突预防具有以下限制:

  • 冲突预防不适用于不支持标签的资源。即使您将值从 none 更改为 resource,它仍然不起作用。

  • 如果您要使用 resourceID 字段管理资源,则可以创建在同一命名空间下创建的具有相同 Google Cloud 资源名称的多个资源。这些资源会造成 Config Connector 无法管理的冲突。