在外部管理字段
当 Config Connector 在 Google Cloud上创建资源时,规范中未指定的字段会采用 API 中的值,除非这些值不可读(例如,无法使用 GET HTTP 请求获取这些值)。
在这种情况下,该字段被视为“在外部管理”,因为 Kubernetes 不是此值的真实来源。
启用服务器端应用的行为
如果为资源启用了服务器端应用,则对象中在外部管理的字段的值将持续更新以与底层 Google Cloud资源匹配。
如果所应用配置内规范中的字段存在值,则该字段不是在外部管理。
如果该字段被移除,则该字段将在外部管理。
不启用服务器端应用的行为
如果未启用服务器端应用,则资源规范中未指定的字段会使用从 API 中读取的值填充,并且 Config Connector 会强制使用这些最初填充的值。 Google Cloud
例如:如果用户应用资源配置,但未在规范中设置 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 具有自动扩缩或自动更新字段,就可能会发生这种情况。通过为资源启用服务器端应用并在应用时将该字段排除在配置文件之外,确保将这些字段视为在外部管理。