协调策略


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

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

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

Config Connector 安装保持不一致的时长取决于它管理的资源的数量和类型。对 GKE 的更改 通常在几秒钟内执行完毕。但是,创建 Google Cloud 资源所需的时间根据资源的类型而有所不同。对于 例如,创建单个 PubSubTopic 需要几秒钟时间。Google Cloud 资源在创建之前不会保持一致。例如,当 创建 SQLInstanceSQLDatabase,则系统在对 持续几分钟。

GKE 和 Config Connector 更新或在抖动期过后,显示基于预配置默认值的平均值 。您可以在“Config Connector 默认平均值”中找到默认时间间隔 协调间隔(以秒为单位)从每个资源的参考页面获取。 如需各项资源的链接,请参阅资源概览。 当协调出错时,Config Connector 会使用指数退避算法重试,其中最大退避时间为两分钟。您可以在 事件 特定资源

配置协调间隔

从 Config Connector 1.102 开始,您可以使用 cnrm.cloud.google.com/reconcile-interval-in-seconds 注解为 Config Connector 管理的资源配置平均协调间隔。注释的值会覆盖资源引用页面中的“Config Connector 默认平均协调间隔(以秒为单位)”的默认值。注释的值应为一个非负整数,表示以秒为单位的时间。如果此值设置为 0,则一旦资源达到 UpToDate 状态,Config Connector 就会停止为该资源启动协调。

例如,如果您希望 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:协调间隔(以秒为单位)。

您可以将协调间隔设置为 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]