协调策略
借助声明式配置,您可以定义系统期望的状态。然后,系统会持续工作以尽可能保持接近此状态。如需了解详情,请参阅使用配置文件对 Kubernetes 对象进行声明式管理。
借助 Config Connector,您可以按任意顺序创建和更新资源,而不管依赖关系如何。GKE 会将声明的配置移向具有期望状态的最终一致性。
例如,如果您在相应的 PubSubTopic
之前创建 PubSubSubscription
,则 Config Connector 会等到主题创建之后再创建关联的订阅。
Config Connector 安装保持不一致的时长取决于它管理的资源的数量和类型。更改 GKE 集群只需要几秒钟。不过,创建Google Cloud 资源所需的时间根据资源的类型而有所不同。例如,创建单个 PubSubTopic
花费只需几秒钟。 Google Cloud资源在创建之后才能达成一致性。例如,当创建 SQLInstance
和 SQLDatabase
时,在创建数据库的过程中,系统会有几分钟处于不一致状态。
GKE 和 Config Connector 会在每次更新时或在抖动期(平均时长基于预配置的默认间隔)之后对每个资源进行协调。您可以在每个资源的参考页面中找到“Config Connector 默认平均协调间隔(以秒为单位)”。如需查看每种资源的链接,请参阅资源概览。 当协调出错时,Config Connector 会使用指数退避算法重试,其中最大退避时间为两分钟。您可以在查看给定资源的事件中查看所有错误。
配置协调间隔
从 Config Connector 1.102 开始,您可以使用 cnrm.cloud.google.com/reconcile-interval-in-seconds
注解为 Config Connector 管理的资源配置平均协调间隔。注解的值会覆盖资源参考页面中的“Config Connector 默认平均协调间隔(以秒为单位)”的默认值。注解的值应为非负整数,表示时间(以秒为单位)。如果该值设置为 0,Config Connector 会在资源达到 UpToDate 状态后停止为该资源启动协调。
例如,如果您希望 Config Connector 降低资源协调频率,以避免遇到基础 Google Cloud API 配额问题,可以将平均协调间隔时间值设置为 1 小时。
cnrm.cloud.google.com/reconcile-interval-in-seconds: "3600"
如果您希望 Config Connector 更频繁地协调资源,以便更快地纠正偏差,可以将注解设置为较小的值。
您可以使用以下脚本为共享相同 Group Version Kind (GVK) 的特定类型的所有资源添加注解:
#!/bin/bash
KIND=RESOURCE_KIND
NAMESPACE=RESOURCE_NAMESPACE
ANNOTATION_KEY="cnrm.cloud.google.com/reconcile-interval-in-seconds"
ANNOTATION_VALUE=RECONCILE_INTERVAL
kubectl annotate --overwrite --all ${KIND} ${ANNOTATION_KEY}=${ANNOTATION_VALUE} -n ${NAMESPACE}
echo "Annotation added to all ${KIND} RESOURCE"
替换以下内容:
RESOURCE_KIND
:要添加注释的资源类型。RESOURCE_NAMESPACE
:包含您要添加注释的资源的命名空间。RECONCILE_INTERVAL
:调和间隔(以秒为单位)。
您可以将调和间隔设置为 0 以停用资源的漂移校正,但这样做不会停用资源促动。如果您更改资源 Spec
,系统会再次协调该资源。
将对账间隔设置为 0 后,此设置将无法撤消。这意味着,即使将值改回非零数字,Config Connector 也不会再次协调资源。
如果您想恢复为非 0 的调和间隔,可以选择以下方法:
- 修改资源规范,添加协调间隔值,以启用新的协调。
- 通过设置注解
cnrm.cloud.google.com/deletion-policy: "abandon"
放弃资源,然后重新创建资源,并将协调间隔值设置为 0 以外的值。
可变但无法读取的字段仅在更改后生效
某些 API 会公开看不清但可变的字段(例如 SQL 用户的密码)。由于无法查看这些字段是否已修改,因此只有当自定义资源被修改时,可变但不可读的字段才会更新。
修改不可变字段时,不会重新创建资源
资源中的某些字段是不可变的,如不删除然后重新创建目标资源,则无法进行协调。
在这些情况下,Config Connector 将为该资源发出“UpdatedFailed”Kubernetes 事件,而不是执行此重新创建操作。然后,您必须删除并重新创建资源。
事件示例
Warning UpdateFailed 37m (x643 over 15d) computeinstance-controller Update call failed: the desired mutation for the following field(s) is invalid: [bootDisk.0.InitializeParams.0.Image networkInterface.0.NetworkIp]