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

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

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

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

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

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

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

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

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

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

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

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

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

    # gcloud command
    gcloud alpha anthos config sync repo describe --cluster MEMBERSHIP_NAME \
      --sync-namespace config-management-system  --sync-name root-sync
    

    MEMBERSHIP_NAME は、登録済みクラスタのメンバー名に置き換えます。

  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-split を適用して、新しいリポジトリまたはディレクトリを同期し、クラスタ内の既存のオブジェクトが新しい RootSync オブジェクト root-split によって管理されるようにします。

     apiVersion: configsync.gke.io/v1beta1
     kind: RootSync
     metadata:
       name: root-split
       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-split が同期されるまで待ちます。これを行うには、gcloud alpha anthos config sync repo describe コマンドを使用します。

    $ gcloud alpha anthos config sync repo describe --cluster MEMBERSHIP_NAME \
      --sync-namespace config-management-system  --sync-name root-split
    

    MEMBERSHIP_NAME は、ルート リポジトリが同期される登録済みクラスタのメンバー名に置き換えます。

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

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

    $ gcloud alpha anthos config sync repo describe --cluster MEMBERSHIP_NAME \
     --sync-namespace config-management-system  --sync-name root-sync
    

    MEMBERSHIP_NAME は、登録済みクラスタのメンバー名に置き換えます。

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

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

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

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

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

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

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