外部でのフィールドの管理

Config Connector が Google Cloudでリソースを作成すると、 読み取り可能でない限り(HTTP GET リクエストで使用できないフィールドなど)、spec フィールドで指定されていないフィールドは API から値を取得します。

この場合、Kubernetes がこの値の信頼できる情報源ではないため、フィールドは外部管理と見なされます。

サーバー側の適用に関する動作

リソースに対して サーバー側の適用 が有効になっている場合、 オブジェクト内の外部管理フィールドの値は、基盤となる Google Cloud リソースと一致するように継続的に更新されます。

適用された構成の spec セクションのフィールドに値がある場合、そのフィールドは外部で管理されません。

フィールドを削除すると、そのフィールドは外部で管理されます。

サーバー側での適用なしの動作

サーバーサイドの適用が有効になっておらず、リソースが Merge 入力 動作を使用する場合、Config Connector はリソースの spec フィールドで指定されていないフィールドに Google Cloud API から読み取った値を入力し、 最初に入力された値を適用します。

たとえば、spec セクションの field2 フィールドの値を設定せずにリソース構成を適用するとします。

spec:
    field1: "value-1"

API の field2 フィールドの値が "api-value-1" の場合、 Google Cloud API サーバー のリソースにはその値が入力されます。

# object in the api-server
spec:
    field1: "value-1"
    field2: "api-value-1"  # populated by first reconciliation

Google Cloud リソースが直接変更され、field2 フィールドが"api-value-2"になった場合、Config Connector は Google Cloud リソースをリソースのspecフィールド ("api-value-1")に最初に入力された値に戻します。

# object in the api-server
spec:
    field1: "value-1"
    # still the originally populated value; overrides the external value
    field2: "api-value-1"

リソース仕様のリスト フィールドにおける動作

Config Connector の技術的な制限により、リソースが Merge 入力動作を使用している場合、リソース構成のリスト フィールドはデフォルトでは外部での管理ができません。この制限のため、元のリソース構成でフィールドを指定していない場合でも、Config Connector はリソースの spec フィールドのリスト フィールドの所有権を取得します。

リソースの spec フィールドを適用すると、Config Connector は Google Cloud API からリスト フィールドの値を読み取り、この初期値を 信頼できる情報源およびターゲット状態として扱います。そのリスト フィールドの値が 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 によって管理され、外部サービスによって自動的に更新されるフィールドは、基盤となる 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.maintenanceVersion 値 spec フィールドに保存されている状態に戻そうとします。Cloud SQL はメンテナンス バージョンのダウングレードを拒否するため、UpdateFailed エラーで調整が繰り返し失敗します。

外部サービスが自動更新されるフィールドを管理できるようにするには、次の操作を行います。

  • YAML 構成ファイルを適用するときに、自動更新されるフィールドを省略します。
  • 次のいずれかの方法で、指定されていないフィールドを無視するようにリソースを構成します。