調整戦略のストラテジー


宣言型の構成では、システムの望ましい状態を定義します。その後、システムは常にこの状態にできる限り近いままで動作します。詳細については、構成ファイルを使用した Kubernetes オブジェクトの宣言型管理をご覧ください。

Config Connector を使用すると、依存関係の関係にかかわらず、任意の順序でリソースの作成と更新を行うことができます。GKE は、宣言された構成を望ましい状態の結果整合性に移行します。

たとえば、PubSubSubscription を対応する PubSubTopic より先に 作成する場合、Config Connector は、関連するサブスクリプションが作成されるまで、トピックの作成を待機します。

Config Connector のインストールが一貫していない期間は、管理するリソースの数とタイプによって異なります。通常、GKE クラスタの変更は数秒で実行されます。ただし、Google Cloud リソースを作成する時間はリソースの種類によって異なります。たとえば、1 つの PubSubTopic の作成には数秒かかります。Google Cloud リソースは、作成されるまで一貫性を持ちません。たとえば、SQLInstanceSQLDatabase を作成する場合、データベースの作成中にシステムは数分間一貫性がありません。

GKE と Config Connector は、更新ごとに、または事前に構成されたデフォルトの間隔に基づく平均のジッター周期後に各リソースを調整します。デフォルトの間隔は、各リソースのリファレンス ページの「Config Connector のデフォルト平均調整間隔(秒)」で確認できます。各リソースへのリンクについては、リソースの概要をご覧ください。調整中にエラーが発生した場合、Config Connector は最大バックオフが 2 分である指数バックオフで再試行します。特定のリソースの [イベント] でエラーを表示できます。

調整間隔の設定

Config Connector 1.102 以降では、Config Connector によって管理されるリソースの平均調整間隔を cnrm.cloud.google.com/reconcile-interval-in-seconds アノテーションを使用して設定できます。アノテーションの値により、リソース リファレンス ページの「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: アノテーションを付けるリソースを含む 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]