リポジトリを複数のリポジトリに分割する

このページでは、1 つのルート リポジトリを複数のルート リポジトリに安全に分割する方法について説明します。この手順は、名前空間リポジトリにも適用できます。

Config Sync によって同期されるリポジトリとは、Git リポジトリ、ブランチ、リビジョン、ディレクトリの組み合わせを指します。

ルート リポジトリに多数のリソースがある場合(たとえば 5,000 個を超える場合)、次の 2 つの理由から Config Sync の動作に問題が生じることがあります。

  1. ResourceGroup オブジェクトが、etcd オブジェクトのサイズ制限を超える可能性があります。ResourceGroup オブジェクトは、Git リポジトリ内のすべてのリソースのグループ、種類、Namespace、名前を記録します。リソースが多数ある場合、ResourceGroup オブジェクトのサイズも大きくなります。
  2. リソースのすべてを同期する場合、リソースの数が少ないリポジトリよりも時間がかかります。Config Sync ではリソースをクラスタに順次適用します。最初のリソースの適用に成功しないこともあります。その場合、Config Sync によるリソースの適用の再試行が必要になります。

このような問題が発生した場合は、ルート リポジトリを複数のルート リポジトリに分割して、リポジトリ内のリソース数を減らすことができます。

非構造化ルート リポジトリを分割する

この手順の説明では RootSync オブジェクトを使用します。この手順は、RepoSync オブジェクトにも適用できます。

この方法は、Config Sync バージョン 1.21.0 以降で機能します。このリリースで追加されたファイナライザは、RootSync オブジェクトまたは RepoSync オブジェクトが削除されたときにオブジェクトの管理を停止するためです。以前は、孤立したオブジェクトに永続的なメタデータがあり、他のクライアントや新しい RootSync オブジェクトまたは RepoSync オブジェクトで管理できませんでした。

ルート リポジトリが、オブジェクト RootSync single-root-sync によって同期されていると仮定しましょう。リポジトリを分割すると、2 つのルート リポジトリが作成されます。一方は RootSync オブジェクト root-sync-1 によって、もう一方は RootSync オブジェクト root-sync-2 によって同期されます。

リポジトリを分割する手順は次のとおりです。

  1. RootSync single-root-syncconfigsync.gke.io/deletion-propagation-policy の値が Orphan である、または設定されていないことを確認します。未設定の場合のデフォルト値は「Orphan」と同じです。この設定により、オブジェクトが削除されないようにします。

  2. RootSync single-root-sync を削除します。

    kubectl delete rootsync single-root-sync -n config-management-system
    
  3. 次の手順に沿って、新しいリポジトリを設定します。

    1. 新しいリポジトリまたは既存の Git リポジトリに新しいディレクトリを作成します。
    2. リソースを新しいリポジトリまたは新しいディレクトリに移動します。
    3. ルート リポジトリを 3 つ以上のリポジトリに分割する場合は、必要に応じてこれらの手順を繰り返します。
  4. 変更を commit して push します。

    git commit -am 'add configuration for the new root repository'
    
  5. RootSync オブジェクト root-sync-1root-sync-2 を適用します。これにより、新しいリポジトリまたはディレクトリが同期され、クラスタ内の既存のオブジェクトは新しい RootSync オブジェクト root-sync-1root-sync-2 によって管理されます。

     apiVersion: configsync.gke.io/v1beta1
     kind: RootSync
     metadata:
       name: ROOT_SYNC_NAME
       namespace: config-management-system
     spec:
       sourceFormat: unstructured
       git:
         repo: NEW_ROOT_REPOSITORY
         revision: NEW_ROOT_REVISION
         branch: NEW_ROOT_BRANCH
         dir: "NEW_ROOT_DIRECTORY"
         auth: ROOT_AUTH_TYPE
         gcpServiceAccountEmail: ROOT_EMAIL
         # secretRef should be omitted if the auth type is none, gcenode, or gcpserviceaccount.
         secretRef:
           name: git-creds
    

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

    • NEW_ROOT_REPOSITORY: 新しいルート リポジトリとして使用する Git リポジトリの URL。HTTPS または SSH プロトコルを使用する URL を入力できます。たとえば、https://github.com/GoogleCloudPlatform/anthos-config-management-samples では HTTPS プロトコルを使用します。プロトコルを入力しない場合、URL は HTTPS URL として扱われます。
    • NEW_ROOT_REVISION: (省略可)チェックアウトする新しいルート リポジトリの Git リビジョン(タグまたはハッシュ)。
    • NEW_ROOT_BRANCH: (省略可)同期元となる新しいルート リポジトリのブランチ。
    • NEW_ROOT_DIRECTORY: (省略可)同期先の構成を含む、新しいルート ディレクトリの Git リポジトリ内パス。
    • ROOT_AUTH_TYPE: この値は、既存の RootSync/root-sync オブジェクトと同じにする必要があります。
    • ROOT_EMAIL: この値は、既存の RootSync/root-sync オブジェクトと同じにする必要があります。
  6. 新しい RootSync オブジェクト root-sync-1 が同期されるまで待ちます。ステータスを確認するには、次のコマンドを使用します。

    nomos status
    

すべてのバージョン

