在外部管理字段


当 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 会读取 列表字段的值,并将此初始 作为可信来源和期望状态。如果该列表字段的值是 在 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 具有自动扩缩或自动更新字段,就可能会发生这种情况。通过为资源启用服务器端应用并在应用时将该字段排除在配置文件之外,确保将这些字段视为在外部管理。