管理涉及多个 Config Connector 资源的冲突

本页面介绍了 Config Connector 处理冲突的方式。当同一资源由多个资源管理时,可能会发生冲突。

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

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

可以但不建议在管理相同 Google Cloud 资源的不同命名空间中创建两个 Config Connector 资源。 如果 Config Connector 能够获得 Google Cloud 资源的租约并且启用了冲突预防,则它只会管理相应的 Google Cloud 资源。

租约范围限制为命名空间。为了获得范围限制为命名空间的租约,Config Connector 将在资源中添加两个标签:

  1. 命名空间的全球唯一 ID(cnrm-lease-holder-id)
  2. 到期时间 (cnrm-lease-expiration),以 UNIX 时间戳表示。

如果存在以下任一条件,则 Config Connector 能够更新这些值:

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

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

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

修改冲突预防

您可以使用下列值之一在资源中添加 cnrm.cloud.google.com/management-conflict-prevention-policy 注释来控制冲突预防:

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

默认值取决于 Config Connector 资源是否支持标签。 如果资源支持标签,则默认值为 resource。如果资源不支持标签,则默认值为 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 无法管理的冲突。