この方法は、バージョン 1.21.0 を含むすべての Config Sync バージョンで使用できますが、手順が少ないため、バージョン 1.21.0 以降で使用可能な方法を使用することをおすすめします。Config Sync のバージョンが 1.21.0 より前の場合は、代わりにこの方法を使用できます。

ルート リポジトリが、オブジェクト RootSync root-sync によって同期されていると仮定しましょう。リポジトリを分割すると、2 つのルート リポジトリが作成されます。一方は RootSync オブジェクト root-sync によって、もう一方は RootSync オブジェクト root-sync-1 によって同期されます。

リポジトリを分割する手順は次のとおりです。

  1. 既存のルート リポジトリで、別のリポジトリまたはディレクトリに移動するリソースを選択し、それらのリソースにアノテーション configmanagement.gke.io/managed: disabled を追加します。このアノテーションを使用すると、あるリポジトリから別のリポジトリに構成を移動しても、クラスタ内の既存のオブジェクトに影響はありません。Kustomize 形式または Helm チャートを使用する場合は、次の例のように、約半分を選択して kustomization.yaml ファイルに共通のアノテーションを追加できます。

    # kustomization.yaml
    commonAnnotations:
      configmanagement.gke.io/managed: disabled
    
  2. 変更を commit して push します。 sh git commit -am 'disable Config Sync management on subset of the configuration'

  3. 既存の RootSync オブジェクト root-sync が、次のコマンドを使用して同期されるまで待ちます。

    nomos status
    
  4. 次の手順に沿って、2 番目のリポジトリを設定します。

    1. 新しいリポジトリまたは既存の Git リポジトリに新しいディレクトリを作成します。
    2. アノテーション configmanagement.gke.io/managed: disabled を持つリソースを新しいリポジトリまたは新しいディレクトリにコピーします。
    3. 新しいリポジトリまたはディレクトリからアノテーション configmanagement.gke.io/managed: disabled を削除します。
    4. ルート リポジトリを 3 つ以上のリポジトリに分割する場合は、必要に応じてこれらの手順を繰り返します。
  5. 変更を commit して push します。

    git commit -am 'add configuration for the new root repository'
    
  6. RootSync オブジェクト root-sync-1 を適用して、新しいリポジトリまたはディレクトリを同期し、クラスタ内の既存のオブジェクトが新しい RootSync オブジェクト root-sync-1 によって管理されるようにします。

     apiVersion: configsync.gke.io/v1beta1
     kind: RootSync
     metadata:
       name: root-sync-1
       namespace: config-management-system
     spec:
       sourceFormat: unstructured
       git:
         repo: NEW_ROOT_REPOSITORY
         revision: NEW_ROOT_REVISION
         branch: NEW_ROOT_BRANCH
         dir: "NEW_ROOT_DIRECTORY"
         auth: ROOT_AUTH_TYPE
         gcpServiceAccountEmail: ROOT_EMAIL
         # secretRef should be omitted if the auth type is none, gcenode, or gcpserviceaccount.
         secretRef:
           name: git-creds
    

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

    • NEW_ROOT_REPOSITORY: 新しいルート リポジトリとして使用する Git リポジトリの URL。HTTPS または SSH プロトコルを使用する URL を入力できます。たとえば、https://github.com/GoogleCloudPlatform/anthos-config-management-samples では HTTPS プロトコルを使用します。プロトコルを入力しない場合、URL は HTTPS URL として扱われます。
    • NEW_ROOT_REVISION: (省略可)チェックアウトする新しいルート リポジトリの Git リビジョン(タグまたはハッシュ)。
    • NEW_ROOT_BRANCH: (省略可)同期元となる新しいルート リポジトリのブランチ。
    • NEW_ROOT_DIRECTORY: (省略可)同期先の構成を含む、新しいルート ディレクトリの Git リポジトリ内パス。
    • ROOT_AUTH_TYPE: この値は、既存の RootSync/root-sync オブジェクトと同じにする必要があります。
    • ROOT_EMAIL: この値は、既存の RootSync/root-sync オブジェクトと同じにする必要があります。
  7. 新しい RootSync オブジェクト root-sync-1 が同期されるまで待ちます。ステータスを確認するには、次のコマンドを使用します。

    nomos status
    
  8. アノテーション configmanagement.gke.io/managed: disabled が付けられたリソースを元のリポジトリから削除します。変更を commit して push します。

    git commit -am 'remove configuration managed by the new root repository'
    
  9. 既存の RootSync オブジェクト root-sync が、次のコマンドを使用して同期されるまで待ちます。

    nomos status
    

階層ルート リポジトリを分割する

階層型リポジトリを分割する手順は、非構造化リポジトリを分割する手順と同様です。

主な違いは次の 3 点です。

  1. 新しいルート リポジトリ(または新しいディレクトリ)も階層構造になっている必要があります。既存のディレクトリ system/clusterregistry/ ディレクトリを新しいルート リポジトリ(または新しいディレクトリ)にコピーする必要があります。

  2. Namespace 内のリソースを複数のリポジトリに分散することはできません。分散すると、名前空間を管理するために複数の Reconciler の間で競合が発生します。

  3. RootSync オブジェクト root-sync-1 は、spec.sourceFormat: hierarchical を使用する必要があります。

非構造化リポジトリが推奨されるため、分割する前に階層型リポジトリを非構造化リポジトリに変換することもできます。