外部でのフィールドの管理
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 構成ファイルを適用するときに、自動更新されるフィールドを省略します。
- 次のいずれかの方法で、指定されていないフィールドを無視するようにリソースを構成します。
- リソースに
cnrm.cloud.google.com/state-into-spec: absentアノテーションを設定するか、既存のリソースをMerge動作からAbsent動作に移行します。 - リソースに対してサーバー側の適用を有効にします。
- リソースに