协调策略


借助声明式配置,您可以定义系统期望的状态。然后,系统会持续工作以尽可能保持接近此状态。如需了解详情,请参阅使用配置文件对 Kubernetes 对象进行声明式管理

借助 Config Connector,您可以按任意顺序创建和更新资源,而不管依赖关系如何。GKE 将声明的配置移向具有期望状态的最终一致性

例如,如果您在相应的 PubSubTopic 之前创建 PubSubSubscription,则 Config Connector 会等到主题创建之后再创建关联的订阅。

Config Connector 安装保持不一致的时长取决于它管理的资源的数量和类型。对 GKE 集群的更改通常只需几秒钟即可执行。但是,创建 Google Cloud 资源的时间可能会因资源类型而异。例如,单个 PubSubTopic 需要几秒钟才能创建。Google Cloud 资源在创建之前不会保持一致。例如,在创建 SQLInstanceSQLDatabase 时,当系统创建数据库时,系统在几分钟内会不一致。

GKE 和 Config Connector 在每次更新时或每次抖动后平均调整每个资源,默认为 10 分钟。在协调出错时,Config Connector 将以指数退避算法重试(退避时间上限为 2 分钟)。您可以在给定资源的事件中查看任何错误。

配置对帐间隔

从 Config Connector 1.102 开始,您可以使用 cnrm.cloud.google.com/reconcile-interval-in-seconds 注解为 Config Connector 管理的资源配置平均协调间隔。注解的值应为表示时间的非秒整数(以秒为单位)。如果该值设置为 0,则 Config Connector 会在达到 UpToDate 状态后停止为资源启动对帐。

例如,如果您希望 Config Connector 降低资源协调频率以避免出现底层 Google Cloud API 配额问题,则可以将平均对帐间隔值设置为 1 小时。

cnrm.cloud.google.com/reconcile-interval-in-seconds: 3600

如果您希望 Config Connector 更频繁地协调资源以更快地偏移,可以使用小值设置注解。

您可以使用以下脚本为同一组版本种类 (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:协调间隔(以秒为单位)。

可变但无法读取的字段仅在更改后生效

某些 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]