リソース オブジェクト間の依存関係を宣言する

このガイドでは、Config Sync での依存関係の仕組みと独自の依存関係を指定する方法について説明します。

Config Sync は、特定のオブジェクトをクラスタに同期させるときに、オブジェクト間の暗黙的な依存関係を自動的に検出します。たとえば、Namespace オブジェクトは常にこれらの Namespace 内のオブジェクトより先に適用され、CustomResourceDefinition(CRD)オブジェクトは、常にこの種のカスタム リソースよりも先に適用されます。同様に、これらの暗黙の依存関係のために、削除の順序は逆になります。Namespace はその Namespace 内のオブジェクトの後に削除され、CRD はその種のカスタム リソースの後に削除されます。

depends-on アノテーションを使用して明示的な依存関係を設定することもできます。たとえば、WordPress のデプロイの前に MySQL StatefulSet を起動し、WordPress の開始前にデータベースを適用して準備できます。

要件

  • RootSync API と RepoSync API を有効にする必要があります。kubectl を使用して Config Sync を手動でインストールしていて、RootSync API と RepoSync API が有効になっていない場合は、ConfigManagement オブジェクトを移行する必要があります。

  • 制限事項: 依存関係は、依存している要素と同じ信頼できる情報源に存在する必要があります。依存関係は、依存している要素と同じ RootSync オブジェクトまたは RepoSync オブジェクトによって管理する必要があります。これにより、すべてのリソースが同じ ResourceGroup に配置されます。

適用グループ

リソースをクラスタに同期する際、Config Sync は、直接的な依存関係や間接的な依存関係を持つリソースを異なる適用グループに分割します。1 つの適用グループは、直接的な依存関係も間接的な依存関係も持たないリソースのみで構成されます。リソースの依存関係がない適用グループが最初に適用されます。

作動と調整

オブジェクトが作動(適用またはプルーニング)してから、コントローラによってオブジェクトが調整されるまで時間がかかることがあります。たとえば、Deployment が適用されている場合、基盤となる Pod がすぐには準備されない場合があります。基盤となる Pod の準備ができると、Deployment が調整されます。オブジェクトのタイプごとに、Config Sync はさまざまなタイプの条件をチェックし、オブジェクトが調整されたかどうかを確認します。詳細については、sigs.k8s.io/cli-utils をご覧ください。

depends-on アノテーションを使用すると、Config Sync は必要な順序でオブジェクトを適用するだけでなく、依存オブジェクトを適用する前に依存関係オブジェクトが調整されていることも確認します。

依存オブジェクトが、デフォルトの整合タイムアウト(5 分)内に調整されない場合、次の同期期間まで Config Sync はその依存オブジェクトを適用しません。デフォルトの整合タイムアウトをオーバーライドするには、spec.override.reconcileTimeout を設定します。

オブジェクトに depends-on アノテーションを追加する

依存関係を指定するには、依存関係オブジェクトを参照する値を使用して config.kubernetes.io/depends-on アノテーションを依存関係オブジェクトに追加します。

WordPress の例では、WordPress Deployment のアノテーションは次のようになります。

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress
  namespace: default
  labels:
    app: wordpress
  annotations:
    config.kubernetes.io/depends-on: apps/namespaces/default/StatefulSet/wordpress-mysql

Config Sync がオブジェクトを適用する場合は、まず依存関係であるオブジェクト wordpress-mysql StatefulSet を適用します。依存関係が調整されると、Config Sync はその依存関係である wordpress Deployment を適用します。

オブジェクト参照

オブジェクト参照では、次の構文を使用します。

  • Namespace オブジェクトの場合:

    GROUP/namespaces/NAMESPACE/KIND/NAME
    
  • クラスタ スコープのオブジェクトの場合:

    GROUP/KIND/NAME
    

    次のように置き換えます。

    • GROUP: 依存関係オブジェクトのグループ。
    • NAMESPACE: 名前空間スコープの依存関係オブジェクトの Namespace。
    • KIND: 依存関係オブジェクトの種類。このフィールドでは大文字と小文字が区別されます。たとえば、「pod」ではなく「Pod」を使用します。
    • NAME: 依存関係オブジェクトの名前。

コアグループのオブジェクトの場合は、代わりに空の文字列が使用されます(例: /namespaces/test/Pod/pod-a)。

複数のオブジェクト参照を区切るには、, を使用します(例: /namespaces/test/Pod/pod-a,/namespaces/test/Pod/pod-b)。