在外部管理字段


当 Config Connector 在 Google Cloud 上创建资源时,规范中未指定的字段会采用 API 中的值,除非这些值不可读(例如,无法使用 GET HTTP 请求获取这些值)。

在这种情况下,该字段被视为“在外部管理”,因为 Kubernetes 不是此值的真实来源。

启用服务器端应用的行为

如果为资源启用了服务器端应用,则对象中在外部管理的字段的值将持续更新以与底层 Google Cloud 资源匹配。

如果所应用配置内规范中的字段存在值,则该字段不是在外部管理。

如果该字段被移除,则该字段将在外部管理。

不启用服务器端应用的行为

如果未启用服务器端应用,则资源规范中未指定的字段会使用从 Google Cloud API 中读取的值填充,并且 Config Connector 会强制使用这些最初填充的值。

例如:如果用户应用资源配置,但未在规范中设置 bar 的值:

spec:
    foo: "foo"

如果 Google Cloud API 中的 bar 字段的值为 baz,则 api-server 中的资源将填充为该值:

# object in the api-server
spec:
    foo: "foo"
    bar: "baz"  # populated by first reconciliation

如果直接修改 Google Cloud 资源,使得 bar 现在是 baz-2,则 Google Cloud API 会更正为最初在资源规范中填充的值:baz

# object in the api-server
spec:
    foo: "foo"
    bar: "baz"  # still the originally populated value, and overrides the Google Cloud value

资源规范中列表字段的行为

由于 Config Connector 中的技术限制,默认情况下,资源配置中的列表字段无法管理外部。这意味着 Config Connector 始终拥有资源规范中的列表字段的所有权,即使原始资源配置中未指定相应字段也是如此。

应用资源规范时,Config Connector 会从 Google Cloud API 读取列表字段的值,并将此初始值视为可信来源和期望状态。如果该列表字段中的值在 Config Connector 之外进行了修改,则 Config Connector 会尝试将其改回去,但您可能并不想这样做。

如需绕过此限制并允许从外部管理列表字段,请使用 cnrm.cloud.google.com/state-into-spec 注解。并非所有资源都支持此注解。如需查看您的资源是否支持该注解,请查看相应的资源参考页面

metadata:
  annotations:
    cnrm.cloud.google.com/state-into-spec: absent

通过将 state-into-spec 的值设置为 absent,Config Connector 会忽略资源配置中未指定的列表字段。这样一来,资源中的列表字段将在外部管理。

注意事项

由 Config Connector 管理和由外部服务自动更新的字段可能会触发底层 API 的无限更新。如果底层 API 具有自动扩缩或自动更新字段,就可能会发生这种情况。通过为资源启用服务器端应用并在应用时将该字段排除在配置文件之外,确保将这些字段视为在外部管理。