在外部管理字段
当 Config Connector 在 Google Cloud上创建资源时,除非 spec 字段中未指定的字段不可读(例如,无法通过 HTTP GET 请求获取的字段),否则这些字段将采用 API 中的值。
在这种情况下,该字段被视为“外部管理”,因为 Kubernetes 不是此值的可靠来源。
启用服务器端应用的行为
如果为资源启用了 服务器端应用 ,则对象中外部管理的字段的值会持续更新,以与底层 Google Cloud 资源保持一致。
如果应用的配置的 spec 部分中的某个字段具有值,则该字段不是外部管理的。
如果该字段被移除,则该字段将在外部管理。
不启用服务器端应用的行为
如果未启用服务器端应用,并且资源使用 Merge 填充
行为,则 Config Connector 会使用从 Google Cloud API 读取的值填充资源 spec
字段中未指定的字段,并强制执行最初填充的这些
值。
例如,假设您应用了资源配置,但未在 spec 部分中为 bar 字段设置值:
spec:
foo: "foo"
如果 bar 字段的值在 Google Cloud API 中为 "baz",则
API 服务器
中的
资源将填充该值:
# object in the api-server
spec:
foo: "foo"
bar: "baz" # populated by first reconciliation
如果直接修改 Google Cloud 资源,使 bar 字段
现在为 "baz-2",则 Config Connector 会将 Google Cloud 资源恢复为
最初在资源 spec 字段中填充的值 ("baz"):
# object in the api-server
spec:
foo: "foo"
# still the originally populated value; overrides the external value
bar: "baz"
资源规范中列表字段的行为
由于 Config Connector 存在技术限制,因此当资源使用 Merge 填充行为时,资源配置中的列表字段默认无法在外部进行管理。由于此限制,即使您未在原始资源配置中指定列表字段,Config Connector 也会取得资源 spec 字段中列表字段的所有权。
当您应用资源 spec 字段时,Config Connector 会从
API Google Cloud 读取列表字段的值,并将此初始值视为
可靠来源和目标状态。如果该列表字段中的值在 Config Connector 外部发生更改,Config Connector 会尝试还原更改,这可能不是您预期的行为。
如需绕过此限制并允许在外部管理列表字段,请使用
cnrm.cloud.google.com/state-into-spec: absent 注解来 忽略
未指定的字段。
对于 Config Connector 1.123.1 及更高版本中新创建的资源,此注解的值默认设置为 absent。如需查看您的资源
是否支持该注解,请查看相应的 资源参考
页面。
如需配置此行为,请将以下注解添加到资源清单中:
metadata:
annotations:
cnrm.cloud.google.com/state-into-spec: absent
当您将 state-into-spec 注解的值设置为 absent 时,Config Connector 会忽略资源配置中未指定的列表字段,以便可以在外部管理这些字段。
注意事项
由 Config Connector 管理并由外部服务自动更新的字段可能会在底层 API 上触发无休止的更新或协调错误。当底层 Google Cloud
API 具有自动扩缩或自动更新的字段,并且您的资源在不启用服务器端
应用的情况下使用
cnrm.cloud.google.com/state-into-spec: merge 注解时,可能会出现这些问题。
例如,如果 SQLInstance 资源使用
cnrm.cloud.google.com/state-into-spec: merge 注解,则 Config Connector
会将实例的初始 spec.maintenanceVersion 字段填充到
Kubernetes 资源 spec 字段中。当 Cloud SQL 稍后对底层实例执行
自动维护更新时,Config Connector
会尝试将实例恢复为存储在 spec 字段中的旧 spec.maintenanceVersion 值
。由于 Cloud SQL 拒绝维护版本降级,因此协调会因 UpdateFailed 错误而反复失败。
如需允许外部服务管理自动更新的字段,请执行以下操作:
- 应用 YAML 配置文件时,请从该文件中省略自动更新的字段。
- 通过执行以下任一操作,将资源配置为忽略未指定的字段:
- 在
资源上设置
cnrm.cloud.google.com/state-into-spec: absent注解,或将现有资源从Merge行为迁移到Absent行为。 - 为资源启用服务器端应用。
- 在
资源上设置